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

标签 javascript collision-detection intersection line-intersection

我尝试寻找一个 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,则交点位于第一个点之前。

因此,0<lambda<1 && 0<gamma<1表示两条线相交!

关于javascript - 测试两条线是否相交 - JavaScript 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9043805/

相关文章:

javascript - 为什么在新实例上调用方法?

javascript - 为什么我不能在 jQuery 中点击()链接?

javascript - 为什么更改子组件中的状态(基于 Prop )会影响 Prop ?

ios - SpriteKit 检测多次碰撞而不是一次(Swift 3)

c++ - 处理与 TriggerSphere 和其他 Actor 的重叠?

javascript - 用于将 2D 多边形横截面转换为 1D 几何图形的工具或库?

3d - 无限锥面*AABB相交测试

ruby - (Ruby) 如果数组交集运算符 ( & ) 效率低下,为什么它可用?

javascript - jquery + html 标签

C# 碰撞编程 - Momentum