在边/顶点列表中查找所有非重叠多边形

时间:2011-08-29 21:46:23

标签: algorithm polygon computational-geometry edge-detection vertex

我有一个边列表和一个顶点列表。每个边引用两个顶点,每个顶点保持一个边列表。

我想找到从该图中生成的所有非重叠多边形。

一个例子是

0,0)(4,0)(4,2)(4,4)(2,4)(2,2)(4,2)(6,2)(6,6)(0, 6)(0,0)

此路径应描述每个唯一边缘,并在某些顶点上发生碰撞。在实际图中,顶点是不同的。我需要的两个多边形是(0,0)(4,0)(4,2)(2,2)(2,4)(4,4)(4,2)(6,2) (6,6)(0,6)和(2,2)(2,4)(4,4)(4,2)

2 个答案:

答案 0 :(得分:2)

您所描述的是在图中找到所有最小电路的问题。 (我认为碰巧有一个几何模型是无关紧要的。)有一篇文章here用于寻找最小的电路。你可以通过删除最小电路的边缘并再次运行算法来构建它。

对于有向图的情况,this thread中也讨论了这个问题。您可以通过制作每个边的副本并将顶点反转,然后按照指示对其进行处理,将图形转换为有向图。唯一的问题是每个多边形将被发现两次,每个遍历方向一次。您可以通过后处理步骤或在算法运行时通过一些聪明的簿记来清理它。

答案 1 :(得分:1)

好吧,我在想......

特别感兴趣的唯一顶点是具有两个以上边的顶点。要查找具有两个以上边的所有顶点是O(n)。然后找到最紧密的闭环与找到给定边缘和给定顶点处的另一边缘之间的最小θ相同(如果顶点是ccw,则这是从当前边缘顺时针的最小角度)。为了找到所有最紧密的闭环,我需要检查边缘计数大于2的顶点处的所有边缘ccw边缘对。这是跟踪的初始化。从那时起,迹线将始终选择顺时针最小θ的下一个边缘。返回路径后,我将移动到根顶点中的下一个边对,并再次移动到路径。检查完所有对后,我移动到边缘计数大于2的下一个顶点。现在,如果我只能确定我是否落入已知循环而不是跟踪。也许如果路径的前两个顶点在已知多边形中以相同的顺序出现...

听起来怎么样?我知道这不是djikstra,但它会起作用,并且希望比找到所有循环蛮力更快。

相关问题