【发布时间】: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。然后,对于每个蓝色多边形,您将能够获得可能与其相交的所有红色多边形的子集。