mirror of
https://github.com/hannobraun/Fornjot
synced 2025-09-15 21:58:11 +00:00
Add BoundingVerticesOfEdge
query
This commit is contained in:
parent
ee9196b4e0
commit
75aba8687b
@ -8,3 +8,72 @@
|
|||||||
//!
|
//!
|
||||||
//! This module provides traits express such non-trivial queries, and implements
|
//! This module provides traits express such non-trivial queries, and implements
|
||||||
//! them for various objects that have the information to answer the query.
|
//! them for various objects that have the information to answer the query.
|
||||||
|
|
||||||
|
use crate::{
|
||||||
|
geometry::BoundingVertices,
|
||||||
|
objects::{Cycle, Face, HalfEdge, Region, Shell},
|
||||||
|
storage::Handle,
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Determine the bounding vertices of an edge
|
||||||
|
pub trait BoundingVerticesOfEdge {
|
||||||
|
/// Determine the bounding vertices of an edge
|
||||||
|
///
|
||||||
|
/// Returns `None`, if the provided edge is not part of the object this
|
||||||
|
/// method is called on.
|
||||||
|
fn bounding_vertices_of_edge(
|
||||||
|
&self,
|
||||||
|
edge: &Handle<HalfEdge>,
|
||||||
|
) -> Option<BoundingVertices>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BoundingVerticesOfEdge for Cycle {
|
||||||
|
fn bounding_vertices_of_edge(
|
||||||
|
&self,
|
||||||
|
edge: &Handle<HalfEdge>,
|
||||||
|
) -> Option<BoundingVertices> {
|
||||||
|
let start = edge.start_vertex().clone();
|
||||||
|
let end = self.half_edge_after(edge)?.start_vertex().clone();
|
||||||
|
|
||||||
|
Some(BoundingVertices::from([start, end]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BoundingVerticesOfEdge for Region {
|
||||||
|
fn bounding_vertices_of_edge(
|
||||||
|
&self,
|
||||||
|
edge: &Handle<HalfEdge>,
|
||||||
|
) -> Option<BoundingVertices> {
|
||||||
|
for cycle in self.all_cycles() {
|
||||||
|
if let Some(vertices) = cycle.bounding_vertices_of_edge(edge) {
|
||||||
|
return Some(vertices);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BoundingVerticesOfEdge for Face {
|
||||||
|
fn bounding_vertices_of_edge(
|
||||||
|
&self,
|
||||||
|
edge: &Handle<HalfEdge>,
|
||||||
|
) -> Option<BoundingVertices> {
|
||||||
|
self.region().bounding_vertices_of_edge(edge)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl BoundingVerticesOfEdge for Shell {
|
||||||
|
fn bounding_vertices_of_edge(
|
||||||
|
&self,
|
||||||
|
edge: &Handle<HalfEdge>,
|
||||||
|
) -> Option<BoundingVertices> {
|
||||||
|
for face in self.faces() {
|
||||||
|
if let Some(vertices) = face.bounding_vertices_of_edge(edge) {
|
||||||
|
return Some(vertices);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user