这里的困难部分是检查 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);
}
}
}