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

发布于 2022-09-06 01:40:06 字数 856 浏览 14 评论 0

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

//这个方法看起来像是向量点积,但又似乎不是
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

这是测试用例:
测试图片

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

东京女 2022-09-13 01:40:06
vectorMulti 算的是向量叉乘

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

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

剩下的同理
南风起 2022-09-13 01:40:06

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文