如何查询Voronoi图?

How to query a Voronoi diagram?

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

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

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

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

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

  • 没有解决这个问题的常数时间算法,
  • Voronoi 图没有提供比 O(N) 搜索更快的解决问题的方法。

如果需要在Voronoi图中定位很多点,可以构建搜索树,通常可以得到O(log N)的性能。为此目的 does this in python building a k-d tree to do the query. In boost, you can use the existing R-tree 上的答案。

有一种方法可以基于 Voronoi 图构建搜索树(Delaunay hierarchy). It maybe could provide some minor benefits 如果您也使用它来构建 Voronoi 图。但是没有像用于一般搜索问题。