Skip to content

Commit

Permalink
Merge pull request #2077 from hannobraun/sibling
Browse files Browse the repository at this point in the history
Add query API for half-edge siblings
  • Loading branch information
hannobraun authored Oct 26, 2023
2 parents f95a128 + bcc9467 commit e0c26d2
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 27 deletions.
27 changes: 1 addition & 26 deletions crates/fj-core/src/objects/kinds/shell.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
use crate::{
objects::{handles::Handles, Face, HalfEdge},
queries::BoundingVerticesOfHalfEdge,
objects::{handles::Handles, Face},
storage::Handle,
};

Expand All @@ -22,28 +21,4 @@ impl Shell {
pub fn faces(&self) -> &Handles<Face> {
&self.faces
}

/// Indicate whether the provided half-edges are siblings
pub fn are_siblings(
&self,
a: &Handle<HalfEdge>,
b: &Handle<HalfEdge>,
) -> bool {
let same_curve = a.curve().id() == b.curve().id();
let same_boundary = a.boundary() == b.boundary().reverse();
let same_vertices = {
let Some(a_vertices) = self.bounding_vertices_of_half_edge(a)
else {
return false;
};
let Some(b_vertices) = self.bounding_vertices_of_half_edge(b)
else {
return false;
};

a_vertices == b_vertices.reverse()
};

same_curve && same_boundary && same_vertices
}
}
2 changes: 2 additions & 0 deletions crates/fj-core/src/queries/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,10 @@
mod all_half_edges_with_surface;
mod bounding_vertices_of_half_edge;
mod sibling_of_half_edge;

pub use self::{
all_half_edges_with_surface::AllHalfEdgesWithSurface,
bounding_vertices_of_half_edge::BoundingVerticesOfHalfEdge,
sibling_of_half_edge::SiblingOfHalfEdge,
};
60 changes: 60 additions & 0 deletions crates/fj-core/src/queries/sibling_of_half_edge.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
use crate::{
objects::{HalfEdge, Shell},
storage::Handle,
};

use super::BoundingVerticesOfHalfEdge;

/// Queries related to the sibling of a [`HalfEdge`]
pub trait SiblingOfHalfEdge {
/// Indicate whether the provided half-edges are siblings
fn are_siblings(&self, a: &Handle<HalfEdge>, b: &Handle<HalfEdge>) -> bool;

/// Retrieve the sibling of this half-edge
///
/// Returns `None`, if the provided half-edge is not part of the object this
/// method is called on, or if the provided half-edge has no sibling within
/// the object.
fn get_sibling_of(
&self,
half_edge: &Handle<HalfEdge>,
) -> Option<Handle<HalfEdge>>;
}

impl SiblingOfHalfEdge for Shell {
fn are_siblings(&self, a: &Handle<HalfEdge>, b: &Handle<HalfEdge>) -> bool {
let same_curve = a.curve().id() == b.curve().id();
let same_boundary = a.boundary() == b.boundary().reverse();
let same_vertices = {
let Some(a_vertices) = self.bounding_vertices_of_half_edge(a)
else {
return false;
};
let Some(b_vertices) = self.bounding_vertices_of_half_edge(b)
else {
return false;
};

a_vertices == b_vertices.reverse()
};

same_curve && same_boundary && same_vertices
}

fn get_sibling_of(
&self,
half_edge: &Handle<HalfEdge>,
) -> Option<Handle<HalfEdge>> {
for face in self.faces() {
for cycle in face.region().all_cycles() {
for h in cycle.half_edges() {
if self.are_siblings(half_edge, h) {
return Some(h.clone());
}
}
}
}

None
}
}
4 changes: 3 additions & 1 deletion crates/fj-core/src/validate/shell.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ use fj_math::{Point, Scalar};
use crate::{
geometry::SurfaceGeometry,
objects::{HalfEdge, Shell, Surface},
queries::{AllHalfEdgesWithSurface, BoundingVerticesOfHalfEdge},
queries::{
AllHalfEdgesWithSurface, BoundingVerticesOfHalfEdge, SiblingOfHalfEdge,
},
storage::{Handle, HandleWrapper},
};

Expand Down

0 comments on commit e0c26d2

Please sign in to comment.