lineLineMinimumPoints method
List<Vector3>
lineLineMinimumPoints(
- dynamic line1,
- dynamic line2
)
Implementation
List<Vector3> lineLineMinimumPoints(line1, line2) {
Vector3 r = _v1.copy(line1.end).sub(line1.start);
Vector3 s = _v2.copy(line2.end).sub(line2.start);
Vector3 w = _v3.copy(line2.start).sub(line1.start);
num a = r.dot(s), b = r.dot(r), c = s.dot(s), d = s.dot(w), e = r.dot(w);
double t1;
double t2;
num divisor = b * c - a * a;
if (Math.abs(divisor) < eps) {
double d1 = -d / c;
double d2 = (a - d) / c;
if (Math.abs(d1 - 0.5) < Math.abs(d2 - 0.5)) {
t1 = 0;
t2 = d1;
} else {
t1 = 1;
t2 = d2;
}
} else {
t1 = (d * a + e * c) / divisor;
t2 = (t1 * a - d) / c;
}
t2 = Math.max(0, Math.min(1, t2));
t1 = Math.max(0, Math.min(1, t1));
Vector3 point1 = r.multiplyScalar(t1).add(line1.start);
Vector3 point2 = s.multiplyScalar(t2).add(line2.start);
return [point1, point2];
}