我需要一种算法,用于从O(n)中的点的Voronoi图计算一组点的凸包。 Voronoi图包含在边界框中,并存储为双连接边列表。输入是半边,其原点在边界框上。
我知道如果它们共享一个无限长的voronoi边缘,则两个点在凸包上相邻。
答案 0 :(得分:2)
如果你有一个足够大的边界框,只有无限的单元格有边界边界,那么任务似乎并不困难。迭代边界,对于每个边界,向前和向后遍历它以找到第一个非边界边F
和B
。将遍历期间找到的当前和所有边界标记为used
。如果框不存在,边F
和B
将是无限的。因此,他们触摸面(fF
和fB
)谁的“中心”是凸包的一部分(当前面是C
),而跨边C-to-F
是凸壳的一部分。取面fF
并从F
的双胞胎前进迭代,找到下一个非边界边缘,比如F1
。如果它等于'B' - 双胞胎(或它的边界是used
),我们就完成了。如果不是,则遍历下一个邻居('fF1')。
答案 1 :(得分:-1)
我相信可以在O(n)时间内计算Voronoi图的凸包。
如果给定的Voronoi图和一个顶点应驻留在CH中,您可以迭代Voronoi图的单元格,并像在Grahm扫描算法中一样使用凸包,但使用不同的方式。
这里只缺少一种理论,请注意下一步......
根据Springer的计算几何学M4书,定理7.4:点q是Vor(P)的顶点,当且仅当其最大的空圆C_p(q)包含三个或更多个位置时边界。 这意味着需要检查每次迭代的站点是在O(1)中完成的,这意味着您只需要迭代O(n)站点。
根据定理7.3,n个点的ste的Voronoi图中的顶点数最多为2n-5(线性顺序)。
因此,可以在O(n)时间内计算Voronoi图的CH。