Algorithm 如何在多边形对象中查找相交点

Algorithm 如何在多边形对象中查找相交点,algorithm,Algorithm,我有两个多边形,平面上有点,如下所示 坐标如下(它是一个数组(x轴,y轴),即[x-val,y-val]) 现在,我知道了交叉点可能发生在哪里,如下所示 peppa : Xmin = 0.17, Xmax = 0.28 pig : Xmin = 0.23, Xmax = 0.32 peppa : Ymin = 0.17, Ymax = 0.28 pig : Ymin = 0.23, Ymax = 0.32 Intersection happens if it satisfies,

我有两个多边形,平面上有点,如下所示

坐标如下
(它是一个数组(x轴,y轴),即[x-val,y-val])

现在,我知道了交叉点可能发生在哪里,如下所示

peppa : Xmin = 0.17, Xmax = 0.28
pig   : Xmin = 0.23, Xmax = 0.32

peppa : Ymin = 0.17, Ymax = 0.28
pig   : Ymin = 0.23, Ymax = 0.32

Intersection happens if it satisfies,
      min(Xmax) > max(Xmin) && min(Ymax) > max(Ymin)
i.e     0.28        0.23        0.28        0.17
但是,如何找到如图所示的两个交点


我已经通过了一些算法,但什么都不懂。所以,请帮我解决这个问题。

这里的难点是检查两条线段之间的交点,因为多边形只是许多线段的集合。所以要解决这个问题,你只需要迭代一个多边形上的所有线段,然后看看它是否与第二个多边形上的任何线段相交

交叉点检测都是基于这个答案中所示的工作——我用javascript重新编写了它,这样它就更容易阅读,也更容易检查

我把你的观点放在一个数组中以便阅读。我还假设您使用的任何语言都会将多边形点存储在数组中

然后我把它做成一个线段数组。每条线段由2个点组成。最终结果是这样的[p0,p1],[p1,p2],[p2,p0]。我将所有这些存储在一个数组中以便于使用

然后我在peppa上循环每个线段,并将其与pig上的每个线段进行比较。如果有交叉口,我将其注销。当我在{x:0.2677543532697923,y:0.2337098836931087}和{x:0.26464949979562556,y:0.1906986616243169}上运行它时,发现了两个共线

var peppa = [
    [0.24509992094864, 0.1669636438338341],
    [0.17643184493644434, 0.21545930801793528],
    [0.24810728194187487, 0.26326217699940646],
    [0.2821907065318698, 0.2119953320047852],
];

var pig = [
    [0.2877042016861337, 0.16904202944172414],
    [0.23607783796893547, 0.21753769362582534],
    [0.29171401634378014, 0.24594229693365605],
    [0.32429376043715763, 0.20991694639689515],
    [0.3037434603167195, 0.1912114759258847]
];


//I highly recommend you automate this, but this will show you what data I am using for the loops
var peppaLineSegments = [
    [peppa[0], peppa[1]],
    [peppa[1], peppa[2]],
    [peppa[2], peppa[3]],
    [peppa[3], peppa[0]]
];

var pigLineSegments = [
    [pig[0], pig[1]],
    [pig[1], pig[2]],
    [pig[2], pig[3]],
    [pig[3], pig[4]],
    [pig[4], pig[0]]
];

//all points are a simple array of x,y

//line segment 1 is defined by 2 points
//point0, point1

//line segment 2 is defined by 2 different points
//point2, point3
function findLineIntersection(point0, point1, point2, point3){
    var s1_x = point1[0] - point0[0];
    var s1_y = point1[1] - point0[1];
    var s2_x = point3[0] - point2[0];
    var s2_y = point3[1] - point2[1];

    var s = (-s1_y * (point0[0] - point2[0]) + s1_x * (point0[1] - point2[1])) / (-s2_x * s1_y + s1_x * s2_y);
    var t = ( s2_x * (point0[1] - point2[1]) - s2_y * (point0[0] - point2[0])) / (-s2_x * s1_y + s1_x * s2_y);

    if (s >= 0 && s <= 1 && t >= 0 && t <= 1){
        var intersectionX = point0[0] + (t * s1_x);
        var intersectionY = point0[1] + (t * s1_y);
        return {x: intersectionX, y: intersectionY};
    }

    return false;
}


