Geometry 如何确定两个凸多边形是否相交?

Geometry 如何确定两个凸多边形是否相交?,geometry,polygon,convex,Geometry,Polygon,Convex,假设一个平面上有许多凸多边形,可能是一张地图。这些多边形可以相互碰撞并共享一条边,但不能重叠 要测试两个多边形p和Q是否重叠,首先我可以测试p中的每条边,看看它是否与Q中的任何边相交。如果找到一个交点,我声明P和Q相交。如果没有相交,那么我必须测试P完全包含在Q中的情况,反之亦然。接下来是P=Q的情况。最后,有一种情况是,有一些共同的优势,但不是全部。(后两种情况可能被认为是相同的一般情况,但这可能并不重要。) 我有一个算法,可以检测两条线段相交的位置。如果这两段是共线的,就我而言,它们不会被

假设一个平面上有许多凸多边形,可能是一张地图。这些多边形可以相互碰撞并共享一条边,但不能重叠

要测试两个多边形pQ是否重叠,首先我可以测试p中的每条边,看看它是否与Q中的任何边相交。如果找到一个交点,我声明PQ相交。如果没有相交,那么我必须测试P完全包含在Q中的情况,反之亦然。接下来是P=Q的情况。最后,有一种情况是,有一些共同的优势,但不是全部。(后两种情况可能被认为是相同的一般情况,但这可能并不重要。)

我有一个算法,可以检测两条线段相交的位置。如果这两段是共线的,就我而言,它们不会被视为相交

我是否正确列举了这些案例?对这些情况的测试有什么建议吗


请注意,我不是想找到新的凸多边形,即交点,我只是想知道是否存在交点。有许多记录良好的算法可以找到交点,但我不需要做所有的工作。

您的测试用例应该可以工作,因为您正在检查多边形完全不相交的情况(完全在外部或完全在内部),以及存在任何形式的部分相交的情况(如果存在重叠,则边始终相交)

对于测试,我只需确保测试每个可能的组合。我看到上面缺少的一个是共享的单面边,但另一个包含一个多边形。我还将添加一些更复杂的多边形形状的测试,从三面->多面,作为预防措施

另外,如果你有一个完全包围多边形的U形多边形,但没有重叠,我相信你的案例可以处理这个问题,但我也会加上这个作为检查。

  • 如果多边形始终为凸面,请首先计算从多边形中心到中心绘制的直线的角度。然后,您就无需在距离另一个多边形180度的一半多边形中测试边段

  • 要消除边,请从左侧的多边形开始。从多边形中心垂直于上一个项目符号的线段取线段,并接触多边形的两侧。将此线段称为p,顶点为p1和p2。然后,如果x坐标小于p1.x和p2.x T,则将其称为所有顶点帽子顶点可以放在“安全桶”里

  • 如果没有,您必须检查以确保它位于线路的“安全”一侧(只需检查y坐标)

-如果多边形中的线段的所有顶点都位于“安全桶”中,则可以忽略它

-反转极性,使第二个多边形“右向”。

可以使用:

为了确定两个凸多边形是否相交(彼此接触),我们可以使用分离轴定理。本质上:

  • 如果两个凸多边形不相交,则存在一条穿过它们的线
  • 只有当其中一个多边形的一侧形成这样一条线时,这样一条线才存在

第一种说法很简单。因为多边形都是凸的,所以你可以画一条线,一个多边形在一边,另一个多边形在另一边,除非它们相交。第二种说法不那么直观。请看图1。除非多边形的最近边彼此平行,否则它们得到c的点彼此最接近的是一个多边形的角点与另一个多边形的边最接近的点。该边将在多边形之间形成一个分离轴。如果边平行,则它们都是分离轴

那么,这具体如何帮助我们确定多边形A和B是否相交呢?好吧,我们只需检查每个多边形的每一侧,并检查它是否形成一个分离轴。为此,我们将使用一些基本的向量数学,将两个多边形的所有点挤压到一条垂直于潜在分离线的线上(见图2)现在整个问题是一维的。我们可以确定每个多边形的点所在的区域,如果这些区域不重叠,这条线就是一个分离轴

如果在检查两个多边形的每条直线后,没有发现分离轴,则已证明多边形相交,必须对此采取措施


既然altCognito已经给了你一个解决方案,我只想指出你可能感兴趣的地方。

这里有一个想法:

  • 找到每个多边形的中心点

  • 找到每个多边形中最靠近另一个多边形中心点的两点。它们将是凸多边形中的相邻点。这些点定义了每个多边形的最近边,我们称之为点{A,B}和{Y,Z}

  • 找到AB线和YZ线的交点。如果线段相交(AB上的交点位于A和B之间),则多边形相交。如果AB和XY平行,忽略此条件,下一步将解决此问题

  • 还有一种情况需要检查,那就是多边形相交的程度足够大,以至于AB和XY完全相互交叉,实际上不相交。 若要捕获这种情况,请计算AB和XY到每个多边形中心点的垂直距离。如果任一中心点更靠近对面多边形的线段,则多边形重叠严重


有几种方法可以检测交叉点和/或安全壳