Liang-Barsky直线裁剪算法简介
Liang-Barsky算法由浙江大学的梁友栋与加州大学伯克利分校的BrianA. Barsky共同提出。该算法采用直线参数方程和不等式,以确定裁剪框与直线间的交点。
1. 在执行交点计算之前,Liang-Barsky算法会首先对线段进行足够的检测以保证其有必要进行裁剪。对直线上点的位置进行定义;其中(x0, y0)为直线始点,(x1, y1)为直线末点:
x = x0 + u(x1 - x0) = x0 + u*dx;
y = y0 + u(y1 - y0) = y0 + u*dy;
定义裁剪框:
Xmin, Xmax, Ymin, Ymax
点在裁剪框内的条件:
u*Pk <= Qk, k = 1, 2, 3, 4
其中:
p1 = -dX, q1 = x0 - Xmin (left)
p2 = dX, q2 = Xmax - x0 (right)
p3 = -dY, q3 = y0 - Ymin (bottom)
p4 = dY, q4 = Ymax - y0 (top)
2. 交点求解过程:
2.1. 判断某条线段是否平行,既两个点的x或y值是否相等:
· 若相等,则计算该x或y值是否在窗口的对应范围内:
o 若在该窗口范围内,则计算两个交点并返回其值;
o 若不在该裁剪窗口范围内,则继续执行;
· 若不等,直接继续执行;
2.2. 对于的情况,交点坐标所对应的U值应表示为u = qk / pk;
2.3. 当pk < 0时,对于该边缘,此线段由裁剪区外至裁剪区里方向伸展;否则由里至外伸展
2.4. 分别求解裁剪所需的两个交点u1,u2:
· 分别计算(x0, y0)点相对于四条边的u值:
o 若对于某条边,(x0, y0)点之pk < 0,则u1取值为max(0, qk / pk);
o 若对于某条边,(x0, y0)点之pk > 0,则u2取值为min(1, qk / pk);
o 对于以上的k值,
· 若u1 > u2,则说明该线段在裁剪区域之外,停止裁剪;否则由参数方程得出由u1至u2的裁剪后直线。