任务描述:
Liang-Barsky参数化裁剪算法是计算机图形学领域一个经典算法,用来对二维直线进行快速裁剪,使得仅需要绘制直线段落在裁剪窗口中的部分,不显示裁剪窗口之外的内容。
算法原理:
如上图,点p1(x1,y1)、p2(x2,y2)确定一条直线段,其与矩形裁剪窗口(左右边界x坐标左右分别为xL和xR,上下边界y坐标分别为yB和yT)四个边的交点分别为A、B、C、D,在A、B、p1这三个点中选择参数最大(距离终点p2最近)的一个点(即B),从C、D、p2这三个点中选择参数最小(距离起点p1最近)的一个点(即C),这两点之间的线段BC即为最终可见部分。
在该算法中,使用下面的参数方程表示直线p1p2,
x = x1 + t×dx
y = y1 + t×dy
其中,dx = x2 - x1,dy = y2 - y1,t∈[0,1]。
直线p1p2与裁剪窗口左、右、下、上四条边界的交点参数计算公式为,
左边界参数:t1 = (x1-xL) / -dx
右边界参数:t2 = (xR-x1) / dx
下边界参数:t3 = (y1-yB) / -dy
上边界参数:t4 = (yT-y1) / dy
在上面四个公式中,分母小于0时计算得到的参数距离直线段起点更近,分母大于0时计算得到的参数距离直线段终点更近,分母等于0时直线段与裁剪窗口平行需要单独计算。
以上图为例,有dx>0且dy<0,所以t1(点A)和t4(点B)是距离直线段起点p1更近的两个参数,已知起点p1对应的参数为0,所以最终可见部分线段的起点参数为max(0, t1, t4),得到点B。同理,t2(点C)和t3(点D)是距离直线段终点p2最近的两个参数,已知终点p2对应的参数为1,所以最终可见部分的终点参数为min(1, t2, t3),得到点C。于是,直线段p1p2落在裁剪窗口中的部分为线段BC。
参考代码: