From ad9c8d6d37721efe623bc56a0e2650b2485337f2 Mon Sep 17 00:00:00 2001 From: Ruben van de Ven Date: Tue, 8 Jul 2025 10:01:36 +0200 Subject: [PATCH] utils for trap/clipping --- src/trap/utils.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/trap/utils.rs diff --git a/src/trap/utils.rs b/src/trap/utils.rs new file mode 100644 index 0000000..703857b --- /dev/null +++ b/src/trap/utils.rs @@ -0,0 +1,52 @@ +// GPT generated code is isolated to this file +use geo::{Coordinate, Line, Point, Polygon, prelude::*}; + +/////////////////////// +// Clip filter related +/////////////////////// + +// find distance of edge do point (used by GUI) +pub fn point_to_segment_distance_squared(p: [f32; 2], a: [f32; 2], b: [f32; 2]) -> f32 { + let ab = [b[0] - a[0], b[1] - a[1]]; + let ap = [p[0] - a[0], p[1] - a[1]]; + let ab_len_sq = ab[0] * ab[0] + ab[1] * ab[1]; + + if ab_len_sq == 0.0 { + // Edge is a single point + return ap[0] * ap[0] + ap[1] * ap[1]; + } + + // Project point onto segment, clamped to [0,1] + let t = ((ap[0] * ab[0] + ap[1] * ab[1]) / ab_len_sq).clamp(0.0, 1.0); + let closest = [a[0] + t * ab[0], a[1] + t * ab[1]]; + + let dx = p[0] - closest[0]; + let dy = p[1] - closest[1]; + dx * dx + dy * dy +} + + +// find distance of edge do point (used by GUI) +pub fn closest_edge(mask: &[[f32; 2]], target: [f32; 2]) -> Option { + if mask.len() < 2 { + return None; + } + + let mut min_dist_sq = f32::MAX; + let mut closest_edge_index = 0; + + for i in 0..mask.len() { + let a = mask[i]; + let b = mask[(i + 1) % mask.len()]; + let dist_sq = point_to_segment_distance_squared(target, a, b); + + if dist_sq < min_dist_sq { + min_dist_sq = dist_sq; + closest_edge_index = i; + } + } + + Some(closest_edge_index) +} + +