for(var peppaLS of peppaLineSegments){
    for(var pigLS of pigLineSegments){
        //line segment 1 points
        var point0 = peppaLS[0];
        var point1 = peppaLS[1];
    
        //line segment 2 points
        var point2 = pigLS[0];
        var point3 = pigLS[1];
    
        var intersection = findLineIntersection(point0, point1, point2, point3);
        if(intersection){
            console.log("intersection at:", intersection);
        }
    }
}
var peppa=[
[0.24509992094864, 0.1669636438338341],
[0.17643184493644434, 0.21545930801793528],
[0.24810728194187487, 0.26326217699940646],
[0.2821907065318698, 0.2119953320047852],
];
变量pig=[
[0.2877042016861337, 0.16904202944172414],
[0.23607783796893547, 0.21753769362582534],
[0.29171401634378014, 0.24594229693365605],
[0.32429376043715763, 0.20991694639689515],
[0.3037434603167195, 0.1912114759258847]
];
//我强烈建议您将其自动化,但这将向您显示我在循环中使用的数据
变量peppaLineSegments=[
[peppa[0],peppa[1]],
[peppa[1],peppa[2]],
[peppa[2],peppa[3]],
[peppa[3],peppa[0]]
];
var pigLineSegments=[
[清管器[0],清管器[1]],
[清管器[1],清管器[2]],
[清管器[2],清管器[3]],
[清管器[3],清管器[4]],
[清管器[4],清管器[0]]
];
//所有点都是x,y的简单数组
//线段1由2个点定义
//点0,点1
//线段2由两个不同的点定义
//第二点,第三点
函数findLineIntersection(点0、点1、点2、点3){
变量s1_x=点1[0]-点0[0];
变量s1_y=点1[1]-点0[1];
var s2_x=点3[0]-点2[0];
变量s2_y=点3[1]-点2[1];
var s=(-s1_y*(点0[0]-2[0])+s1_x*(点0[1]-2[1])/(-s2_x*s1_y+s1_x*s2y);
变量t=(s2_x*(点0[1]-点2[1])-s2_y*(点0[0]-点2[0])/(-s2_x*s1_y+s1_x*s2y);

如果(s>=0&&s=0&&t,您将遍历一个多边形上的所有线段,然后查看它是否与第二个多边形上的任何线段相交,如下所示:请参见多边形剪裁算法:@kaya3谢谢您提供的信息。但是,我“我不明白他们写了什么。我想找一些简单直接的解释。谢谢you@AdamMeyer你能给出答案的确切链接吗?或者你能在这里解释一下吗
var peppa = [
    [0.24509992094864, 0.1669636438338341],
    [0.17643184493644434, 0.21545930801793528],
    [0.24810728194187487, 0.26326217699940646],
    [0.2821907065318698, 0.2119953320047852],
];

var pig = [
    [0.2877042016861337, 0.16904202944172414],
    [0.23607783796893547, 0.21753769362582534],
    [0.29171401634378014, 0.24594229693365605],
    [0.32429376043715763, 0.20991694639689515],
    [0.3037434603167195, 0.1912114759258847]
];


//I highly recommend you automate this, but this will show you what data I am using for the loops
var peppaLineSegments = [
    [peppa[0], peppa[1]],
    [peppa[1], peppa[2]],
    [peppa[2], peppa[3]],
    [peppa[3], peppa[0]]
];

var pigLineSegments = [
    [pig[0], pig[1]],
    [pig[1], pig[2]],
    [pig[2], pig[3]],
    [pig[3], pig[4]],
    [pig[4], pig[0]]
];

//all points are a simple array of x,y

//line segment 1 is defined by 2 points
//point0, point1

//line segment 2 is defined by 2 different points
//point2, point3
function findLineIntersection(point0, point1, point2, point3){
    var s1_x = point1[0] - point0[0];
    var s1_y = point1[1] - point0[1];
    var s2_x = point3[0] - point2[0];
    var s2_y = point3[1] - point2[1];

    var s = (-s1_y * (point0[0] - point2[0]) + s1_x * (point0[1] - point2[1])) / (-s2_x * s1_y + s1_x * s2_y);
    var t = ( s2_x * (point0[1] - point2[1]) - s2_y * (point0[0] - point2[0])) / (-s2_x * s1_y + s1_x * s2_y);

    if (s >= 0 && s <= 1 && t >= 0 && t <= 1){
        var intersectionX = point0[0] + (t * s1_x);
        var intersectionY = point0[1] + (t * s1_y);
        return {x: intersectionX, y: intersectionY};
    }

    return false;
}


for(var peppaLS of peppaLineSegments){
    for(var pigLS of pigLineSegments){
        //line segment 1 points
        var point0 = peppaLS[0];
        var point1 = peppaLS[1];
    
        //line segment 2 points
        var point2 = pigLS[0];
        var point3 = pigLS[1];
    
        var intersection = findLineIntersection(point0, point1, point2, point3);
        if(intersection){
            console.log("intersection at:", intersection);
        }
    }
}