utils for trap/clipping

This commit is contained in:
Ruben van de Ven 2025-07-08 10:01:36 +02:00
parent fa3dc1d104
commit ad9c8d6d37

52
src/trap/utils.rs Normal file
View file

@ -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<usize> {
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)
}