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])
| 108 | /// |
| 109 | /// Returns the squared distance (avoid sqrt for comparison purposes). |
| 110 | pub 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. |
| 135 | pub fn segment_to_segment_dist_sq(a1: [f64; 2], a2: [f64; 2], b1: [f64; 2], b2: [f64; 2]) -> f64 { |
no outgoing calls