本质上看,Liang-Barsky二维裁剪算法,是一种特殊形式的Cyrus-Beck算法。同属于参数裁剪算法。
Liang-Barsky算法适用于任意的凸二维和三维裁剪区域,单通常只讨论与坐标轴平行的矩形裁剪区域,即规则的方正的裁剪区域。
如上图:
P1(X1, Y1), P2(X2, Y2) 分别是线段的两个端点。
Xl,Xr,Yb,Yu分别代表裁剪窗口的 左, 右, 下, 上边界。
则线段的方程可以表示为: P(t)= P1 + (P2-P1)*t, 其中,0<=t <=1,是参数t的范围。
1. liang-basky算法原理
(1)两个不等式:
Xl <= X(t) <= Xr; Yd <= Y(t) <= Yu;
(2)在X,Y两个方向分量等式
X(t) = X1 + (X2 - X1)*t; 0<=t <=1,
Y(t) = Y1 + (Y2 - Y1)*t; 0<=t <=1,
令:Dx = (X2 - X1), Dy = (Y2 - Y1)
下面仅以Y方向为例做推导,X分量原理相同:
(3)推导
Y分量等式带入Y分量不等式:
-Dy*t >= Y1 - Yb;
Dy*t <= Yu - Y1.
因为在裁剪窗口边界,分别把平面空间相对划分成两个区域:【1】裁剪空间内部 ,【2】裁剪空间外部。以Yu为例,在Yu之上是裁剪平面外部,在Yu下是裁剪空间内。利用这样的不等式可以确定线段与裁剪空间的位置关系。
即:
Y1 - Yb < 0 则 P1在 Yb的下部(不在相应边裁剪空间内);
Yu - Y1 < 0 则 P1在Yu的上部(不在相应边裁剪空间内);同理Xr 与Xl的位置关系。
这也可以认为是编码裁剪算法的另一种区域划分办法。
则 “等式右边” >= 0 则可以视为相应的裁剪边界的内部或者边界上。
特殊情况:
【1】 如果 “等式右边” = 0 , 则则说明当前线段在当前边界上, 如果 Dy = 0 则说明在线段与当前边界平行。
【2】 如果Dy=0,且 “等式右边” < 0则说明,则说明,线段与边界平行,且在裁剪空间外部, 抛弃。
如果线段与裁剪线有"交点",把不等式可以写成: dt = q;
则 t = q/ d。
如果线段与边界不平行,在参数定义域: 0 <= t <= 1 则线段P1P2与裁剪边界有交点,其交点不一定2个。
可以通过将参数值分为上限组,和下限组分别求取参数的最大值tu,与最小值tl即可获取正确的交点参数值。
【3】上下线划分依据:
q >= 0 且 d < 0 则说明在Y分量下边界线处理,需要寻找此情况下的t的最大上限,且排除 t > tu 的t值。
q >= 0 且 d > 0 则说明在Y分量上边界线处理,需要寻找此情况下的t的最小下线,且排除 t < tl 的t值。
(4)分别每条边做如上处理,即可获得参数t的交点参数值。
2. 程序如下
原文:http://www.cnblogs.com/icmzn/p/5076838.html