考虑以下问题:
给定平面中的N个点和连接它们的M个线段,找到内部不包含任何其他多边形的所有多边形(凸面或凹面)。
成立了5个多边形:
1 - 2 - 5 - 6
2 - 3 - 5
3 - 4 - 5
7 - 8 - 9
10 - 13 - 20 - 12 - 11
如何识别这些多边形以及相应的顶点和边缘?什么是最快的解决方案?
答案 0 :(得分:1)
构建图表,其中段结尾为顶点,段为边,然后使用DFS查找周期。
请注意,相同的边可能属于多个周期(多边形),例如2-5
,并且可能有许多变体可供选择周期。要排除歧义,您可以构建fundamental set of cycles
编辑。正如韦斯顿在评论中所注意到的,结果多边形可能包含其他多边形。所以更多几何方法的草图:
建立图表的邻接列表
按极角对列表中的边缘进行排序
选择最底部的顶点A.
如果它的度数为0,则删除顶点,如果为1,则删除顶点和边缘
否则从该顶点获得具有最小角度的边E.
步行以配对顶点B.
从B中选择最左边的边缘。
沿F边移动到C.
如果是死胡同,则删除F和顶点C并返回B.
使用左手规则重复移动,直到遇到顶点A或死角顶点 在步行过程中,删除从2度顶点传出的边缘或将其标记为已使用。