在这种情况下,可接受的答案给出了错误的答案:
x1 = 0;
y1 = 0;
x2 = 10;
y2 = 10;
x3 = 10.1;
y3 = 10.1;
x4 = 15;
y4 = 15;
这些线显然不相交,但是根据“正确答案”中的功能,这些线确实相交。
这就是我用的:
function do_lines_intersect(px1,py1,px2,py2,px3,py3,px4,py4) {
var ua = 0.0;
var ub = 0.0;
var ud = (py4 - py3) * (px2 - px1) - (px4 - px3) * (py2 - py1);
if (ud != 0) {
ua = ((px4 - px3) * (py1 - py3) - (py4 - py3) * (px1 - px3)) / ud;
ub = ((px2 - px1) * (py1 - py3) - (py2 - py1) * (px1 - px3)) / ud;
if (ua < 0.0 || ua > 1.0 || ub < 0.0 || ub > 1.0) ua = 0.0;
}
return ua;
}
返回0 =线不相交
返回> 0 =线相交
更新以回答问题:
我不是自己创建此代码的。它已经超过5年了,我不知道原始来源是什么。但..
我认为返回值是它们相交的第一行的相对位置(不好解释)。要计算相交点,您可以使用lerp,如下所示:
l = do_lines_intersect(...)
if (l > 0) {
intersect_pos_x = l * (px2-px1);
intersect_pos_y = l * (py2-py1);
} else {
// lines do not cross
}
(我没有对此进行测试)