polygon - 如何查询 Voronoi 图?
问题描述
我boost
用来计算二维中一组点的 voronoi 图,非常简单;
std::vector<Point> points;
...
voronoi_diagram<double> vd;
construct_voronoi(points.begin(), points.end(), &vd);
是否有一种算法来处理生成的多边形,以便查询“给定点属于哪个站点?” 可以在恒定时间内回答吗?换句话说,给定点位于一组多边形中的哪个多边形中?
当然,可以计算并比较给定点与现有点的距离,但这将花费 O(n) 时间并且不利用 Voronoi 图中编码的信息。
解决方案
问题“给定点属于哪个站点?” 只是说明最近邻搜索问题的另一种方式:相关的 Voronoi 多边形是与生成 Voronoi 图的集合中的最近点相关联的多边形。很遗憾,
- 没有任何恒定时间算法可以解决这个问题,并且
- Voronoi 图没有比 O(N) 搜索更快地解决问题。
如果需要在 Voronoi 图中定位很多点,可以构建搜索树,通常可以获得 O(log N) 的性能。这个问题的答案是在 python 中构建一个kd 树来进行查询。在 boost 中,您可以为此目的使用现有的R-tree 。
有一种方法可以基于 Voronoi 图(Delaunay 层次结构)构建搜索树。如果您也使用它来构建 Voronoi 图,它可能会提供一些小好处。但是没有像通用搜索问题那样容易获得的优化库。
推荐阅读
- c++ - 如何从 C++ 中的 NTP 服务器获取正确的时间?
- javascript - JQuery .append() 内容不会留在屏幕上
- git - 取消跟踪文件并 gitignore 它,但在拉取时不要在服务器上删除它
- terraform - Terraform 模块 - 事后添加项目
- json - 为什么 AWS S3 GUI 将 { "_1": } 放在我的 JSON 文件周围?
- android - Dagger-Android @ActivityKey not found,如何显式创建子组件
- php - 带有 POP3 的 IMAP_OPEN 函数只返回 2016 年的电子邮件?
- sql - 创建引用 dbms 包的存储过程时出现 ORA-00904
- google-sheets-formula - ArrayFormula 与前行的总和
- sql - 检查两列值中的哪一个最接近计算值