From 4859887a5d1cd4e1218fd1ce7fcba9b8f028e0e5 Mon Sep 17 00:00:00 2001 From: Alain Emilia Anna Zscheile Date: Wed, 11 Dec 2024 13:01:47 +0100 Subject: [PATCH] refactor: DRY/factor out BendShape::render_discretization --- crates/topola-egui/src/painter.rs | 21 +++++---------------- src/geometry/primitive.rs | 10 ++++++++++ src/specctra/design.rs | 16 +++------------- 3 files changed, 18 insertions(+), 29 deletions(-) diff --git a/crates/topola-egui/src/painter.rs b/crates/topola-egui/src/painter.rs index d2ff695..4d4368f 100644 --- a/crates/topola-egui/src/painter.rs +++ b/crates/topola-egui/src/painter.rs @@ -36,26 +36,15 @@ impl<'a> Painter<'a> { ], egui::Stroke::new(seg.width as f32 * self.transform.scaling, color), ), - PrimitiveShape::Bend(bend) => { - let circle = bend.circle(); - - let angle_from = bend.start_angle(); - let angle_step = bend.spanned_angle() / 100.0; - - let points = (0..=100) - .into_iter() - .map(|i| circle.position_at_angle(angle_from + i as f64 * angle_step)) + PrimitiveShape::Bend(bend) => egui::Shape::line( + bend.render_discretization(101) .map(|point| { self.transform .mul_pos([point.0.x as f32, -point.0.y as f32].into()) }) - .collect(); - - egui::Shape::line( - points, - egui::Stroke::new(bend.width as f32 * self.transform.scaling, color), - ) - } + .collect(), + egui::Stroke::new(bend.width as f32 * self.transform.scaling, color), + ), }; self.ui.painter().add(epaint_shape); diff --git a/src/geometry/primitive.rs b/src/geometry/primitive.rs index 2c3f324..b04be08 100644 --- a/src/geometry/primitive.rs +++ b/src/geometry/primitive.rs @@ -296,6 +296,16 @@ impl BendShape { angle } } + + /// Render this bend as a list of points on its circle. + pub fn render_discretization(&self, point_count: usize) -> impl Iterator + '_ { + let circle = self.circle(); + let angle_from = self.start_angle(); + // we need to use one less than the whole point count + // because we need to also emit the end-point + let angle_step = self.spanned_angle() / ((point_count - 1) as f64); + (0..point_count).map(move |i| circle.position_at_angle(angle_from + i as f64 * angle_step)) + } } impl MeasureLength for BendShape { diff --git a/src/specctra/design.rs b/src/specctra/design.rs index ba0882b..b899aef 100644 --- a/src/specctra/design.rs +++ b/src/specctra/design.rs @@ -94,19 +94,9 @@ impl SpecctraDesign { // line segments. // TODO: make this configurable? pick a smarter value? let segment_count: usize = 100; - - let circle = bend.circle(); - let angle_from = bend.start_angle(); - let angle_step = bend.spanned_angle() / segment_count as f64; - - (0..=segment_count) - .into_iter() - .map(|i| { - circle - .position_at_angle(angle_from + i as f64 * angle_step) - .into() - }) - .collect::>() + bend.render_discretization(segment_count + 1) + .map(Into::into) + .collect() } // Intentionally skipped for now.