From 50b7dc26b03cd962122ca9c467ee08d46f92e02f Mon Sep 17 00:00:00 2001 From: Mikolaj Wielgus Date: Tue, 17 Mar 2026 13:19:08 +0100 Subject: [PATCH] Use `Vector2` instead of `[i64; 2]` in `navmesher.rs` --- topola/src/navmesher.rs | 78 +++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/topola/src/navmesher.rs b/topola/src/navmesher.rs index 1d7e33f..a415f5d 100644 --- a/topola/src/navmesher.rs +++ b/topola/src/navmesher.rs @@ -9,17 +9,18 @@ use crate::{ math, Board, primitives::{Joint, JointId, Polygon, PolygonId, Segment, SegmentId, Via, ViaId}, + Vector2, }; #[derive(Clone, Debug, Getters)] pub struct LayerNavmesher { - boundary: Vec<[i64; 2]>, + boundary: Vec>, navmeshes: Vec>, inflation_factors: Vec, } impl LayerNavmesher { - pub fn new(boundary: impl IntoIterator) -> Self { + pub fn new(boundary: impl IntoIterator>) -> Self { Self { boundary: boundary.into_iter().collect(), navmeshes: vec![RecordingTriangulator::new()], @@ -27,31 +28,33 @@ impl LayerNavmesher { } } - pub fn insert_polygon(&mut self, polygon: impl IntoIterator) { - let polygon: Vec<[i64; 2]> = polygon.into_iter().collect(); + pub fn insert_polygon(&mut self, polygon: impl IntoIterator>) { + let polygon: Vec> = polygon.into_iter().collect(); for i in 0..self.navmeshes.len() { self.navmeshes[i].insert_polygon_and_rebuild( - Self::inflate_polygon(polygon.clone(), self.inflation_factors[i]), - self.boundary.clone(), + Self::inflate_polygon(polygon.clone(), self.inflation_factors[i]) + .into_iter() + .map(Into::into), + self.boundary.iter().cloned().map(Into::into), ); } } fn inflate_polygon( - polygon: impl IntoIterator, + polygon: Vec>, inflation_factor: f64, - ) -> impl IntoIterator { - let polygon: Vec<[i64; 2]> = polygon.into_iter().collect(); - + ) -> impl IntoIterator> { // Centroid. - let cx = polygon.iter().map(|p| p[0] as f64).sum::() / polygon.len() as f64; - let cy = polygon.iter().map(|p| p[1] as f64).sum::() / polygon.len() as f64; + let cx = polygon.iter().map(|p| p.x as f64).sum::() / polygon.len() as f64; + let cy = polygon.iter().map(|p| p.y as f64).sum::() / polygon.len() as f64; - polygon.into_iter().map(move |[px, py]| { + polygon.into_iter().map(move |p| { + let px = p.x as f64; + let py = p.y as f64; // Delta. - let dx = px as f64 - cx; - let dy = py as f64 - cy; + let dx = px - cx; + let dy = py - cy; let d = (dx * dx + dy * dy).sqrt(); // Normalize delta. @@ -59,14 +62,14 @@ impl LayerNavmesher { let ny = dy / d; // Shift away from centroid. - let fx = px as f64 + nx * inflation_factor; - let fy = py as f64 + ny * inflation_factor; + let fx = px + nx * inflation_factor; + let fy = py + ny * inflation_factor; // Round away from centroid. let rx = if fx >= cx { fx.ceil() } else { fx.floor() }; let ry = if fy >= cy { fy.ceil() } else { fy.floor() }; - [rx as i64, ry as i64] + Vector2::new(rx as i64, ry as i64) }) } } @@ -77,8 +80,8 @@ pub struct Navmesher { } impl Navmesher { - pub fn new(boundary: impl IntoIterator, layer_count: usize) -> Self { - let boundary: Vec<[i64; 2]> = boundary.into_iter().collect(); + pub fn new(boundary: impl IntoIterator>, layer_count: usize) -> Self { + let boundary: Vec> = boundary.into_iter().collect(); Self { layers: std::iter::repeat_with(|| LayerNavmesher::new(boundary.clone())) @@ -87,7 +90,7 @@ impl Navmesher { } } - pub fn insert_polygon(&mut self, layer: usize, polygon: impl IntoIterator) { + pub fn insert_polygon(&mut self, layer: usize, polygon: impl IntoIterator>) { self.layers[layer].insert_polygon(polygon); } } @@ -101,7 +104,11 @@ pub struct NavmesherBoard { impl NavmesherBoard { pub fn with_board(board: Board) -> Self { let mut navmesher = Navmesher::new( - board.layout().boundary().clone(), + board + .layout() + .boundary() + .iter() + .map(|p| Vector2::new(p[0], p[1])), *board.layout().layer_count(), ); @@ -129,20 +136,20 @@ impl NavmesherBoard { navmesher.insert_polygon(joint.layer, Self::joint_circumscribed_octagon(joint)); } - fn joint_circumscribed_octagon(joint: Joint) -> [[i64; 2]; 8] { + fn joint_circumscribed_octagon(joint: Joint) -> [Vector2; 8] { let cx = joint.position.x; let cy = joint.position.y; let r = joint.radius as i64; [ - [cx + r, cy + r / 2], - [cx + r / 2, cy + r], - [cx - r / 2, cy + r], - [cx - r, cy + r / 2], - [cx - r, cy - r / 2], - [cx - r / 2, cy - r], - [cx + r / 2, cy - r], - [cx + r, cy - r / 2], + Vector2::new(cx + r, cy + r / 2), + Vector2::new(cx + r / 2, cy + r), + Vector2::new(cx - r / 2, cy + r), + Vector2::new(cx - r, cy + r / 2), + Vector2::new(cx - r, cy - r / 2), + Vector2::new(cx - r / 2, cy - r), + Vector2::new(cx + r / 2, cy - r), + Vector2::new(cx + r, cy - r / 2), ] } @@ -169,9 +176,7 @@ impl NavmesherBoard { endpoints[1].x, endpoints[1].y, segment.half_width, - ) - .into_iter() - .map(Into::into), + ), ) } @@ -186,9 +191,6 @@ impl NavmesherBoard { } fn insert_polygon_in_navmesher(navmesher: &mut Navmesher, polygon: Polygon) { - navmesher.insert_polygon( - polygon.layer, - polygon.vertices.into_iter().map(Into::into), - ); + navmesher.insert_polygon(polygon.layer, polygon.vertices); } }