此算法 就是Cyrus-Beck裁剪算法
1.判断dx,dy是否为零作相应的简单处理,并返回
2.下面通过例子说明第2步的原理,现在先给出原理
如果P1P2与裁剪区域有交点,那么P1P2与裁剪区域存在交集,使得交集中的任一元素t同时满足下列不等式
xmin <= x1 + dx*t <= xmax (1)
ymin <= y1 + dy*t <= ymax (2)
其中,dx = x2 - x1, dy = y2 - y1,若(1)∩(2)= 空集 则说明t不能同时满足方程(1),(2),
亦即P1P2不需要被裁剪
为什么“如果P1P2与裁剪区域有交点,那么P1P2与裁剪区域存在交集,使得交集中的任一元素t同时满足下列不等式”?
答:根据直线参数方程P = P1 + DP*t ,P表示直线段P1P2上的任一点,因此如果P满足不等式(1),(2)就说明P在P1P2上且在裁剪区域内。
又∵0<= t <= 1,因此可以得到新的不等式方程组
(xmin - x)/dx <= t <= (xmax - x1)/dx (3)
(ymin - y1)/dy <= t <= (ymax - y1)/dy (4)
0<=t<=1 (5)
如图,p1(x1,y1), p2(x2,y2)
x1 = 2 x2 = 7
y1 = -2 y2 = 2
裁剪区域为:
xmin = -4, ymin = -4
xmax = 6, ymax = 4
(xmin - x)/dx = (-4 - 2) / (7 - 2) = - 6/5
(xmax - x1)/dx = (6 - 2 ) / 5 = 4 / 5
(ymin - y1)/dy = (-4 - 2)/(2 - (-2)) = -2 /4 = -1/2
(ymax - y1)/dy = (4 - (-2))/4 = 3 / 2
代入不等式组得
-6/5 <= t <= 4/5
-1/2 <= t <= 3/2
0 <= t <= 1
解不等式方程组得
0 <= t <= 4/5
令t1 = 0, t2 = 4/5,则t1, t2是P1P2被裁剪后的两个点P1',P2'对应的两个t值
因为t1 = 0,又根据直线的参数方程P = P1 + DP*t ,得P1' = P1 + DP*0 = P1
x2' = x1 + dx*t2 = 2 + 5*4 / 5 = 6
y2' = y1 + dy*t2 = -2 + 4*4 / 5 = 1.2
则p2' = (6,1.2)
P1'(2, - 2), P2'(6,1.2)就是P1P2被裁剪区域裁剪后的两个点
因为P1在裁剪区域内,所以P1' = P1是合理的