我有一个检测两条线段相交的算法。如果这两个线段共线,则对于我的目的,它们不被视为相交。
我正确列出了这些情况吗?有关于如何测试这些情况的建议吗?
请注意,我不想找到新的凸多边形即交集,我只想知道是否存在交集。有很多文档良好的算法可用于查找交集,但我不需要进行所有的努力。
如果多边形总是凸的,首先计算从多边形中心到另一个多边形中心的线段的角度。这样你就可以消除需要测试在另一半180度之外的边缘段的多边形的需求。
为了消除边缘,从左侧开始处理多边形。取从多边形中心垂直于上一个步骤中的线段并触及多边形两侧的线段,称此线段为p,其顶点为p1和p2。然后,对于所有顶点,如果x坐标小于p1.x和p2.x,则该顶点可以放入“安全桶”中。
如果不是,则必须检查以确保它位于线段的“安全”一侧(也只需检查y坐标)
-如果多边形中的线段所有顶点都在“安全桶”中,则可以忽略它。
-反转极性,以使第二个多边形为“正确方向”。
既然altCognito已经给出了解决方案,那我只想提醒你一下计算几何领域一本很棒的书,也许这会引起你的兴趣。
你的测试用例应该是有效的,因为你检查了多边形完全不相交的情况(完全在外面或完全在里面),以及任何形式的部分相交(如果有重叠,则边缘总是相交)。
对于测试,我会确保测试每个潜在的组合。从我看到的内容中缺少的一个是共享单个边缘,但其中一个多边形包含在另一个多边形中。我还会添加一些更复杂的多边形形状的测试,从三边形到多边形,只是作为预防措施。
此外,如果你有一个U形多边形完全包围多边形,但没有重叠,我相信你的情况会处理它,但我也会将其作为检查添加进来。
这里有一个想法:
找到每个多边形的中心点
找到每个多边形最靠近另一个多边形中心点的两个点。它们将是凸多边形中相邻的点。这些定义了每个多边形的最近边缘,我们称之为点 {A, B} 和 {Y, Z}
找到线段 AB 和 YZ 的交点。如果线段相交(AB 上的交点位于 A 和 B 之间),则您的多边形相交。如果 AB 和 XY 平行,则忽略此条件,下一步将捕获问题。
还有一种情况需要检查,即当多边形相交得足够严重时,AB 和 XY 完全超过彼此并且实际上不相交。 为了捕获这种情况,请计算 AB 和 XY 到每个多边形中心点的垂直距离。如果任何一个中心点更靠近相反多边形的线段,则您的多边形重叠严重。