判断两线段是否相交
矢量叉积
设矢量 P = (x1, y1), Q = (x2, y2),则 P × Q = x1 * y2 - x2 * y1; 其结果是一个由 (0, 0), P, Q, P + Q 所组成的平行四边形的 带符号的面积
叉积的性质:
P × Q = -(Q × P)
P × (- Q) = -(P × Q)
叉积的一个非常重要的性质是可以通过它的符号来判断两矢量相互之间的顺逆时针关系:
若 P × Q > 0,则 P 在 Q 的顺时针方向
若 P × Q < 0, 则 P 在 Q 的逆时针方向
若 P × Q = 0,则 P 与 Q 共线,但不确定 P, Q 的方向是否相同
快速排斥实验
判断以两条线段为对角线的规则放置的矩形是否相交,若相交,则两线段可能相交,若不相交,则两线段一定不相交
(max(x1,x2) ≥ min(x3,x4)) && (max(x3,x4) ≥ min(x1,x2)) && (max(y1,y2) ≥ min(y3,y4)) && (max(y3,y4) ≥ min(y1,y2))
两个矩形相交必须在两个方向上都相交,式子的前半部分判断在x 方向上是否相交,后半部分判断在y 方向上是否相交。
跨立实验
若 P1P2 跨立 Q1Q2,则 P1,P2 分别在 Q1Q2 所在直线的两端,则有
(P1 - Q1) X (Q2 - Q1) * (P2 - Q1) X (Q2 - Q1) < 0
当 (P1 - Q1) X (Q2 - Q1) = 0 时,说明 (P1 - Q1) 与 (Q2 - Q1) 共线,但由于已经经过快速排斥试验,所以 Q1 必为 P1P2 与 Q1Q2 的交点,依然满足线段相交的条件,则跨立试验可改为:
(P1 - Q1) X (Q2 - Q1) * (P2 - Q1) X (Q2 - Q1) <= 0
当 P1P2 跨立 Q1Q2, Q1Q2 也跨立 P1P2 的时候,则 P1P2Q1Q2 相交