Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 是否有一种有效的算法来查找所有相交多边形?_Algorithm_Polygon - Fatal编程技术网

Algorithm 是否有一种有效的算法来查找所有相交多边形?

Algorithm 是否有一种有效的算法来查找所有相交多边形?,algorithm,polygon,Algorithm,Polygon,我有两组多边形。笛卡尔空间中的红色多边形和蓝色多边形。我需要找到所有与蓝色多边形相交的红色多边形。我目前正在使用一种简单的双for循环方法来解决这个问题。以下是伪代码: var candidates = HashMap<Int, Polygon>(); for (var red : redPolygons) { for (var blue : bluePolygons) { if (polygonsIntersect(red, blue)) {

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

var candidates = HashMap<Int, Polygon>();
for (var red : redPolygons) {
    for (var blue : bluePolygons) {
        if (polygonsIntersect(red, blue)) {
           candidates[red.id] = red.polygon;
           break;
        }
    }
}
var候选者=HashMap();
用于(变量红色:红色多边形){
用于(变量蓝色:蓝色多边形){
if(多边形相交(红色、蓝色)){
候选[red.id]=red.polygon;
打破
}
}
}
我在寻找一种更有效的算法。理想情况下,比O(N^2)更好的东西

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

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

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

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

如果您也需要包含(多边形重叠),则从每个多边形中拾取一个点并检查“其他集合”中的任何多边形中是否包含该点就足够了;应该可以在一个单独的系统中进行交叉点和安全壳检查

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


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

实际上,您的算法不是N^2。因为根据多边形的大小,可以在
log(M)
中进行相交。因此它是
N^2 log(M)
(M是两个数据集并集中多边形的最大大小)。好的观点,虽然在我的应用程序中,任何给定多边形中的点数通常都很小。首先相交边界框?您的伪代码将
red.id
s映射到
red.polygon
,甚至不提及相交的蓝色多边形:这是什么想法?将红色多边形(或其边界框)推到四叉树或kdtree中。然后,对于每个蓝色多边形,您将能够获得可能与其相交的所有红色多边形的子集。(解决“重叠”的CS方法是通过相交和点包容来声明它已解决。)