// 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
表明两条线相交!