我有两组多边形。红色多边形和蓝色多边形,在笛卡尔空间中。我需要找到与任何蓝色多边形相交的所有红色多边形。我目前正在使用一种简单的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个),并且是动态的。红色多边形的数量很大,并且不经常更改,因此预处理红色多边形是一个可行的选择。
答案 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中进行交集和密闭性检查。
预处理红色多边形是一个可行的选择。
常规预处理包括按坐标对顶点排序。