Published
Edited
Mar 16, 2020
Importers
Insert cell
md`# Segment Distance
Transliteration from http://geomalgorithms.com/a07-_distance.html#dist3D_Segment_to_Segment()
`
Insert cell
function dot(v1, v2) {
let sum = 0;
for (var i = 0; i < 3; i++) {
sum += v1[i] * v2[i];
}
return sum;
}
Insert cell
function mul(x, v) {
let result = [0, 0, 0]
for (var i = 0; i < 3; i++) {
result[i] = x * v[i];
}
return result;
}
Insert cell
mul(0, [1, 2, 3])
Insert cell
function abs(v) {
let sum = 0;
for (var i = 0; i < 3; i++) {
sum += v[i] * v[i];
}
return Math.sqrt(sum);
}
Insert cell
abs([1, 1, 1])
Insert cell
function vOp(p1, p2, f) {
let result = [0, 0, 0]
for (var i = 0; i < 3; i++) {
result[i] = f(p1[i], p2[i]);
}
return result;
}
Insert cell
function vec(p1, p2) {
return vOp(p1, p2, (a, b) => b - a);
}
Insert cell
function sub(p1, p2) {
return vOp(p1, p2, (a, b) => a - b);
}
Insert cell
function add(p1, p2) {
return vOp(p1, p2, (a, b) => a + b);
}
Insert cell
dot([1, 2, 3], [2, 3, 4]) == 20
Insert cell
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))));
}
Insert cell
segmentDistance(
[ [0,0,0], [0,0,1] ],
[ [1, 1, 0], [1, 1, 1] ],
)
Insert cell
segmentDistance(
[ [0,0,0], [1,1,1] ],
[ [2,2,0], [2,2,2] ]
)
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more