确定多边形交叉和包含

时间:2010-06-10 19:44:17

标签: algorithm math geometry computational-geometry

我有一组简单的(没有洞,没有自交叉)多边形,我需要检查它们是否相互交叉(一个可以完全包含在另一个中;这没关系)。我可以通过简单地检查一个多边形与其他多边形的每个顶点内部来检查这一点。

我还需要确定包含树,它是一组关系,说明哪个多边形包含任何给定的多边形。由于没有多边形可以与任何其他多边形交叉,因此任何包含的多边形都具有唯“下一个更大的”。换句话说,如果A包含B包含C,则A是B的父节点,B是C的父节点,我们不认为A是C的父节点。

问题:如何有效地确定遏制关系并检查非交叉标准?我问这个问题是因为组合算法可能比单独解决每个问题更有效。该算法应该将多边形列表作为输入,由它们的顶点列表给出。它应该产生一个布尔B,表明没有多边形与任何其他多边形相交,如果B =真,则产生一对(P,C)的列表,其中多边形P是子C的父。

这不是作业。这是我正在做的一个爱好项目。

4 个答案:

答案 0 :(得分:9)

首先,您的测试包含的算法不能正确测试交叉点。想象一下这样的两个矩形:

    +--+
 +--+--+--+
 |  |  |  |
 +--+--+--+
    +--+

顶点位于(1,2)(1,3)(4,2)(4,3)和(2,1)(3,1)(2,4)(3,4) - 没有顶点位于任何多边形内,但多边形确实相交。

要测试此类交点,有必要确定是否有任何多边形的相交。为了您的目的,如果边相交但一个多边形不包含在另一个中,那么您知道它们以不允许的方式重叠。

至于确定包容树,一种方法是按面积将多边形从最小到最大排序。如果多边形没有重叠 - 没有包含,那么树中任何多边形的父级都将是列表中第一个包含多边形的多边形。

编辑:哦,另外,我建议写一个快速边界框或边界圆重叠例程,并使用它来避免必须进行所有线交叉和顶点包含测试。如果仍然不够快,你可能想要构建一个四元组或BSP树;这会使事情变得相当复杂,但也会完全消除很多交叉检查。

答案 1 :(得分:8)

通过应用Shamos-Hoey algorithm,可以在O(n*log(n))中确定是否没有多边形相交。根据Shamos-Hoey算法返回的内容,多边形P i 包含多边形P j ,如果any vertex from Pj is inside PiO(n)中为两个多边形完成

答案 2 :(得分:4)

要测试交叉点,您可以使用我的免费软件修剪器库: http://sourceforge.net/projects/polyclipping/

要测试遏制,请首先排除上面的交叉点。 然后使用Clipper再次添加所有多边形 - Clipper.AddPolygon()。然后对多边形执行Union(布尔OR)运算--Clipper.Execute(ctUnion,solution)。如果Clipper.ForceAlternateOrientation属性为true,则Clipper将以顺时针方向返回解外部多边形,并包含逆时针方向的多边形(孔)。然后,应该测试多边形方向并将PointInPolygon从逆时针多边形中的一个顶点应用于其他顺时针多边形。

答案 3 :(得分:1)

有关代码,请参阅gpc