2D Point to Line Segment distance function
// Taken From: | |
// https://stackoverflow.com/questions/849211/shortest-distance-between-a-point-and-a-line-segment | |
function sqr (x) { | |
return x * x; | |
} | |
function dist2 (v, w) { | |
return sqr(v[0] - w[0]) + sqr(v[1] - w[1]); | |
} | |
// p - point | |
// v - start point of segment | |
// w - end point of segment | |
function distToSegmentSquared (p, v, w) { | |
var l2 = dist2(v, w); | |
if (l2 === 0) return dist2(p, v); | |
var t = ((p[0] - v[0]) * (w[0] - v[0]) + (p[1] - v[1]) * (w[1] - v[1])) / l2; | |
t = Math.max(0, Math.min(1, t)); | |
return dist2(p, [ v[0] + t * (w[0] - v[0]), v[1] + t * (w[1] - v[1]) ]); | |
} | |
// p - point | |
// v - start point of segment | |
// w - end point of segment | |
function distToSegment (p, v, w) { | |
return Math.sqrt(distToSegmentSquared(p, v, w)); | |
} | |
module.exports = distToSegment; | |
module.exports.squared = distToSegmentSquared; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This comment has been minimized.
Handy snippet thanks!
Here's the same thing modified to reuse partial results and accept data structures instead of lists: