梁友栋-Barsky算法原理

  • 此算法的主要特色

    • 把二维裁剪的问题化成二次一维裁剪问题,而把裁剪问题转化为解一组不等式的问题;

    • 改善了Cohen-Sutherland 的编码算法中全部摒弃的判断只适合于那些仅在窗口同一侧(或左、或右、或上、或下) 线段的不足。

    算法分成一维和二维两部分,前者是后者的基础。

  • 一维裁剪

    • 一维裁剪的本质是求取2条线段的公共部分。

      一维裁剪算法原理示意图

      • 线段P1P2与一维窗口W1W2的位置分布(未列出重端点状况)

    • 设W1W2为一维窗口,P1P2是给定的线段,则P1P2在一维窗口W1W2内的可见部分为:

          S=W1W2∩P1P2

      令w1,w2和x1,x2分别为W1,W2和P1,P2点的坐标,则P1P2至少部分可见的充要条件是:

          max(min(x1,x2), min(w1,w2))≤ min(max(x1,x2), max(w1,w2))

      (假设线段和窗口均从左至右排列,可简写为:max(x1 , w1) ≤ min(x2,w2) )

      • 线段和窗口:左端点中大者≤右端点中小者
         

  • 二维裁剪

    • 二维裁剪算法的本质是如何把二维裁剪的问题化成二次一维裁剪。

      设二维窗口为下列方程所确定:

          x=XL
          x=XR (记XL≤x≤XR的区域为Δx)
          y=YB
          y=YT (记YB≤y≤YT的区域为Δy)
       

      则平面上任意线段P1P2在窗口内的部分为:

          P1P2∩Δx∩Δy

      设通过P1P2的直线与窗口左、右、上、下边界的交点分别为L、R、B、T,则P1P2可见部分亦可表为:

          P1P2∩LR∩BT


       

    • 当直线垂直时

      • xp1=xp2
         

        且XL≤xp1≤XR时,P1P2∩LR∩BT 等价于求P1P2∩BT;
         

    • 当直线平行时

      • yp1=yp2
         

        且YB≤yp1≤YT时,P1P2∩LR∩BT 等价于求P1P2∩LR;
         

    • 线段P1P2既不平行于窗口垂直边界,也不平行于窗口水平边界时

      • 当xp1≠xp2,且yp1≠yp2

        • L、R、B、T都是确定的
           

        • P1P2的斜率k=( yp2-yp1)/ ( xp2-xp1)为非零或非奇异值。

              xB= xp1 +(YB- yp1)/k;
              xT= xp1 +(YT- yp1)/k;

          且  xB <xT,当k>0;
              xT <xB,当k<0。


            X1= max(xL,min(xp1,xp2))
            X2= min(xR,max(xp1,xp2))

        则P1P2∩LR为非空集合的充要条件是:

            X1≤X2(按照:max(x1 , w1) ≤ min(x2,w2))

        此时线段P1P2与窗口在X轴方向的公共部分就是:

            [X1,X2]

        而P1P2∩LR∩BT为非空集合的充要条件为:

            max(X1, min(xB , xT))≤min(X2, max(xB , xT))
         

      • 它等价于下列三个不等式
         

        • X1≤X2
          X1≤max(xB , xT)
          min(xB , xT)≤X2
           

      • 三个不等式又等价于如下两组不等式

        • X1≤X2 (1)          X1≤X2
          X1≤xT (2) (k>0)   X1≤xB(k<0)
          xB≤X2 (3)          xT≤X2
           

      • 当上述两组不等式中有任何一个不满足时,线段和窗口不可能有公共部分。
         

      • 试观察上述三个不等式的几何意义
         

        • 设k>0
           

        • 式(1)X1>X2
           

          • P1P2∩LR的交集为空,即P1P2∩Δx为空,

            此时P1P2,或在窗口左边界x=XL的左侧,或在窗口右边界x=XR的右侧


             

        • 式(2)X1>xT

          • 此式意味着max(xL,min(xp1,xp2))>xT

            它相当于:xL>xT,或min(xp1,xp2)>xT

            k>0时,当xL>xT ,通过P1P2的直线与窗口上边界的交点T(xT)在窗口左边界的左侧,如a所示

            而min(xp1,xp2)>xT等价于:xp1>xT,或xp2>xT,表示线段P1P2在窗口上边界的上方,如b所示
             

        • 式(3)xB>X2

          • 同理可知xB>X2表示直线穿越窗口下边边界y=YB和右边边界x=XR (图中c),或是P1P2在y=YB的下方(图中d)


             

        • 当k<0时

          • 当k<0时,线段与窗口的位置也有对应的4种情况

            这个方法增加了跨越三个区域的直线段(a和c状态)的快速拒绝判定。

            这些状态用Sutherland的编码法是不能一次予以解决的(它只能快速拒绝判定b和d)。


             

  • 二维裁剪算法的实施

    • 当上述三个条件不全满足,那么线段P1P2至少是部分在窗口内部。此时,若k>0,则可见部分的端点为:

      当k<0时,只要交换YB和YT,表中所列结论均适用。

 

转自: http://cg.sjtu.edu.cn/lecture_site/chap3/mainframe312.htm#1
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值