在尝试了一些三角测量工作后,我遇到了如何确定多边形是否有孔的问题?
我知道如何处理一个已知的洞,但我不确定如何确定是否存在。
示例:
给出以下顶点:
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 :(得分: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内,如果是,则得到孔。