【问题标题】:Is there an efficient algorithm to find all intersecting polygons?是否有一种有效的算法来查找所有相交的多边形?
【发布时间】:2019-11-23 04:45:14
【问题描述】:

我有两组多边形。笛卡尔空间中的红色多边形和蓝色多边形。我需要找到与任何蓝色多边形相交的所有红色多边形。我目前正在使用一种简单的双循环方法来解决这个问题。这是伪代码:

var candidates = HashMap<Int, Polygon>();
for (var red : redPolygons) {
    for (var blue : bluePolygons) {
        if (polygonsIntersect(red, blue)) {
           candidates[red.id] = red.polygon;
           break;
        }
    }
}

我正在寻找一种更有效的算法。理想情况下比 O(N^2) 更好。

更多细节。蓝色多边形的数量通常很小(少于 100 个)并且是动态的。红色多边形的数量很大,并且不会经常变化,因此对红色多边形进行预处理是一个可行的选择。

【问题讨论】:

  • 确实你的算法不是 N^2。因为就多边形的大小而言,相交可以在log(M) 中完成。所以是N^2 log(M)(M 是两个数据集联合中多边形的最大尺寸)。
  • 好点,但对于我的应用程序,任何给定多边形中的点数通常很少。
  • 先相交边界框?
  • 您的伪代码将red.ids 映射到red.polygon,甚至没有提及相交的蓝色:这是什么想法?
  • 将红色多边形(或其边界框)推入四叉树或 kdtree。然后,对于每个蓝色多边形,您将能够获得可能与其相交的所有红色多边形的子集。

标签: algorithm polygon


【解决方案1】:

理想情况下比 O(N^2) 更好

(请注意,可能存在 O(N²) 个交叉点:下面的许多高级算法使用大量时间最坏情况。)
如果所有边都平行于轴之一(等向),计算几何中的许多问题会更简单;如果“所有”多边形都是凸的,许多多边形问题会更简单。

 如果您正在寻找具有相交边的多边形,请仅寻找
Balaban, I. J. (1995):“寻找线段交点的最佳算法”。
对于两组边/多边形之间相交的特殊情况,有
Chan, TM (1994):“A Simple Trapezoid Sweep Algorithm for Reporting Red/Blue Segment Intersections”,
曼特勒,A.; Snoeyink, J. (2001):“以最佳时间和精度相交红蓝线段”,
Basch, J.;吉巴斯,L.J.; Ramkumar, G. D.(2003 年)“报告两组连接线段之间的红蓝相交”,……

如果你也需要包含(多边形重叠),从每个多边形中选择 一个 点并检查“另一组”中任何多边形中的包含就足够了;应该可以在单个 line sweep 中进行交叉和包含检查。

预处理红色多边形是一个可行的选择。

传统的预处理包括按坐标对顶点进行排序。

【讨论】:

  • (解决“重叠”的 CS 方法是声明它通过 intersectionpoint containment 解决。)
猜你喜欢
  • 2011-06-20
  • 1970-01-01
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多