【发布时间】:2021-02-15 11:38:55
【问题描述】:
令 $p_i$ 为二维空间中的第 i 个点,生成 voronoi 图。这意味着,Voronoi 区域 $V_i$ 中的每个点 $x$ 都满足
$|x-p_i|
和 $|x-p_i|=|x-p_j|,i \neq j$ 在它的边界上。边界是一个有顶点和边的图。现在我对跨越 Voronoi 图的边界(边)的顶点的位置感兴趣。
当我选择 $p_i$ 时,有哪些算法可用于计算 Voronoi 图的顶点位置?
我知道我可以搜索 $p_i$ 的最近邻生成器,然后使用外接圆属性;但是我怎样才能尽可能高效地找到最近邻居的位置(这意味着我找到了 Delaunay 三角剖分)?
请注意,我很感兴趣如何找到位于分隔 Voronoi 区域的边界上的顶点(边界的三个边相交处)的坐标向量 $(r_x,r_y)$。有什么提示吗?
【问题讨论】:
-
您将不得不创建某种数据结构来支持有效的点查询。为什么不将该数据结构设为 Delaunay 三角剖分?
-
@YvesDaoust OP 想要选择一个输入点,而不是任意点。但要回答您的问题,是的,您只需使用 K-D 树、R-树或类似树找到最近的点,然后检查三角形及其 Delaunay 邻居。
-
@YvesDaoust 在 Delaunay 三角剖分中定位点的一种非常有效的方法是使用“walk”算法,例如 Lawson 的 Stochastic Walk。一个好的 Delaunay 库将包括一个。网上有很多关于 Delaunay walk 算法的论文。我在gwlucastrig.github.io/Tinfour/doc/… 的第 28 页上写了一个(我希望)非常简单的解释(参见 2.2.8.4 顶点位置)
-
@YvesDaoust:你的记忆是正确的......在一般情况下,步行的时间复杂度是 O(√n)。从实际的角度来看,如果您的代码以常规模式执行大量行走(例如生成网格),则它可以从完成前一次行走的地方开始每次行走。在那种特殊(虽然很常见)的情况下,相邻点靠近前一个查询,步行时间很短,平均情况是 O(k)。
标签: algorithm graphics computational-geometry voronoi