两条线段相交当且仅当下面两个条件至少成立一个:
1.每条线段都跨越了包含另一条线段的直线。
2.一条线段的某个端点落在了另一条线段上。(这一情况来自于边界情况)
在判断线段的相交时我们可以利用向量的叉积。当两条向量在一条直线上时,向量的叉积等于 0 ,即上面的第二种情况,所以判断两条线段相交就分为两种情况讨论:1.向量的叉积不等于 0 ;2.向量的叉积等于 0 。
一.叉积不等于 0
首先:我们要判断点 p3,p4 分布在线段 p1 p2 两边。如下图所示:
① 根据向量的叉积,如果 p1p4 * p1p2 > 0 则表示向量 p1p2 在向量 p1p4 的逆时针方向,根据 p1p2 * p1p3 > 0,可以判断 p1p3 在 p1p2 的逆时针方向。这时就可以判断点p3,p4 在线段 p1p2 的两端。
② 同理,我们可以判断 p1,p2 分布在线段 p3 p4 的两端。
如果同时满足①,② 成立,则这两个线段就相交
二.叉积等于 0
当叉积等于 0 的时候,只需要判断这三个点是否在同一条直线上就可以了。
java 代码如下: