From b7610f2e5fc63b0c11019217edb62620ec53a8b1 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Thu, 23 Jan 2025 21:52:34 +0100 Subject: [PATCH] Make construction of side faces more generic --- experiments/2024-12-09/src/model.rs | 28 ++++++++++----------- experiments/2024-12-09/src/topology/face.rs | 9 +++++++ 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/experiments/2024-12-09/src/model.rs b/experiments/2024-12-09/src/model.rs index 6dd41db55..249779657 100644 --- a/experiments/2024-12-09/src/model.rs +++ b/experiments/2024-12-09/src/model.rs @@ -1,5 +1,3 @@ -use itertools::Itertools; - use crate::{ geometry::{AnyOp, Sketch}, math::{Bivector, Plane, Point, Vector}, @@ -30,21 +28,21 @@ pub fn model() -> AnyOp { &mut stores.vertices, ); - let [a, b, c, d] = bottom.vertices().collect_array().unwrap(); - let [e, f, g, h] = top.vertices().collect_array().unwrap(); - - let [left, right, front, back] = - [[a, e, h, d], [b, c, g, f], [a, b, f, e], [c, d, h, g]].map( - |[q, r, s, t]| { - let surface = stores.surfaces.insert(Plane::from_points( - [q, r, s].map(|vertex| vertex.point), - )); - Face::new(surface, [q, r, s, t].map(|vertex| vertex.clone())) - }, - ); + let side_faces = bottom + .half_edges() + .zip(top.half_edges()) + .map(|([q, r], [t, s])| { + let surface = stores.surfaces.insert(Plane::from_points( + [q, r, s].map(|vertex| vertex.point), + )); + Face::new(surface, [q, r, s, t].map(|vertex| vertex.clone())) + }) + .collect::>(); let solid = Solid::new( - [bottom, top, left, right, front, back] + [bottom, top] + .into_iter() + .chain(side_faces) .map(|face| stores.faces.insert(face)), ); diff --git a/experiments/2024-12-09/src/topology/face.rs b/experiments/2024-12-09/src/topology/face.rs index 431793833..1f5ba6def 100644 --- a/experiments/2024-12-09/src/topology/face.rs +++ b/experiments/2024-12-09/src/topology/face.rs @@ -1,3 +1,4 @@ +use itertools::Itertools; use spade::Triangulation; use crate::{ @@ -25,10 +26,18 @@ impl Face { } } + #[allow(unused)] // fell out of use, but will likely be required again pub fn vertices(&self) -> impl Iterator> { self.vertices.iter() } + pub fn half_edges(&self) -> impl Iterator; 2]> { + self.vertices + .iter() + .circular_tuple_windows() + .map(|(a, b)| [a, b]) + } + pub fn flip(&self, surfaces: &mut Store) -> Self { Self { surface: surfaces.insert(self.surface.flip()),