边缘列表中的多边形

时间:2016-01-12 22:27:56

标签: algorithm geometry computational-geometry voronoi

在边N的地图中给出Map<Point, List<Edge>>点,可以在O(N log N)中获取由这些边形成的多边形吗?

我所知道的是,您必须遍历所有顶点并将包含该顶点的边作为起点。这些是voronoi图的边缘,每个顶点最多包含3个包含它的艺术家。因此,在地图中,键是顶点,值是顶点是起始节点的列表。

例如:

积分a,b,c,d,e,f,g

边缘[a,b]; [a,c]; [a,d], [b,c], [d,e], [e,g], [g,f]

我的想法是逆时针迭代地图,直到我得到初始顶点。那是一个多边形,然后我将它放在多边形列表中并继续寻找其他人。问题是我不想克服复杂性O(N log N)

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以循环边缘并计算从边缘中点到所有站点的距离。然后按升序对距离进行排序,对于内部voronoi多边形,选择第一个和第二个。对于外多边形,选择第一个。基本上边缘分开/分割2个多边形。

这是O(m log n)。

答案 1 :(得分:1)

如果我确实找到了这个问题的多项式解决方案,我不会在这里发布,因为我相当确定这至少是NP-Hard。我认为你最好的办法是做一个DFS。您可能会发现此链接很有用Finding all cycles in undirected graphs

如果您可以将图表表示为有向图,则可以使用以下解决方案。存在2 ^ E个有向图(因为每个边可以在2个方向上表示)。您可以选择随机有向图并使用以下解决方案查找此图中的所有周期。对于不同的随机有向图,您可以多次执行此操作,跟踪所有周期,直到您达到令人满意的误差范围。

你可以有效地创建一个带有一点状态的有向图(也许存储一个+或 - 带一个边来注意方向?)然后一旦你在O(n)中这样做,你第一次可以随机翻转x &LT;&LT; E方向获得一个基本上是恒定时间的新图表。

由于您可以在恒定时间内创建后续有向图,因此您需要选择运行循环查找算法的次数,以使其仍然是多项式和有效的。

更新 - 以下内容仅适用于有向图

在我的脑海中,似乎最好将此视为图形问题。您的顶点到边的地图是图表表示。你的问题减少到找到图中的所有循环,因为每个循环都是一个多边形。我认为&#34; Tarjan的强连接组件算法&#34;将在这里使用,因为它可以在O(v + e)中执行此操作。

您可以在https://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm

找到有关算法的更多信息