I need to compute the distance between two line segments in a project. After googling, I found this algorithm and used it to implement a Mathematica version:
distSegToSeg[{p1_, p2_}, {q1_, q2_}] :=
Module[{small = 10^(-6), u, v, w,
a, b, c, d, e, D,
sc, sN, sD,
tc, tN, tD},
u = p2 - p1;
v = q2 - q1;
w = p1 - q1;
a = u.u;
b = u.v;
c = v.v;
d = u.w;
e = v.w;
D = a*c - b*b;
sD = D;
tD = D;
If[D < small,
sN = 0; sD = 1; tN = e; tD = c,
sN = b*e - c*d;
tN = (a*e - b*d);
If[sN < 0,
sN = 0.0; tN = e; tD = c,
If[sN > sD, sN = sD; tN = e + b; tD = c;]]];
If[tN < 0,
tN = 0;
If[-d < 0,
sN = 0,
If[-d > a,
sN = sD,
sN = -d; sD = a]],
If[tN > tD,
tN = tD;
If[-d + b < 0,
sN = 0,
If[-d + b > a,
sN = sD,
sN = -d + b; sD = a]]]];
sc = If[Norm[sN] < small, 0, sN/sD];
tc = If[Norm[tN] < small, 0, tN/tD];
N[Norm[w + sc*u - tc*v]]
]
The code is not in good Mathematica style, and it's very slow. Do you have any idea to make this faster? Do you have a better way to compute the distance between two line segments in 3D?