如何判断2条线段是否相交(编程实现)?

来源:互联网 发布:长兴人民法院淘宝拍卖 编辑:程序博客网 时间:2024/06/06 19:50

我们在编程中有时可能会碰到一些问题,比如怎么判断2条线段是否相交,最常规的一种思路可能就是解方程,看是否有交点,但这种方法用代码实现感觉稍显复杂,时间复杂度大,且控制条件多,很容易出错,那我们有没有更简单的方法呢?

我们在大约高中的时候应该都学过向量的叉积,2个向量做叉积,比如a向量 叉乘 b向量, 大小为|a||b|*sin(theta), 方向遵循右手定则,用右手4根指头从a向量指向b向量,则右手大拇指的方向即为叉积结果的方向
线段AB和CD相交
由上图,若线段AB和CD相交,连接AC,BC,AD,BD,那么 AC向量叉乘AB向量的结果的方向垂直于纸面(屏幕)向外(设为向量a), AB向量叉乘AD向量的结果的方向垂直于纸面向外(设为向量b), 那么向量a*b结果大于0,设该结果为res1.

线段AB,CD不相交的情况
如上图,若线段AB和CD相交,连接AC,BC,AD,BD,那么 AC向量叉乘AB向量的结果的方向垂直于纸面(屏幕)向外(设为向量a), AB向量叉乘AD向量的结果的方向垂直于纸面向里(设为向量b), 那么向量a*b结果小于0,设该结果为res2.

 那么如果线段AB和CD相交,则res1*res2>0,  若不想交,则res1*res2<0. 那么如何计算叉积呢?  

叉积
上面这个图是三维的向量,若为二维的向量,就把第3列去掉即可,这其实就是一个简单的求行列式的问题了,就不用多介绍了。

至此,判断2条线段是否相交的思路以及很清晰了。 首先,我们可以简单的用一下边界条件,如果某线段的横(纵)坐标的最小值大于另一条线段的横纵坐标的最大值,或反之,则肯定不相交,如果满足上述条件,则使用上述方法计算叉积,若2个叉积结果大于0,则相交,否则,不想交。这样代码就so easy了,就不用我写出来啦~