【问题标题】:How to extract the convex hull of a set of points from their Voronoi diagram如何从他们的 Voronoi 图中提取一组点的凸包
【发布时间】:2011-05-14 04:54:39
【问题描述】:

我需要一种算法来计算来自 O(n) 中点的 Voronoi 图的一组点的凸包。 Voronoi 图包含在边界框中,并存储为双向连接的边列表。输入是原点在边界框上的半边。

我知道两个点在凸包上是相邻的,只要它们共享一条无限长的 voronoi 边。

【问题讨论】:

  • 为什么你不能绕着凸包从一个无限边缘走到下一个?我想你可能想多说一点关于问题是如何表示的,以便我们了解其中的困难。
  • 我想问题中更难的部分是测试 voronoi 图上的特定边是否确实会继续无穷大,如果它没有在边界框中有界。此外,由于 voronoi 图和边界框被存储为双向连接的边列表,另一个具有挑战性的部分是弄清楚如何正确遍历 DCEL。不管怎样,我想出了一个可行的解决方案。也许我很快就会把它写在这里。

标签: geometry computational-geometry convex-hull voronoi


【解决方案1】:

我相信可以在 O(n) 时间内计算出 Voronoi 图的凸包。

如果给定的 Voronoi 图和顶点应驻留在 CH 中,您可以像在 Grahm 扫描算法中所做的那样,迭代 Voronoi 图的单元并扩展凸包,但方式不同。

这里只缺少一个理论,接下来看...

根据 Springer 在 M4 书中的 Computational Geometry,定理 7.4:点 q 是 Vor(P) 的顶点当且仅当其最大的空圆 C_p(q) 在其边界上包含三个或更多站点。 这意味着每次迭代都需要检查的站点是在 O(1) 中完成的,这意味着您只需遍历 O(n) 个站点。

根据定理 7.3,一个平面上的 n 个点站点的 Voronoi 图的顶点数最多为 2n-5(线性顺序)。

因此可以在 O(n) 时间内计算 Voronoi 图的 CH。

【讨论】:

    【解决方案2】:

    如果您有一个足够大的边界框,以至于只有无限单元格具有边界边缘,那么这项任务似乎并不难。遍历边界边,对于它们中的每一个,向前和向后遍历它以找到第一个非边界边FB。将遍历过程中找到的当前和所有边界标记为used。如果盒子不存在,边缘FB 将是无限的。因此,它们接触面(fFfB),这些面的“中心”是凸包的一部分(当前面是 C),而交叉边 C-to-F 是凸包的一部分。面对fF 并从F 的双胞胎向前迭代以找到下一个非边界边缘,例如F1。如果它等于'B'-twin(或者它的边界是used),我们就完成了。如果不是,则遍历下一个邻居('fF1')。

    【讨论】:

    • 如果没有足够大的边界框怎么办?
    • @uvts_cvs:这意味着并不是所有的点都包含在边界框中。丢弃这些点,因为它们不能包含在凸包中。其余点具有与原始集相同的凸包。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多