如何查询 Voronoi 图?

Posted

技术标签:

【中文标题】如何查询 Voronoi 图?【英文标题】:How to query a Voronoi diagram? 【发布时间】:2020-08-02 07:35:50 【问题描述】:

我正在使用boost 计算二维中一组点的voronoi 图,非常简单;

std::vector<Point> points;
...
voronoi_diagram<double> vd;
construct_voronoi(points.begin(), points.end(), &vd);

是否有一种算法来处理生成的多边形,以便查询“给定点属于哪个站点?” 可以在恒定时间内回答?换句话说,给定点位于一组多边形中的哪个多边形中?

当然可以计算并比较给定点与现有点的距离,但这需要 O(n) 时间,并且没有利用 Voronoi 图中编码的信息。

【问题讨论】:

【参考方案1】:

问题“给定点属于哪个站点?”只是说明nearest neighbor search 问题的另一种方式:相关的 Voronoi 多边形是与生成 Voronoi 图的集合中最近点相关联的多边形。不幸的是,

没有任何恒定时间算法可以解决这个问题,并且 Voronoi 图没有比 O(N) 搜索更快地解决问题。

如果你需要在 Voronoi 图中定位很多点,你可以构建一个搜索树,通常可以获得 O(log N) 的性能。 this question 的答案是在 python 中构建一个 k-d tree 来执行查询。在 boost 中,您可以为此目的使用现有的R-tree。

有一种方法可以基于 Voronoi 图(Delaunay hierarchy)构建搜索树。如果您还使用它来构建 Voronoi 图,它可能会提供一些 minor benefits。但是没有像通用搜索问题那样容易获得的优化库。

【讨论】:

我仍在研究这个问题,也许你对具有无限平面的连续空间是正确的,但是在离散空间中,可以只用指向最近点的索引为图表着色。这显然是一个恒定时间查找算法。

以上是关于如何查询 Voronoi 图?的主要内容,如果未能解决你的问题,请参考以下文章

最简单的Voronoi图算法实现? [关闭]

使用增量邻域法以迭代方式为 voronoi 图逐个像素构建圆

Voronoi图及matlab实现

《图像处理实例》 之 Voronoi 图

如何在 voronoi_finite_polygons_2d 函数中获取与给定点关联的区域?

OpenCV生成点集的Delaunay剖分和Voronoi图