Geometry 如何从Voronoi图中提取一组点的凸包

Geometry 如何从Voronoi图中提取一组点的凸包,geometry,computational-geometry,convex-hull,voronoi,Geometry,Computational Geometry,Convex Hull,Voronoi,我需要一个算法,从O(n)中点的Voronoi图计算一组点的凸包。Voronoi图包含在边界框中,并存储为双连通边列表。输入是原点位于边界框上的半边 我知道两个点在凸包上是相邻的,如果它们共享一条无限长的voronoi边。如果你有一个足够大的边界框,只有无限个单元有边界边,那么任务似乎并不困难。迭代边界边,对于每个边界边,向前和向后遍历边界边,以找到第一条非边界边F和B。将当前边和遍历期间找到的所有边界边标记为已使用。如果框不存在,F和B的边将是无限的。因此,它们接触面(fF和fB),这些面的“

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


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

如果你有一个足够大的边界框,只有无限个单元有边界边,那么任务似乎并不困难。迭代边界边,对于每个边界边,向前和向后遍历边界边,以找到第一条非边界边
F
B
。将当前边和遍历期间找到的所有边界边标记为已使用。如果框不存在,
F
B
的边将是无限的。因此,它们接触面(
fF
fB
),这些面的“中心”是凸包的一部分(当前面是
C
),而交叉边
C-to-F
是凸包的一部分。取面
fF
并从
F
的孪生向前迭代以查找下一条非边界边,比如说,
F1
。如果它等于“B”-twin(或者它的边界边被
使用了
),我们就完成了。如果没有,则遍历下一个邻居('fF1')。

我相信可以在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是可能的

为什么你不能绕着凸面外壳从一条无限边走到另一条无限边?我想你可能想多说一点关于这个问题是如何表示的,这样我们就可以理解这个问题的难度。我想这个问题更难的部分是测试voronoi图上的某条边是否真的会继续无穷大,如果它不在边界框中的话。此外,由于voronoi图和边界框存储为双连通边列表,因此另一个具有挑战性的部分是确定如何正确遍历DCEL。不管怎样,我想出了一个有效的解决方案。也许我很快会把它写在这里。如果你没有足够大的边界框怎么办?@uvts\u cvs:这意味着不是所有的点都包含在边界框中。扔掉这些点,因为它们不能包含在凸面外壳中。其余点具有与原始集相同的凸包。