function segmentDistance(p, q) {
let u = vec(p[0], p[1]);
let v = vec(q[0], q[1]);
let a = dot(u, u);
let b = dot(u, v);
let c = dot(v, v);
let w0 = sub(p[0], q[0]);
let d = dot(u, w0);
let e = dot(v, w0);
let denominator = a * c - b * b;
let sc = 0;
let tc = 0;
let sN = 0;
let tN = 0;
let sD = denominator;
let tD = denominator;
if (denominator == 0) {
sD = 1;
tN = d;
tD = b;
} else {
sN = (b * e - c * d);
tN = (a * e - b * d);
if (sN < 0) {
sN = 0;
tN = e;
tD = c;
} else if (sN > sD) {
sN = sD;
tN = e + b;
tD = c;
}
}
if (tN < 0.0) {
tN = 0.0;
if (-d < 0.0)
sN = 0.0;
else if (-d > a)
sN = sD;
else {
sN = -d;
sD = a;
}
} else if (tN > tD) {
tN = tD;
if ((-d + b) < 0.0)
sN = 0;
else if ((-d + b) > a)
sN = sD;
else {
sN = (-d + b);
sD = a;
}
}
sc = sN / sD;
tc = tN / tD;
return abs(add(sub(p[0], q[0]), sub(mul(sc, u), mul(tc, v))));
}