梁友栋-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既不平行于窗口垂直边界,也不平行于窗口水平边界时
-
-
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
-
-
P1P2∩LR的交集为空,即P1P2∩Δx为空,
此时P1P2, 或在窗口左边界x=XL的左侧,或在窗口右边界x=XR的右侧
-
-
-
此式意味着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所示
-
-
-
同理可知xB>X2表示直线穿越窗口下边边界y=YB和右边边界x=XR (图中c),或是P1P2在y=YB的下方(图中d)
-
-
-
当k<0时,线段与窗口的位置也有对应的4种情况
这个方法增加了跨越三个区域的直线段(a和c状态)的快速拒绝判定。
这些状态用Sutherland的编码法是不能一次予以解决的(它只能快速拒绝判定b和d)。
-
-
-
-
-
-
当上述三个条件不全满足,那么线段P1P2至少是部分在窗口内部。此时,若k>0,则可见部分的端点为:
当k<0时,只要交换YB和YT,表中所列结论均适用。
-