如何查询 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 图逐个像素构建圆