我尝试寻找一个 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/