给定一组多边形和一系列点,找出哪些多边形是所定位的点

Posted

技术标签:

【中文标题】给定一组多边形和一系列点,找出哪些多边形是所定位的点【英文标题】:Given a set of polygons and a series of points, find the which polygons are the points located 【发布时间】:2011-06-16 03:32:18 【问题描述】:

这是一个类似于the one here 的问题,但我认为如果我可以用更笼统的术语重新编写它会很有帮助。

我有一组多边形,这些多边形可以相互接触、重叠并且可以呈现任何形状。我的问题是,给定一个点列表,如何设计一种有效的算法来找出这些点所在的多边形?

点位置的一个有趣限制是,所有点都位于多边形的边缘,如果这有帮助的话。

我了解r-trees can help,但是鉴于我正在做一系列点,有没有更有效的算法而不是一个一个地计算每个点?

【问题讨论】:

【参考方案1】:

这里的关键搜索词是点位置。在这个名称下,计算几何文献中有许多算法适用于各种情况,从特殊到一般。例如,this link 列出了各种软件包,包括我自己的。 (现在有点过时了。)

在速度和程序复杂性(以及因此实施工作)之间存在重大权衡。最容易编程的方法是使用标准的多边形内点代码针对每个多边形检查每个点。但这可能会很慢,具体取决于您拥有多少多边形。 更难的是通过扫平面来构建点位数据结构 并找到所有边缘边缘的交点。请参阅this Wikipedia article 了解您的一些选项。

【讨论】:

【参考方案2】:

我认为您正在与关于问题的直觉(这是一种准模拟感知)与必然 O(n) 的计算方法发生冲突。

给定一个平面、一个退化的多边形(一条线)和平面上的任意一组点,这些点是与该线相交还是落在“上方”或“下方”?即使对于这种退化的情况,我也想不出比 O(n) 更小的方法。

要么,每个点都必须检查它与线的关系,或者你必须将这些点划分为一些树状结构,这至少需要 O(n) 次操作,但很可能更多。

如果我在计算几何方面做得更好,我可能可以权威地说你刚刚重述了Klee's measure problem,但我只能建议它。

【讨论】:

【参考方案3】:

如果点只能落在边上,那么只需检查边就可以在 O(n) 内找到多边形。

如果不是这样,您必须对 O(n log n) 中的多边形进行三角剖分,以针对 O(n) 中的三角形进行测试。

您还可以通过从每个线段延伸的线来划分空间,注意哪一侧在相应多边形的内部/外部。如果一个点落在一个边上或者如果它位于多边形每条边的内部,则它位于多边形内。在最坏情况下,边数为 O(n),但在平均情况下,多边形数趋于 O(m)。

R-tree 在这两种情况下都会有所帮助,但前提是您需要测试多个点。否则,构建 R-tree 将比搜索三角形列表更昂贵。

【讨论】:

以上是关于给定一组多边形和一系列点,找出哪些多边形是所定位的点的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中的 Google 地图上绘制多边形并获取其中的所有 POI?

具有多个圆的近似多边形

sp::over() 用于多边形分析中的点

最小包围矩形

点在边平行于轴的多边形内

7-8 对称图形的面积 (25分)