测试两条线是否相交 - JavaScript 函数

2023-12-29

我尝试寻找一个 javascript 函数来检测两条线是否相交。

该函数将获取每条线(我们将其称为线 A 和线 B)的两个起点的 x、y 值。

就是如果相交则返回 true,否则返回 false。

函数示例。如果答案使用矢量对象,我很高兴。

Function isIntersect (lineAp1x, lineAp1y, lineAp2x, lineAp2y, lineBp1x, lineBp1y, lineBp2x, lineBp2y) 
{

    // JavaScript line intersecting test here. 

}

一些背景信息:此代码适用于我尝试在 html5 canvas 中制作的游戏,并且是我的碰撞检测的一部分。


// returns true if the line from (a,b)->(c,d) intersects with (p,q)->(r,s)
function intersects(a,b,c,d,p,q,r,s) {
  var det, gamma, lambda;
  det = (c - a) * (s - q) - (r - p) * (d - b);
  if (det === 0) {
    return false;
  } else {
    lambda = ((s - q) * (r - a) + (p - r) * (s - b)) / det;
    gamma = ((b - d) * (r - a) + (c - a) * (s - b)) / det;
    return (0 < lambda && lambda < 1) && (0 < gamma && gamma < 1);
  }
};

解释:(向量、矩阵和厚颜无耻的行列式)

线可以用一些初始向量 v 和方向向量 d 来描述:

r = v + lambda*d 

我们用一个点(a,b)作为初始向量和它们之间的差(c-a,d-b)作为方向向量。我们的第二行也是如此。

如果两条线相交,则必须有一个点 X,可以通过沿第一条线行进一段距离 lambda 来到达该点,也可以通过沿第二条线行进 gamma 单位来到达该点。这为我们提供了两个 X 坐标联立方程:

X = v1 + lambda*d1 
X = v2 + gamma *d2

这些方程可以用矩阵形式表示。我们检查行列式是否非零,以查看交集 X 是否存在。

如果存在交集,那么我们必须检查交集是否确实位于两组点之间。如果 lambda 大于 1,则交点超出第二个点。如果 lambda 小于 0,则交点位于第一个点之前。

Hence, 0<lambda<1 && 0<gamma<1表明两条线相交!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试两条线是否相交 - JavaScript 函数 的相关文章

随机推荐