MCPcopy Create free account
hub / github.com/NodeDB-Lab/nodedb / point_to_segment_dist_sq

Function point_to_segment_dist_sq

nodedb-spatial/src/predicates/edge.rs:110–132  ·  view source on GitHub ↗

Minimum squared distance from a point to a line segment. Returns the squared distance (avoid sqrt for comparison purposes).

(pt: [f64; 2], seg_a: [f64; 2], seg_b: [f64; 2])

Source from the content-addressed store, hash-verified

108///
109/// Returns the squared distance (avoid sqrt for comparison purposes).
110pub fn point_to_segment_dist_sq(pt: [f64; 2], seg_a: [f64; 2], seg_b: [f64; 2]) -> f64 {
111 let dx = seg_b[0] - seg_a[0];
112 let dy = seg_b[1] - seg_a[1];
113 let len_sq = dx * dx + dy * dy;
114
115 if len_sq < 1e-20 {
116 // Degenerate segment (zero length) — distance to point.
117 let ex = pt[0] - seg_a[0];
118 let ey = pt[1] - seg_a[1];
119 return ex * ex + ey * ey;
120 }
121
122 // Project pt onto the line, clamped to [0, 1].
123 let t = ((pt[0] - seg_a[0]) * dx + (pt[1] - seg_a[1]) * dy) / len_sq;
124 let t = t.clamp(0.0, 1.0);
125
126 let proj_x = seg_a[0] + t * dx;
127 let proj_y = seg_a[1] + t * dy;
128
129 let ex = pt[0] - proj_x;
130 let ey = pt[1] - proj_y;
131 ex * ex + ey * ey
132}
133
134/// Minimum squared distance between two line segments.
135pub fn segment_to_segment_dist_sq(a1: [f64; 2], a2: [f64; 2], b1: [f64; 2], b2: [f64; 2]) -> f64 {

Callers 3

Calls

no outgoing calls

Tested by 2