0.补充知识
向量点积:结果等于0, 两向量垂直; 结果大于0, 两向量夹角小于90度; 结果小于0, 两向量夹角大于90度.
直线的参数方程:(x1, y1)和(x2, y2)两点确定的直线, 其参数方程为x = x1+u(x2-x2); y = y1+u(y2-y1)
1.前言
Liang-Barsky算法是 Cyrus-Beck 算法的特例, 我们先来简单的了解Cyrus-Beck算法, Cyrus-Beck算法本质是每次通过裁剪窗口(任意凸多边形, 文章最后会说明为什么凹多边形不行)的一条边界来确定待裁剪线段的哪部分应当被留下, 最后, 对所有应该被留下的部分取交集, 便可以求得线段应当留下的部分.举个例子, 假设多边形ABCDE, 那么我们每次使用一条边(AB, BC, …), 延长这条边和待裁剪的线段, 那么最后两条直线必定相交或平行, 如果相交, 根据交点确定哪部分被留下, 如果平行, 根据坐标确定哪部分被留下. 而Liang-Barsky算法只是将这个裁剪窗口固定为了一个平行于坐标轴的矩形, 所以Liang-Barsky算法和Cyrus-Beck算法本质是一样的, 只是Liang-Barskys算法因为拥有更多信息(裁剪窗口是一个平行与坐标轴的矩形), 可以对其中一些步骤进行简化处理.
2.对于一条边界, 具体如何确定线段应当留下的部分?
2.1符号说明
AB:边界直线, 把整个平面划分为两部分, 我们约定向量AH所在区域称为内部区域, 另一部分称为外部区域
AH:边界直线的法向量, AH=(1,0)
CD:待裁剪线段,C(x1, y1), D(x2, y2),CD的向量表示为 (x1+u(x2-x1), y1+u(y2-y1))(0<=u<=1)
E,F,G:待裁剪线段上三点
2.2判定方法
向量AH*向量AG, 结果大于0, H点处于内部区域
向量AH*向量AF, 结果等于于0, F点位于边界上
向量AH*向量AE, 结果小于0, E点处于外部区域
所以, 通过AX(X为线段CD上任意一点)与法向量AH的乘积即可判定X点位于内部区域还是外部区域
3.对于任意凸多边形边界, 如何确定线段应当留下的部分?
任意凸多边形边界和直线边界没有本质区别, 如果对于矩形上的所有边, 点X都满足属于这条边的内部区域, 那么X就在矩形的内部区域.(比如图中的IG部分)
4.Liang-Barsky的算法流程以及算法中的p和q