请问这一段判断直线相交代码的原理是什么?

在某个项目中遇到下面的代码,用来判断直线是否相交,但不明白其中的数学原理是什么,请各位指点一下,非常感谢~

//这个方法看起来像是向量点积,但又似乎不是
var vectorMulti = function(ax, ay, bx, by) {
    return ax*by-bx*ay;
};

var isCrossing = function(p1, p2, p3, p4) {
    var v1 = vectorMulti(p4.X - p3.X, p4.Y - p3.Y, p1.X - p3.X, p1.Y - p3.Y);
    var v2 = vectorMulti(p4.X - p3.X, p4.Y - p3.Y, p2.X - p3.X, p2.Y - p3.Y);
    var v3 = vectorMulti(p2.X - p1.X, p2.Y - p1.Y, p3.X - p1.X, p3.Y - p1.Y);
    var v4 = vectorMulti(p2.X - p1.X, p2.Y - p1.Y, p4.X - p1.X, p4.Y - p1.Y);

    return (v1*v2)<0 && (v3*v4)<0;
};

var p1 = {X:1,Y:1},
    p2 = {X:2,Y:2},
    p3 = {X:1,Y:2},
    p4 = {X:3,Y:0};

console.log(isCrossing(p1,p2,p3,p4)); //true

这是测试用例:
测试图片

阅读 3.2k
2 个回答
vectorMulti 算的是向量叉乘

由叉乘定义可知 v1 和 sin(顺时针角P4-P3-P1) 同符号, v2 和 sin(逆时针角P4-P3-P2) 同符号

故 (v1 * v2 < 0) 等价于 (P3 P4在直线P1-P2异侧)

剩下的同理

一个平面内直线 只有两个状态 香蕉或者 平行 所以只要平行的时候返回 false 就行了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题