给定一组多边形和一系列点,找到哪些多边形是点

时间:2011-06-16 03:32:18

标签: algorithm search computational-geometry

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

我认为你正在反对对问题的直觉(这是一种准模拟感知)与必然的计算方法O(n)。

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

要么必须检查每个点与线的关系,要么必须将点分割成一些树状结构,这需要至少O(n)次操作,但很可能更多。< / p>

如果我在计算几何方面做得更好,我可能会有权威地说你刚刚重申了Klee's measure problem但是因为我只是需要建议它。

答案 2 :(得分:1)

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

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

您还可以将空间除以从每个线段延伸的线,注意哪一边是相应多边形的内部/外部。如果一个点落在边缘上或者它位于多边形的每个边缘的内侧部分上,则该点位于多边形内部。在最坏的情况下,它的边数是O(n),但在平均情况下,多边形的数量倾向于O(m)。

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