Algorithm 给定voronoi图的生成点;计算它的顶点

Algorithm 给定voronoi图的生成点;计算它的顶点,algorithm,graphics,computational-geometry,voronoi,Algorithm,Graphics,Computational Geometry,Voronoi,设$p_i$为生成voronoi图的二维空间中的第i点。这意味着,Voronoi区域$V_i$中的每个点$x$满足 不幸的是,最优解是复杂的 您可以使用Fortune算法或Guibas&Stolfi算法构建图表,这需要O(N logn)时间和O(N)空间。(由于Voronoi图和Delaunay三角剖分是彼此的对偶,因此可以互换地构造其中一个。) 但是Voronoi图的表示不适合于任意点的有效定位。因此,您必须将其转换为梯形图之类的结构,以便在时间O(logn)内进行有效的点位置查询。不幸的是,

设$p_i$为生成voronoi图的二维空间中的第i点。这意味着,Voronoi区域$V_i$中的每个点$x$满足


不幸的是,最优解是复杂的

您可以使用Fortune算法或Guibas&Stolfi算法构建图表,这需要O(N logn)时间和O(N)空间。(由于Voronoi图和Delaunay三角剖分是彼此的对偶,因此可以互换地构造其中一个。)


但是Voronoi图的表示不适合于任意点的有效定位。因此,您必须将其转换为梯形图之类的结构,以便在时间O(logn)内进行有效的点位置查询。不幸的是,我从未见过在Voronoi图的框架中执行这种转换的显式算法。

不幸的是,最优解是复杂的

您可以使用Fortune算法或Guibas&Stolfi算法构建图表,这需要O(N logn)时间和O(N)空间。(由于Voronoi图和Delaunay三角剖分是彼此的对偶,因此可以互换地构造其中一个。)


但是Voronoi图的表示不适合于任意点的有效定位。因此,您必须将其转换为梯形图之类的结构,以便在时间O(logn)内进行有效的点位置查询。不幸的是,我从未见过在Voronoi图的框架中执行这种转换的显式算法。

计算平面中的Voronoi区域相当于计算
n
半平面的交点-由点
p_I
和每个其他点之间的平分线定义的半平面
p_j
。 然而,这个问题(通过对偶性)等价于计算平面上
n
点的凸包(参见《离散和计算几何手册》)。 计算
\Omega(n logn)
平面上一组点的凸包

计算Delaunay三角剖分只需
O(n logn)
时间。 因此,正如@matt timmermans和@yves daoust所建议的那样,将输入预处理到Delaunay三角剖分中不会产生实际的开销,可能是大多数应用程序的最佳选择

计算Delaunay三角剖分后,每个查询(区域边界的构造) 只需
O(1+k)
时间,其中
k
是输出大小,即Voronoi区域边界上的顶点/边数。 请注意,
k
本身可以是
\Omega(n)
,例如,如果
n-1
点或多或少地放置在一个圆上,并且
p\u i
靠近其中心

虽然最坏情况下的算法是
\Omega(n log n)
,因此并不比计算Delaunay三角剖分更好, 还有一个输出敏感算法的选项,该算法采用
O(n*k)
(取决于输出Voronoi区域的大小)

在Voronoi区域的边界上找到一个顶点相当于线性规划问题的结果 (见第4章)

特别是,Megiddo的算法或其随机版本(上述书的第4.4章)在
O(n)
线性时间内运行。 找到第一个顶点及其两条生成线后,可以通过将其余的线与生成线相交来找到下一个顶点。 最近的交点是下一个Voronoi顶点,然后最近的相交线成为下一条要相交的线。 当再次到达第一个顶点时,该过程终止。
总之,每次迭代需要
O(n)
,并且有
k次
迭代,因此该算法总共需要
O(n*k)

计算平面中的Voronoi区域相当于计算
n
半平面的交点-由点
p\u i
和每隔一点
p\u j
之间的平分线定义的半平面。 然而,这个问题(通过对偶性)等价于计算平面上
n
点的凸包(参见《离散和计算几何手册》)。 计算
\Omega(n logn)
平面上一组点的凸包

计算Delaunay三角剖分只需
O(n logn)
时间。 因此,正如@matt timmermans和@yves daoust所建议的那样,将输入预处理到Delaunay三角剖分中不会产生实际的开销,可能是大多数应用程序的最佳选择

计算Delaunay三角剖分后,每个查询(区域边界的构造) 只需
O(1+k)
时间,其中
k
是输出大小,即Voronoi区域边界上的顶点/边数。 请注意,
k
本身可以是
\Omega(n)
,例如,如果
n-1
点或多或少地放置在一个圆上,并且
p\u i
靠近其中心

虽然最坏情况下的算法是
\Omega(n log n)
,因此并不比计算Delaunay三角剖分更好, 还有一个输出敏感算法的选项,该算法采用
O(n*k)
(取决于输出Voronoi区域的大小)

在Voronoi区域的边界上找到一个顶点相当于线性规划问题的结果 (见第4章)

特别是,Megiddo的算法或其随机版本(上述书的第4.4章)在
O(n)
线性时间内运行。 找到第一个顶点及其两条生成线后,可以通过将其余的线与生成线相交来找到下一个顶点。 最近的交点是下一个Voronoi顶点,最近的交线则成为inters的下一条线