一种常用的方法是通过向量叉积来判断的,这种方法不需要算出直线方程,在代码实现上比较简便。 
用这种方法判别线段是否相交一般分为两步: 
1. 快速排斥实验 
2. 跨立实验

快速排斥实验

我们首先判断两条线段在 x 以及 y 坐标的投影是否有重合。 
也就是判断下一个线段中 x 较大的端点是否小于另一个线段中 x 较小的段点,若是,则说明两个线段必然没有交点,同理判断下 y。

python 如何判断两个矩形存在交集 python如何判断两个线段相交_python 如何判断两个矩形存在交集

附上代码:

max(c.x,d.x)<min(a.x,b.x)||max(a.x,b.x)<min(c.x,d.x)||max(c.y,d.y)<min(a.y,b.y)||max(a.y,b.y)<min(c.y,d.y);

如果上面的四条判断有一个为真,则代表两线段必不可交,否则应该进行第二步判断。 
显然,上图通不过快速排斥实验。

跨立实验

通过叉积来判断线段相交

python 如何判断两个矩形存在交集 python如何判断两个线段相交_python 如何判断两个矩形存在交集_02


如果两线段相交那么就意味着它们互相跨立,即如上图点 A 和 B 分别在线段 CD 两侧,点 C 和 D 分别在线 AB 两侧。 

判断 A 点与 B 点是否在线段 DC 的两侧,即向量 A-D 与向量 B-D 分别在向量 C-D 的两端,也就是其叉积是异号的,即 (A−D)×(C−D)∗(B−D)×(C−D)<0(A−D)×(C−D)∗(B−D)×(C−D)<0。 

同时也要证明 C 点与 D 点在线段 AB 的两端,两个同时满足,则表示线段相交。

然后来看看临界情况,也就是上式恰好等于 0 的情况下:

python 如何判断两个矩形存在交集 python如何判断两个线段相交_python 如何判断两个矩形存在交集_03

当出现如上图所示的情况的时候,(A−D)×(C−D)∗(B−D)×(C−D)=0(A−D)×(C−D)∗(B−D)×(C−D)=0,显然,这种情况是相交的。只要将等号直接补上即可。

再接得想一想,如果没有第一步的快速排斥实验,仅判断第二步,会出现什么问题?

python 如何判断两个矩形存在交集 python如何判断两个线段相交_判断线段相交_04

当出现如上所示的情况的时候,叉积都为 0, 可以通过跨立实验,但是两个线段并没有交点。不过还好,这种情况在第一步快速排斥已经被排除了。

附上代码:

bool intersection(point a,point b,point c,point d)
{
    //快速排斥实验
    if(max(c.x,d.x)<min(a.x,b.x)||max(a.x,b.x)<min(c.x,d.x)||max(c.y,d.y)<min(a.y,b.y)||max(a.y,b.y)<min(c.y,d.y)){
        return false;
    }
    //跨立实验
    if(cross(a-d,c-d)*cross(b-d,c-d)>0||cross(d-b,a-b)*cross(c-b,a-b)>0){
        return  false;
    }
    return true;
}