Math 确定多边形是否有孔?

Math 确定多边形是否有孔?,math,graphics,polygon,triangulation,Math,Graphics,Polygon,Triangulation,在尝试了一些三角测量工作后,我遇到了如何确定多边形是否有洞的问题 我知道如何处理已知的孔,但不确定如何确定是否存在 示例: 给定以下顶点: 0 ( 0, 0) 1 ( 0,20) 2 (20,20) 3 ( 0,20) 4 ( 2, 2) 5 ( 6, 2) 6 ( 6, 6) 7 ( 2, 6) 我如何知道它是否是一个简单的多边形,例如: 或非简单/复杂多边形,如: 我这样问是因为我将要处理的数据有可能是一个有洞的多边形,但我事先不知道它是这样的 注意:多边形永远不会是复杂的。我只需要知

在尝试了一些三角测量工作后,我遇到了如何确定多边形是否有洞的问题

我知道如何处理已知的孔,但不确定如何确定是否存在

示例:

给定以下顶点:

0 ( 0, 0)
1 ( 0,20)
2 (20,20)
3 ( 0,20)
4 ( 2, 2)
5 ( 6, 2)
6 ( 6, 6)
7 ( 2, 6)
我如何知道它是否是一个简单的多边形,例如:

或非简单/复杂多边形,如:

我这样问是因为我将要处理的数据有可能是一个有洞的多边形,但我事先不知道它是这样的


注意:多边形永远不会是复杂的。我只需要知道多边形外部的顶点何时结束,构成孔的顶点何时开始。

算出,你会发现孔和多边形之间的裂痕。是的,这个算法是O(n2),但是一点先知先觉可以帮助减少测试的次数。

仅从顶点无法推断多边形边的布局。您还需要保留边(例如,作为顶点对)

例如,在您的示例中,另一个图形布局是0-1-5-6-2-3-7-4-0,其中生成的多边形根本不包含孔


如果有边,可以将它们对齐以形成圆,即将具有公共第二/第一元素的边分组在一起:(0,1)、(1,2)、(2,3)、(3,0)和(4,5)、(5,6)、(6,7)、(7,4)。如果有一个洞,将有两个或更多这样的组,不能再组合在一起。然后,您可以找出哪些点位于其他点所包围的区域内,以了解孔的位置。

我的声誉太低,无法对答案发表评论,但我想说的是,我强烈建议遵循有关孔的数学惯例。外部多边形应为逆时针方向,孔应始终为顺时针方向。MATLAB按相反的顺序执行此操作,但对于多边形(顺时针)和孔(逆时针)

您可以从一个圆“B”中选择一个点,并判断所选点是在另一个圆“a”的内部还是外部。如果是,那么你得到了这个洞。如果不在,则从圆a中选择一个点,并判断该点是否在圆B内,如果在圆B内,则获得孔

这只有在他有一组多边形线段的情况下才有帮助。这确实假设相邻顶点形成边,这并没有那个么大的拉伸。相邻顶点到底是什么?据我所知,顶点的邻接是通过边建立的。。。如果你对邻接的定义是“靠得很近的点”,那么绿色的多边形永远不会形成(因为4比任何其他点都更接近0,所以会有一条边(0,4)。@Felix:如果你看这个问题,你会注意到提问者已经将顶点编号为0到7。相邻顶点可能是索引相差1的顶点,或者是序列中的最后一个和第一个顶点。在这种情况下,将有一条边(3,4)这在示例中不存在……如果只需要检测多边形何时闭合,不仅仅是检查点是否已出现的问题?当线段在起点和终点连接时,多边形将闭合。也就是说,你从一点开始画线,然后在同一点结束。嗯,我没有意识到这一点。我以后会记住这一点!你对这个问题有进一步的了解吗?这是基本的数学,许多定理都是基于这个事实。有几种非常简单的方法可以利用孔具有另一个方向这一事实来确定曲线是孔还是外边界。在维基百科上搜索“曲线方向”。例如,要确定多边形是孔还是另一个相邻多边形,可以对每对相邻节点跨越的面积求和。如果和为正,则有一个外边界,负和表示它是一个孔。您还可以对顶点进行矢量化,并对其叉积求和,如(·中所述。