Segment Intersecion - 线段交叉


问题

判断两线段是否相交。

解法

对于一条线段和一条直线,若线段两端点在直线的不同两侧则称该线段“跨越”了该直线。根据该公理,线段相交有两种情况:

两条线段,任意一条线段的两个端点都在另一线段所在直线的两侧。即的两端点跨越所在的直线,的两端点也跨越所在直线。如图所示:

SegmentIntersection1.png

SegmentIntersection2.png

对于图的两端点分别在所在直线的两边,且的两端点分别在所在直线的两边,因此相交。

的叉积为的叉积为的叉积为的叉积为。根据Cross中的转向可知,两个叉积的转向相反,一正一负(表示一个方向与方向向量平面中的轴)相同,另一个方向相反),两个叉积的转向相反,一正一负。

对于图的叉积转向相反,但的叉积转向相同,同正同负,因此图2中的两线段不相交。

线段的其中一个端点在线段上,这是一种边界情况,无需考虑的另一个端点的位置,也可以确定相交。如图所示:

SegmentIntersection3.png

在线段上的条件为:两向量方向相同,即两向量的叉积值为;且点坐标在线段范围内。

该算法的时间复杂度为


Introduction to Algorithms


源码

SegmentIntersection.h

SegmentIntersection.cpp

测试

SegmentIntersectionTest.cpp