【问题标题】:How to find the intersect points in a polygon object如何在多边形对象中找到相交点
【发布时间】:2021-02-05 15:46:26
【问题描述】:

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

坐标如下(it's an array(x-axis,y-axis) i.e [x-val,y-val])

peppa:
0: (2) [0.24509992094864, 0.1669636438338341]
1: (2) [0.17643184493644434, 0.21545930801793528]
2: (2) [0.24810728194187487, 0.26326217699940646]
3: (2) [0.2821907065318698, 0.2119953320047852]

pig:
0: (2) [0.2877042016861337, 0.16904202944172414]
1: (2) [0.23607783796893547, 0.21753769362582534]
2: (2) [0.29171401634378014, 0.24594229693365605]
3: (2) [0.32429376043715763, 0.20991694639689515]
4: (2) [0.3037434603167195, 0.1912114759258847]

现在,我想出了交叉点可能发生在下面的位置。

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

但是,如何找到如图所示的两个交点?

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

【问题讨论】:

标签: algorithm


【解决方案1】:

这里的困难部分是检查 2 条线段之间的交点,因为多边形只是许多线段的集合。那么要解决这个问题,您只需要遍历一个多边形上的所有线段,然后查看它是否与第二个多边形上的任何线段相交

交叉点检测全部基于此答案https://stackoverflow.com/a/1968345 中显示的工作 - 我用 javascript 重新制作了它,因此它更容易阅读并且在我这边更容易检查。

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

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

然后我遍历 peppa 上的每个线段,并将其与 pig 上的每个线段进行比较。如果有交叉路口,我将其注销。当我在 { x: 0.2677543532697923, y: 0.2337098836931087 } 和 { x: 0.2646494979562556, 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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多