From 22433ac8b86473a52b401cac12ffb87c65d91970 Mon Sep 17 00:00:00 2001 From: Hanno Braun Date: Tue, 9 Jul 2024 21:28:11 +0200 Subject: [PATCH] Read vertex geometry in validation check --- .../coincident_half_edges_are_not_siblings.rs | 46 +++++++++++++++++-- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/crates/fj-core/src/validation/checks/coincident_half_edges_are_not_siblings.rs b/crates/fj-core/src/validation/checks/coincident_half_edges_are_not_siblings.rs index 7007ca95d..ca13ffd2c 100644 --- a/crates/fj-core/src/validation/checks/coincident_half_edges_are_not_siblings.rs +++ b/crates/fj-core/src/validation/checks/coincident_half_edges_are_not_siblings.rs @@ -5,7 +5,8 @@ use fj_math::{Point, Scalar}; use crate::{ geometry::{CurveBoundary, Geometry}, queries::{ - AllHalfEdgesWithSurface, BoundingVerticesOfHalfEdge, SiblingOfHalfEdge, + AllHalfEdgesWithSurface, BoundingVerticesOfHalfEdge, CycleOfHalfEdge, + SiblingOfHalfEdge, }, storage::Handle, topology::{Curve, HalfEdge, Shell, Surface, Vertex}, @@ -109,8 +110,22 @@ impl ValidationCheck for CoincidentHalfEdgesAreNotSiblings { let Some(mut distances) = distances( half_edge_a.clone(), + object + .find_cycle_of_half_edge(half_edge_a) + .unwrap() + .half_edges() + .after(half_edge_a) + .unwrap() + .start_vertex(), surface_a, half_edge_b.clone(), + object + .find_cycle_of_half_edge(half_edge_b) + .unwrap() + .half_edges() + .after(half_edge_b) + .unwrap() + .start_vertex(), surface_b, geometry, ) else { @@ -152,18 +167,34 @@ impl ValidationCheck for CoincidentHalfEdgesAreNotSiblings { /// Returns an [`Iterator`] of the distance at each sample. fn distances( half_edge_a: Handle, + end_vertex_a: &Handle, surface_a: &Handle, half_edge_b: Handle, + end_vertex_b: &Handle, surface_b: &Handle, geometry: &Geometry, ) -> Option> { fn sample( percent: f64, half_edge: &Handle, + end_vertex: &Handle, surface: &Handle, geometry: &Geometry, ) -> Option> { - let [start, end] = geometry.of_half_edge(half_edge).boundary.inner; + let [start, end] = [ + geometry + .of_vertex(half_edge.start_vertex()) + .unwrap() + .local_on(half_edge.curve()) + .unwrap() + .position, + geometry + .of_vertex(end_vertex) + .unwrap() + .local_on(half_edge.curve()) + .unwrap() + .position, + ]; let path_coords = start + (end - start) * percent; let path = geometry .of_curve(half_edge.curve())? @@ -186,8 +217,15 @@ fn distances( let mut distances = Vec::new(); for i in 0..sample_count { let percent = i as f64 * step; - let sample1 = sample(percent, &half_edge_a, surface_a, geometry)?; - let sample2 = sample(1.0 - percent, &half_edge_b, surface_b, geometry)?; + let sample1 = + sample(percent, &half_edge_a, end_vertex_a, surface_a, geometry)?; + let sample2 = sample( + 1.0 - percent, + &half_edge_b, + end_vertex_b, + surface_b, + geometry, + )?; distances.push(sample1.distance_to(&sample2)) } Some(distances.into_iter())