确定多边形是否有孔?

时间:2011-07-24 06:36:43

标签: 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)

我如何知道它是否是一个简单的多边形,例如:

enter image description here

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

enter image description here

我问,因为我必须使用的数据有可能是带孔的多边形,但我事先并不知道它是如此。

注意:多边形将从不复杂。我只需要知道多边形外部的顶点何时结束,以及构成孔的顶点何时开始。

4 个答案:

答案 0 :(得分:5)

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

在您的示例中,另一个图形布局将是,例如,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)。如果有一个洞,将会有两个或更多这样的组,这些组不能再组合在一起。然后,您可以找出哪些点位于被其他点包围的区域内,以了解孔的位置。

答案 1 :(得分:2)

找出if two non-adjacent line segments intersect,你会发现洞和多边形之间的分裂。是的,这个算法是O(n 2 ),但是一点预知可以帮助减少测试次数。

答案 2 :(得分:1)

我对评论的评论声誉太低,但我想说我强烈建议遵循有关漏洞的数学惯例。外部多边形应逆时针方向,孔应始终顺时针方向。 MATLAB以相反的顺序执行此操作,但这适用于多边形(顺时针)和孔(逆时针)

答案 3 :(得分:0)

您可以从一个圆圈“ B”中选择一个点,并判断所选点是在另一个圆圈“ A”之内还是之外。如果是的话,那么你就知道了。如果不是,则从圆A中选择一个点,然后判断该点是否在圆B内,如果是,则得到孔。