mirror of
https://github.com/hannobraun/Fornjot
synced 2025-05-09 04:18:28 +00:00
Read vertex geometry in validation check
This commit is contained in:
parent
35edeaca76
commit
22433ac8b8
@ -5,7 +5,8 @@ use fj_math::{Point, Scalar};
|
|||||||
use crate::{
|
use crate::{
|
||||||
geometry::{CurveBoundary, Geometry},
|
geometry::{CurveBoundary, Geometry},
|
||||||
queries::{
|
queries::{
|
||||||
AllHalfEdgesWithSurface, BoundingVerticesOfHalfEdge, SiblingOfHalfEdge,
|
AllHalfEdgesWithSurface, BoundingVerticesOfHalfEdge, CycleOfHalfEdge,
|
||||||
|
SiblingOfHalfEdge,
|
||||||
},
|
},
|
||||||
storage::Handle,
|
storage::Handle,
|
||||||
topology::{Curve, HalfEdge, Shell, Surface, Vertex},
|
topology::{Curve, HalfEdge, Shell, Surface, Vertex},
|
||||||
@ -109,8 +110,22 @@ impl ValidationCheck<Shell> for CoincidentHalfEdgesAreNotSiblings {
|
|||||||
|
|
||||||
let Some(mut distances) = distances(
|
let Some(mut distances) = distances(
|
||||||
half_edge_a.clone(),
|
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,
|
surface_a,
|
||||||
half_edge_b.clone(),
|
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,
|
surface_b,
|
||||||
geometry,
|
geometry,
|
||||||
) else {
|
) else {
|
||||||
@ -152,18 +167,34 @@ impl ValidationCheck<Shell> for CoincidentHalfEdgesAreNotSiblings {
|
|||||||
/// Returns an [`Iterator`] of the distance at each sample.
|
/// Returns an [`Iterator`] of the distance at each sample.
|
||||||
fn distances(
|
fn distances(
|
||||||
half_edge_a: Handle<HalfEdge>,
|
half_edge_a: Handle<HalfEdge>,
|
||||||
|
end_vertex_a: &Handle<Vertex>,
|
||||||
surface_a: &Handle<Surface>,
|
surface_a: &Handle<Surface>,
|
||||||
half_edge_b: Handle<HalfEdge>,
|
half_edge_b: Handle<HalfEdge>,
|
||||||
|
end_vertex_b: &Handle<Vertex>,
|
||||||
surface_b: &Handle<Surface>,
|
surface_b: &Handle<Surface>,
|
||||||
geometry: &Geometry,
|
geometry: &Geometry,
|
||||||
) -> Option<impl Iterator<Item = Scalar>> {
|
) -> Option<impl Iterator<Item = Scalar>> {
|
||||||
fn sample(
|
fn sample(
|
||||||
percent: f64,
|
percent: f64,
|
||||||
half_edge: &Handle<HalfEdge>,
|
half_edge: &Handle<HalfEdge>,
|
||||||
|
end_vertex: &Handle<Vertex>,
|
||||||
surface: &Handle<Surface>,
|
surface: &Handle<Surface>,
|
||||||
geometry: &Geometry,
|
geometry: &Geometry,
|
||||||
) -> Option<Point<3>> {
|
) -> Option<Point<3>> {
|
||||||
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_coords = start + (end - start) * percent;
|
||||||
let path = geometry
|
let path = geometry
|
||||||
.of_curve(half_edge.curve())?
|
.of_curve(half_edge.curve())?
|
||||||
@ -186,8 +217,15 @@ fn distances(
|
|||||||
let mut distances = Vec::new();
|
let mut distances = Vec::new();
|
||||||
for i in 0..sample_count {
|
for i in 0..sample_count {
|
||||||
let percent = i as f64 * step;
|
let percent = i as f64 * step;
|
||||||
let sample1 = sample(percent, &half_edge_a, surface_a, geometry)?;
|
let sample1 =
|
||||||
let sample2 = sample(1.0 - percent, &half_edge_b, surface_b, geometry)?;
|
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))
|
distances.push(sample1.distance_to(&sample2))
|
||||||
}
|
}
|
||||||
Some(distances.into_iter())
|
Some(distances.into_iter())
|
||||||
|
Loading…
Reference in New Issue
Block a user