From 74823211cd92a0a9ffd25b97140769421e0971e6 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 28 Feb 2023 17:50:15 +0100 Subject: [PATCH 01/10] Add `PartialHalfEdge::start_vertex` --- crates/fj-kernel/src/partial/objects/edge.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/crates/fj-kernel/src/partial/objects/edge.rs b/crates/fj-kernel/src/partial/objects/edge.rs index 5c4ad3c8b..45808b722 100644 --- a/crates/fj-kernel/src/partial/objects/edge.rs +++ b/crates/fj-kernel/src/partial/objects/edge.rs @@ -25,6 +25,13 @@ pub struct PartialHalfEdge { pub global_form: Partial, } +impl PartialHalfEdge { + /// Compute the surface position where the half-edge starts + pub fn start_position(&self) -> Option> { + self.start_vertex.read().position + } +} + impl PartialObject for PartialHalfEdge { type Full = HalfEdge; From de99e8dd8bd7f25d098c3a716df2f5cb9d8eb148 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 28 Feb 2023 17:54:00 +0100 Subject: [PATCH 02/10] Prepare code for follow-on change --- crates/fj-kernel/src/builder/edge.rs | 26 ++++++++++++++++---------- crates/fj-operations/src/sketch.rs | 2 +- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/crates/fj-kernel/src/builder/edge.rs b/crates/fj-kernel/src/builder/edge.rs index b061d3ecb..ab099c344 100644 --- a/crates/fj-kernel/src/builder/edge.rs +++ b/crates/fj-kernel/src/builder/edge.rs @@ -27,7 +27,7 @@ pub trait HalfEdgeBuilder { fn update_as_arc( &mut self, angle_rad: impl Into, - next_vertex: Partial, + next_half_edge: Partial, ); /// Update partial half-edge to be a line segment, from the given points @@ -104,18 +104,21 @@ impl HalfEdgeBuilder for PartialHalfEdge { fn update_as_arc( &mut self, angle_rad: impl Into, - mut next_vertex: Partial, + mut next_half_edge: Partial, ) { let angle_rad = angle_rad.into(); if angle_rad <= -Scalar::TAU || angle_rad >= Scalar::TAU { panic!("arc angle must be in the range (-2pi, 2pi) radians"); } - let [start, end] = [&self.start_vertex, &next_vertex].map(|vertex| { - vertex - .read() - .position - .expect("Can't infer arc without surface position") - }); + let [start, end] = + [&self.start_vertex, &next_half_edge.read().start_vertex].map( + |vertex| { + vertex + .read() + .position + .expect("Can't infer arc without surface position") + }, + ); let arc = fj_math::Arc::from_endpoints_and_angle(start, end, angle_rad); @@ -128,7 +131,10 @@ impl HalfEdgeBuilder for PartialHalfEdge { for ((point_boundary, surface_vertex), point_curve) in self .boundary .each_mut_ext() - .zip_ext([&mut self.start_vertex, &mut next_vertex]) + .zip_ext([ + &mut self.start_vertex, + &mut next_half_edge.write().start_vertex, + ]) .zip_ext([a_curve, b_curve]) { *point_boundary = Some(point_curve); @@ -136,7 +142,7 @@ impl HalfEdgeBuilder for PartialHalfEdge { Some(path.point_from_path_coords(point_curve)); } - self.infer_global_form(next_vertex); + self.infer_global_form(next_half_edge.read().start_vertex.clone()); } fn update_as_line_segment_from_points( diff --git a/crates/fj-operations/src/sketch.rs b/crates/fj-operations/src/sketch.rs index 6a1acbec2..2bebdb381 100644 --- a/crates/fj-operations/src/sketch.rs +++ b/crates/fj-operations/src/sketch.rs @@ -85,7 +85,7 @@ impl Shape for fj::Sketch { fj::SketchSegmentRoute::Arc { angle } => { half_edge .write() - .update_as_arc(angle.rad(), next_vertex); + .update_as_arc(angle.rad(), next_half_edge); } } } From 4ed8d244fcaa49dbd2ca56f5da546d23f6664eea Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 28 Feb 2023 17:55:12 +0100 Subject: [PATCH 03/10] Replace access of `PartialSurfaceVertex` position --- crates/fj-kernel/src/builder/edge.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/crates/fj-kernel/src/builder/edge.rs b/crates/fj-kernel/src/builder/edge.rs index ab099c344..a1692602e 100644 --- a/crates/fj-kernel/src/builder/edge.rs +++ b/crates/fj-kernel/src/builder/edge.rs @@ -110,15 +110,13 @@ impl HalfEdgeBuilder for PartialHalfEdge { if angle_rad <= -Scalar::TAU || angle_rad >= Scalar::TAU { panic!("arc angle must be in the range (-2pi, 2pi) radians"); } - let [start, end] = - [&self.start_vertex, &next_half_edge.read().start_vertex].map( - |vertex| { - vertex - .read() - .position - .expect("Can't infer arc without surface position") - }, - ); + let [start, end] = [ + &self.start_position(), + &next_half_edge.read().start_position(), + ] + .map(|position| { + position.expect("Can't infer arc without surface position") + }); let arc = fj_math::Arc::from_endpoints_and_angle(start, end, angle_rad); From 0dcc0522fa185d8bf2338c27102d5aac4e7df78e Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 28 Feb 2023 18:11:01 +0100 Subject: [PATCH 04/10] Prepare tests for follow-on change --- .../fj-kernel/src/algorithms/approx/edge.rs | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/approx/edge.rs b/crates/fj-kernel/src/algorithms/approx/edge.rs index 95bc0f724..f8899ed87 100644 --- a/crates/fj-kernel/src/algorithms/approx/edge.rs +++ b/crates/fj-kernel/src/algorithms/approx/edge.rs @@ -231,10 +231,12 @@ mod tests { use crate::{ algorithms::approx::{path::RangeOnPath, Approx, ApproxPoint}, - builder::{HalfEdgeBuilder, SurfaceBuilder}, + builder::{CycleBuilder, HalfEdgeBuilder, SurfaceBuilder}, geometry::curve::GlobalPath, insert::Insert, - partial::{PartialHalfEdge, PartialObject, PartialSurface}, + partial::{ + PartialCycle, PartialHalfEdge, PartialObject, PartialSurface, + }, services::Services, }; @@ -244,17 +246,16 @@ mod tests { let surface = services.objects.surfaces.xz_plane(); let half_edge = { - let mut half_edge = PartialHalfEdge::default(); + let mut cycle = PartialCycle::default(); - half_edge.update_as_line_segment_from_points( - [[1., 1.], [2., 1.]], - half_edge.end_vertex.clone(), - ); - half_edge.infer_vertex_positions_if_necessary( + let [mut half_edge, next_half_edge, _] = cycle + .update_as_polygon_from_points([[1., 1.], [2., 1.], [1., 2.]]); + half_edge.write().infer_vertex_positions_if_necessary( &surface.geometry(), - half_edge.end_vertex.clone(), + next_half_edge.read().start_vertex.clone(), ); + let half_edge = half_edge.read().clone(); half_edge .build(&mut services.objects) .insert(&mut services.objects) @@ -277,17 +278,16 @@ mod tests { .build(&mut services.objects) .insert(&mut services.objects); let half_edge = { - let mut half_edge = PartialHalfEdge::default(); + let mut cycle = PartialCycle::default(); - half_edge.update_as_line_segment_from_points( - [[1., 1.], [2., 1.]], - half_edge.end_vertex.clone(), - ); - half_edge.infer_vertex_positions_if_necessary( + let [mut half_edge, next_half_edge, _] = cycle + .update_as_polygon_from_points([[1., 1.], [2., 1.], [1., 2.]]); + half_edge.write().infer_vertex_positions_if_necessary( &surface.geometry(), - half_edge.end_vertex.clone(), + next_half_edge.read().start_vertex.clone(), ); + let half_edge = half_edge.read().clone(); half_edge .build(&mut services.objects) .insert(&mut services.objects) @@ -310,21 +310,20 @@ mod tests { .build(&mut services.objects) .insert(&mut services.objects); let half_edge = { - let mut half_edge = PartialHalfEdge::default(); + let mut cycle = PartialCycle::default(); - half_edge.update_as_line_segment_from_points( - [[0., 1.], [1., 1.]], - half_edge.end_vertex.clone(), - ); + let [mut half_edge, next_half_edge, _] = cycle + .update_as_polygon_from_points([[0., 1.], [1., 1.], [1., 2.]]); - half_edge.boundary[0] = Some(range.boundary[0]); - half_edge.boundary[1] = Some(range.boundary[1]); + half_edge.write().boundary[0] = Some(range.boundary[0]); + half_edge.write().boundary[1] = Some(range.boundary[1]); - half_edge.infer_vertex_positions_if_necessary( + half_edge.write().infer_vertex_positions_if_necessary( &surface.geometry(), - half_edge.end_vertex.clone(), + next_half_edge.read().start_vertex.clone(), ); + let half_edge = half_edge.read().clone(); half_edge .build(&mut services.objects) .insert(&mut services.objects) From 816cceb2101339607dce23fc97af5e1fd5dce07d Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 28 Feb 2023 18:17:17 +0100 Subject: [PATCH 05/10] Prepare tests for follow-on change --- .../src/algorithms/intersect/curve_edge.rs | 64 ++++++++++--------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/intersect/curve_edge.rs b/crates/fj-kernel/src/algorithms/intersect/curve_edge.rs index 05f5f363c..ae5b67fd4 100644 --- a/crates/fj-kernel/src/algorithms/intersect/curve_edge.rs +++ b/crates/fj-kernel/src/algorithms/intersect/curve_edge.rs @@ -72,9 +72,9 @@ mod tests { use fj_math::Point; use crate::{ - builder::HalfEdgeBuilder, + builder::{CycleBuilder, HalfEdgeBuilder}, geometry::curve::Curve, - partial::{PartialHalfEdge, PartialObject}, + partial::PartialCycle, services::Services, }; @@ -87,14 +87,13 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); let curve = Curve::u_axis(); let half_edge = { - let mut half_edge = PartialHalfEdge::default(); - half_edge.update_as_line_segment_from_points( - [[1., -1.], [1., 1.]], - half_edge.end_vertex.clone(), - ); - half_edge.infer_vertex_positions_if_necessary( + let mut cycle = PartialCycle::default(); + + let [mut half_edge, next_half_edge, _] = cycle + .update_as_polygon_from_points([[1., -1.], [1., 1.], [0., 1.]]); + half_edge.write().infer_vertex_positions_if_necessary( &surface.geometry(), - half_edge.end_vertex.clone(), + next_half_edge.read().start_vertex.clone(), ); half_edge.build(&mut services.objects) @@ -117,14 +116,17 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); let curve = Curve::u_axis(); let half_edge = { - let mut half_edge = PartialHalfEdge::default(); - half_edge.update_as_line_segment_from_points( - [[-1., -1.], [-1., 1.]], - half_edge.end_vertex.clone(), - ); - half_edge.infer_vertex_positions_if_necessary( + let mut cycle = PartialCycle::default(); + + let [mut half_edge, next_half_edge, _] = cycle + .update_as_polygon_from_points([ + [-1., -1.], + [-1., 1.], + [0., 1.], + ]); + half_edge.write().infer_vertex_positions_if_necessary( &surface.geometry(), - half_edge.end_vertex.clone(), + next_half_edge.read().start_vertex.clone(), ); half_edge.build(&mut services.objects) @@ -147,14 +149,17 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); let curve = Curve::u_axis(); let half_edge = { - let mut half_edge = PartialHalfEdge::default(); - half_edge.update_as_line_segment_from_points( - [[-1., -1.], [1., -1.]], - half_edge.end_vertex.clone(), - ); - half_edge.infer_vertex_positions_if_necessary( + let mut cycle = PartialCycle::default(); + + let [mut half_edge, next_half_edge, _] = cycle + .update_as_polygon_from_points([ + [-1., -1.], + [1., -1.], + [1., 1.], + ]); + half_edge.write().infer_vertex_positions_if_necessary( &surface.geometry(), - half_edge.end_vertex.clone(), + next_half_edge.read().start_vertex.clone(), ); half_edge.build(&mut services.objects) @@ -172,14 +177,13 @@ mod tests { let surface = services.objects.surfaces.xy_plane(); let curve = Curve::u_axis(); let half_edge = { - let mut half_edge = PartialHalfEdge::default(); - half_edge.update_as_line_segment_from_points( - [[-1., 0.], [1., 0.]], - half_edge.end_vertex.clone(), - ); - half_edge.infer_vertex_positions_if_necessary( + let mut cycle = PartialCycle::default(); + + let [mut half_edge, next_half_edge, _] = cycle + .update_as_polygon_from_points([[-1., 0.], [1., 0.], [1., 1.]]); + half_edge.write().infer_vertex_positions_if_necessary( &surface.geometry(), - half_edge.end_vertex.clone(), + next_half_edge.read().start_vertex.clone(), ); half_edge.build(&mut services.objects) From b7a17c68cc5bd3a0baee172435493ab272a7960d Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 28 Feb 2023 18:22:32 +0100 Subject: [PATCH 06/10] Prepare test for follow-on change --- crates/fj-kernel/src/objects/full/edge.rs | 31 +++++++++++------------ 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/crates/fj-kernel/src/objects/full/edge.rs b/crates/fj-kernel/src/objects/full/edge.rs index a40b1b193..23c476171 100644 --- a/crates/fj-kernel/src/objects/full/edge.rs +++ b/crates/fj-kernel/src/objects/full/edge.rs @@ -177,8 +177,8 @@ mod tests { use pretty_assertions::assert_eq; use crate::{ - builder::HalfEdgeBuilder, - partial::{PartialHalfEdge, PartialObject}, + builder::{CycleBuilder, HalfEdgeBuilder}, + partial::PartialCycle, services::Services, }; @@ -190,29 +190,28 @@ mod tests { let a = [0., 0.]; let b = [1., 0.]; + let c = [0., 1.]; let a_to_b = { - let mut half_edge = PartialHalfEdge::default(); - half_edge.update_as_line_segment_from_points( - [a, b], - half_edge.end_vertex.clone(), - ); - half_edge.infer_vertex_positions_if_necessary( + let mut cycle = PartialCycle::default(); + + let [mut half_edge, next_half_edge, _] = + cycle.update_as_polygon_from_points([a, b, c]); + half_edge.write().infer_vertex_positions_if_necessary( &surface.geometry(), - half_edge.end_vertex.clone(), + next_half_edge.read().start_vertex.clone(), ); half_edge.build(&mut services.objects) }; let b_to_a = { - let mut half_edge = PartialHalfEdge::default(); - half_edge.update_as_line_segment_from_points( - [b, a], - half_edge.end_vertex.clone(), - ); - half_edge.infer_vertex_positions_if_necessary( + let mut cycle = PartialCycle::default(); + + let [mut half_edge, next_half_edge, _] = + cycle.update_as_polygon_from_points([b, a, c]); + half_edge.write().infer_vertex_positions_if_necessary( &surface.geometry(), - half_edge.end_vertex.clone(), + next_half_edge.read().start_vertex.clone(), ); half_edge.build(&mut services.objects) From 651fd626e233e07aad89ce33df032c3292a0bc0b Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 28 Feb 2023 18:25:16 +0100 Subject: [PATCH 07/10] Prepare tests for follow-on change --- crates/fj-kernel/src/validate/edge.rs | 30 +++++++++++++-------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/crates/fj-kernel/src/validate/edge.rs b/crates/fj-kernel/src/validate/edge.rs index cd8709ad1..d473182e5 100644 --- a/crates/fj-kernel/src/validate/edge.rs +++ b/crates/fj-kernel/src/validate/edge.rs @@ -143,9 +143,9 @@ mod tests { use fj_math::Point; use crate::{ - builder::HalfEdgeBuilder, + builder::{CycleBuilder, HalfEdgeBuilder}, objects::HalfEdge, - partial::{Partial, PartialHalfEdge, PartialObject}, + partial::{Partial, PartialCycle}, services::Services, validate::Validate, }; @@ -157,14 +157,13 @@ mod tests { let valid = { let surface = services.objects.surfaces.xy_plane(); - let mut half_edge = PartialHalfEdge::default(); - half_edge.update_as_line_segment_from_points( - [[0., 0.], [1., 0.]], - half_edge.end_vertex.clone(), - ); - half_edge.infer_vertex_positions_if_necessary( + let mut cycle = PartialCycle::default(); + + let [mut half_edge, next_half_edge, _] = cycle + .update_as_polygon_from_points([[0., 0.], [1., 0.], [1., 1.]]); + half_edge.write().infer_vertex_positions_if_necessary( &surface.geometry(), - half_edge.end_vertex.clone(), + next_half_edge.read().start_vertex.clone(), ); half_edge.build(&mut services.objects) @@ -208,14 +207,13 @@ mod tests { let valid = { let surface = services.objects.surfaces.xy_plane(); - let mut half_edge = PartialHalfEdge::default(); - half_edge.update_as_line_segment_from_points( - [[0., 0.], [1., 0.]], - half_edge.end_vertex.clone(), - ); - half_edge.infer_vertex_positions_if_necessary( + let mut cycle = PartialCycle::default(); + + let [mut half_edge, next_half_edge, _] = cycle + .update_as_polygon_from_points([[0., 0.], [1., 0.], [1., 1.]]); + half_edge.write().infer_vertex_positions_if_necessary( &surface.geometry(), - half_edge.end_vertex.clone(), + next_half_edge.read().start_vertex.clone(), ); half_edge.build(&mut services.objects) From 6c4f02f1045aac32c9a1e0847389cd0a55f0c384 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 28 Feb 2023 18:27:34 +0100 Subject: [PATCH 08/10] Remove unused `HalfEdgeBuilder` method --- crates/fj-kernel/src/builder/edge.rs | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/crates/fj-kernel/src/builder/edge.rs b/crates/fj-kernel/src/builder/edge.rs index a1692602e..a1f2e0582 100644 --- a/crates/fj-kernel/src/builder/edge.rs +++ b/crates/fj-kernel/src/builder/edge.rs @@ -30,13 +30,6 @@ pub trait HalfEdgeBuilder { next_half_edge: Partial, ); - /// Update partial half-edge to be a line segment, from the given points - fn update_as_line_segment_from_points( - &mut self, - points: [impl Into>; 2], - next_vertex: Partial, - ) -> Curve; - /// Update partial half-edge to be a line segment fn update_as_line_segment( &mut self, @@ -143,21 +136,6 @@ impl HalfEdgeBuilder for PartialHalfEdge { self.infer_global_form(next_half_edge.read().start_vertex.clone()); } - fn update_as_line_segment_from_points( - &mut self, - points: [impl Into>; 2], - mut next_vertex: Partial, - ) -> Curve { - for (vertex, point) in - [&mut self.start_vertex, &mut next_vertex].zip_ext(points) - { - let mut surface_form = vertex.write(); - surface_form.position = Some(point.into()); - } - - self.update_as_line_segment(next_vertex) - } - fn update_as_line_segment( &mut self, next_vertex: Partial, From 3fd82aa828ed3c60e4aa6768001b2521508deba0 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 28 Feb 2023 18:30:28 +0100 Subject: [PATCH 09/10] Prepare code for follow-on change --- crates/fj-kernel/src/algorithms/sweep/edge.rs | 3 +-- crates/fj-kernel/src/builder/cycle.rs | 4 +--- crates/fj-kernel/src/builder/edge.rs | 20 ++++++++++--------- crates/fj-operations/src/sketch.rs | 5 +---- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/crates/fj-kernel/src/algorithms/sweep/edge.rs b/crates/fj-kernel/src/algorithms/sweep/edge.rs index d3de6176a..6cb9a21e9 100644 --- a/crates/fj-kernel/src/algorithms/sweep/edge.rs +++ b/crates/fj-kernel/src/algorithms/sweep/edge.rs @@ -128,8 +128,7 @@ impl Sweep for (Handle, &Handle, &Surface, Color) { .into_iter() .circular_tuple_windows() { - edge.write() - .update_as_line_segment(next.read().start_vertex.clone()); + edge.write().update_as_line_segment(next.clone()); } // Finally, we can make sure that all edges refer to the correct global diff --git a/crates/fj-kernel/src/builder/cycle.rs b/crates/fj-kernel/src/builder/cycle.rs index 4fb5e7659..f11b06f17 100644 --- a/crates/fj-kernel/src/builder/cycle.rs +++ b/crates/fj-kernel/src/builder/cycle.rs @@ -140,9 +140,7 @@ impl CycleBuilder for PartialCycle { for (mut half_edge, next) in self.half_edges.iter().cloned().circular_tuple_windows() { - half_edge - .write() - .update_as_line_segment(next.read().start_vertex.clone()); + half_edge.write().update_as_line_segment(next.clone()); } } diff --git a/crates/fj-kernel/src/builder/edge.rs b/crates/fj-kernel/src/builder/edge.rs index a1f2e0582..097964e1c 100644 --- a/crates/fj-kernel/src/builder/edge.rs +++ b/crates/fj-kernel/src/builder/edge.rs @@ -33,7 +33,7 @@ pub trait HalfEdgeBuilder { /// Update partial half-edge to be a line segment fn update_as_line_segment( &mut self, - next_vertex: Partial, + next_half_edge: Partial, ) -> Curve; /// Infer the global form of the half-edge @@ -138,15 +138,17 @@ impl HalfEdgeBuilder for PartialHalfEdge { fn update_as_line_segment( &mut self, - next_vertex: Partial, + next_half_edge: Partial, ) -> Curve { let boundary = self.boundary; - let points_surface = [&self.start_vertex, &next_vertex].map(|vertex| { - vertex - .read() - .position - .expect("Can't infer line segment without surface position") - }); + let points_surface = + [&self.start_vertex, &next_half_edge.read().start_vertex].map( + |vertex| { + vertex.read().position.expect( + "Can't infer line segment without surface position", + ) + }, + ); let path = if let [Some(start), Some(end)] = boundary { let points = [start, end].zip_ext(points_surface); @@ -168,7 +170,7 @@ impl HalfEdgeBuilder for PartialHalfEdge { path }; - self.infer_global_form(next_vertex); + self.infer_global_form(next_half_edge.read().start_vertex.clone()); path } diff --git a/crates/fj-operations/src/sketch.rs b/crates/fj-operations/src/sketch.rs index 2bebdb381..f102b0032 100644 --- a/crates/fj-operations/src/sketch.rs +++ b/crates/fj-operations/src/sketch.rs @@ -73,14 +73,11 @@ impl Shape for fj::Sketch { for ((mut half_edge, route), (next_half_edge, _)) in half_edges.into_iter().circular_tuple_windows() { - let next_vertex = - next_half_edge.read().start_vertex.clone(); - match route { fj::SketchSegmentRoute::Direct => { half_edge .write() - .update_as_line_segment(next_vertex); + .update_as_line_segment(next_half_edge); } fj::SketchSegmentRoute::Arc { angle } => { half_edge From 2716e4bb47fc3bc3279a3ee0e03b9d3021a524c0 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 28 Feb 2023 17:55:12 +0100 Subject: [PATCH 10/10] Replace access of `PartialSurfaceVertex` position --- crates/fj-kernel/src/builder/edge.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/crates/fj-kernel/src/builder/edge.rs b/crates/fj-kernel/src/builder/edge.rs index 097964e1c..4f12910d1 100644 --- a/crates/fj-kernel/src/builder/edge.rs +++ b/crates/fj-kernel/src/builder/edge.rs @@ -141,14 +141,13 @@ impl HalfEdgeBuilder for PartialHalfEdge { next_half_edge: Partial, ) -> Curve { let boundary = self.boundary; - let points_surface = - [&self.start_vertex, &next_half_edge.read().start_vertex].map( - |vertex| { - vertex.read().position.expect( - "Can't infer line segment without surface position", - ) - }, - ); + let points_surface = [ + &self.start_position(), + &next_half_edge.read().start_position(), + ] + .map(|position| { + position.expect("Can't infer line segment without surface position") + }); let path = if let [Some(start), Some(end)] = boundary { let points = [start, end].zip_ext(points_surface);