有找到所有相交多边形的有效算法吗?

时间:2019-07-13 23:27:30

标签: algorithm polygon

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

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个),并且是动态的。红色多边形的数量很大,并且不经常更改,因此预处理红色多边形是一个可行的选择。

1 个答案:

答案 0 :(得分:0)

  

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

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

如果仅在寻找具有相交边的多边形,请寻找
Balaban,I. J。(1995年):“一种用于寻找路段相交的最佳算法”。
对于两组边线/多边形之间的交点的特殊情况,有
Chan,T. M。(1994):“用于报告红色/蓝色线段交叉点的简单梯形扫描算法”,
Mantler,A .; Snoeyink,J。(2001):“以最佳时间和精度相交的红线和蓝线段”,
Basch,J .; Guibas,L.J .; Ramkumar,G. D。(2003),“报告两组连接的线段之间的红蓝相交”,……

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

  

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

常规预处理包括按坐标对顶点排序。