Algorithm 多边形相交和包容的确定

Algorithm 多边形相交和包容的确定,algorithm,math,geometry,computational-geometry,Algorithm,Math,Geometry,Computational Geometry,我有一组简单的(没有洞,没有自相交)多边形,我需要检查它们是否彼此不相交(一个可以完全包含在另一个中;这没关系)。我可以通过简单地检查一个多边形相对于其他多边形的逐顶点内部粗糙度来检查这一点 我还需要确定包容树,这是一组关系,表示哪个多边形包含任何给定的多边形。因为没有多边形可以与其他多边形相交,所以包含的任何多边形都有一个唯一的容器;“下一个更大”的。换句话说,如果A包含B包含C,那么A是B的父,B是C的父,并且我们不考虑C.< /P>的父。 问题:如何有效地确定包容关系并检查非相交标准?我把

我有一组简单的(没有洞,没有自相交)多边形,我需要检查它们是否彼此不相交(一个可以完全包含在另一个中;这没关系)。我可以通过简单地检查一个多边形相对于其他多边形的逐顶点内部粗糙度来检查这一点

我还需要确定包容树,这是一组关系,表示哪个多边形包含任何给定的多边形。因为没有多边形可以与其他多边形相交,所以包含的任何多边形都有一个唯一的容器;“下一个更大”的。换句话说,如果A包含B包含C,那么A是B的父,B是C的父,并且我们不考虑C.< /P>的父。 问题:如何有效地确定包容关系并检查非相交标准?我把这个问题作为一个问题来问,因为也许组合算法比单独解决每个问题更有效。该算法应采用多边形列表作为输入,该列表由多边形的顶点列表给出。它应该生成一个布尔值B,指示所有多边形是否与任何其他多边形相交,如果B=true,还应该生成一个对列表(P,C),其中多边形P是子C的父级


这不是家庭作业。这是我的一个爱好项目。

首先,您的包容测试算法无法正确测试交叉点。想象两个这样的矩形:

    +--+
 +--+--+--+
 |  |  |  |
 +--+--+--+
    +--+
顶点将位于(1,2)(1,3)(4,2)(4,3)和(2,1)(3,1)(2,4)(3,4)——没有顶点位于任何多边形内,但多边形实际上相交

要测试这种相交,必须确定多边形的任何边是否相交。出于您的目的,如果边相交但一个多边形不包含在另一个多边形中,则您知道它们以不允许的方式重叠

至于确定包容树,一种方法是按面积从最小到最大对多边形进行排序。如果多边形在没有包含的情况下不重叠,则树中任何多边形的父级都将是列表中位于它之后的第一个包含多边形


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

通过应用。根据Shamos-Hoey算法返回的结果,多边形Pi包含多边形Pj,如果这是在两个多边形的
O(n)
中完成的。

有关代码,请参阅。

要测试交点,您可以使用我的免费软件clipper库:

为了测试安全壳,首先排除上述交叉点。
然后再次使用Clipper添加所有多边形-Clipper.AddPolygon()。然后在polygons-Clipper.Execute(ctUnion,solution)上执行并集(布尔或)操作。如果Clipper.ForceAlternateOrientation属性为true,则Clipper将以顺时针方向返回解决方案中的外部多边形,并以逆时针方向返回包含的多边形(孔)。然后,只需测试多边形方向,并从逆时针多边形中的一个顶点对另一个顺时针多边形应用PointInPolygon即可。

假设有大小为1、…、5的多边形,假设1在3内,3在5内,2在4内。然后3在列表中位于2之后,但不一定包含它。对,但是包容树中多边形的父级将是列表中多边形之后的第一个包含多边形。因为3不包含2,所以它在树中不相关。但是,即使5包含一个,它在树中也不是直接连接的,而是3的父级,3是1的父级。