function intersect(a, b, candidate) {
if (cartesianEqual(a.from, b.from) || cartesianEqual(a.from, b.to))
return a.from;
if (cartesianEqual(a.to, b.from) || cartesianEqual(a.to, b.to)) return a.to;
var axb = cartesianCross(a.normal, b.normal),
norm2 = cartesianDot(axb, axb);
cartesianNormalizeInPlace(axb);
if (candidate) return axb;
if (norm2 < 1e-30) return undefined;
var a0 = cartesianDot(axb, a.fromNormal),
a1 = cartesianDot(axb, a.toNormal),
b0 = cartesianDot(axb, b.fromNormal),
b1 = cartesianDot(axb, b.toNormal);
if (
(a0 > 0 && a1 < 0 && b0 > 0 && b1 < 0) ||
(a0 > 0 && cartesianEqual(axb, a.from)) ||
(a1 < 0 && cartesianEqual(axb, a.to)) ||
(b0 > 0 && cartesianEqual(axb, b.from)) ||
(b1 < 0 && cartesianEqual(axb, b.to))
)
return axb;
axb[0] = -axb[0];
axb[1] = -axb[1];
axb[2] = -axb[2];
a0 = -a0;
a1 = -a1;
b0 = -b0;
b1 = -b1;
if (
(a0 > 0 && a1 < 0 && b0 > 0 && b1 < 0) ||
(a0 > 0 && cartesianEqual(axb, a.from)) ||
(a1 < 0 && cartesianEqual(axb, a.to)) ||
(b0 > 0 && cartesianEqual(axb, b.from)) ||
(b1 < 0 && cartesianEqual(axb, b.to))
)
return axb;
return false;
}