Enum truck_rendimpl::modeling::ShellCondition [−]
The shell conditions being determined by the half-edge model.
Variants
This shell is not regular.
Examples
use truck_topology::*; use truck_topology::shell::ShellCondition; use std::iter::FromIterator; let v = Vertex::news(&[(); 5]); let edge = [ Edge::new(&v[0], &v[1], ()), Edge::new(&v[0], &v[2], ()), Edge::new(&v[0], &v[3], ()), Edge::new(&v[0], &v[4], ()), Edge::new(&v[1], &v[2], ()), Edge::new(&v[1], &v[3], ()), Edge::new(&v[1], &v[4], ()), ]; let wire = vec![ Wire::from_iter(vec![&edge[0], &edge[4], &edge[1].inverse()]), Wire::from_iter(vec![&edge[0], &edge[5], &edge[2].inverse()]), Wire::from_iter(vec![&edge[0], &edge[6], &edge[3].inverse()]), ]; let shell: Shell<_, _, _> = wire.into_iter().map(|w| Face::new(vec![w], ())).collect(); // The shell is irregular because three faces share edge[0]. assert_eq!(shell.shell_condition(), ShellCondition::Irregular);
All edges are shared by at most two faces.
Examples
use truck_topology::*; use truck_topology::shell::ShellCondition; use std::iter::FromIterator; let v = Vertex::news(&[(); 6]); let edge = [ Edge::new(&v[0], &v[1], ()), Edge::new(&v[0], &v[2], ()), Edge::new(&v[1], &v[2], ()), Edge::new(&v[1], &v[3], ()), Edge::new(&v[1], &v[4], ()), Edge::new(&v[2], &v[4], ()), Edge::new(&v[2], &v[5], ()), Edge::new(&v[3], &v[4], ()), Edge::new(&v[4], &v[5], ()), ]; let wire = vec![ Wire::from_iter(vec![&edge[0], &edge[2], &edge[1].inverse()]), Wire::from_iter(vec![&edge[3], &edge[7], &edge[4].inverse()]), Wire::from_iter(vec![&edge[5], &edge[8], &edge[6].inverse()]), Wire::from_iter(vec![&edge[2], &edge[5], &edge[4].inverse()]), ]; let shell: Shell<_, _, _> = wire.into_iter().map(|w| Face::new(vec![w], ())).collect(); // This shell is regular, but not oriented. // It is because the orientations of shell[0] and shell[3] are incompatible on edge[2]. assert_eq!(shell.shell_condition(), ShellCondition::Regular);
The orientations of faces are compatible.
Examples
use truck_topology::*; use truck_topology::shell::ShellCondition; use std::iter::FromIterator; let v = Vertex::news(&[(); 6]); let edge = [ Edge::new(&v[0], &v[1] ,()), Edge::new(&v[0], &v[2] ,()), Edge::new(&v[1], &v[2] ,()), Edge::new(&v[1], &v[3] ,()), Edge::new(&v[1], &v[4] ,()), Edge::new(&v[2], &v[4] ,()), Edge::new(&v[2], &v[5] ,()), Edge::new(&v[3], &v[4] ,()), Edge::new(&v[4], &v[5] ,()), ]; let wire = vec![ Wire::from_iter(vec![&edge[0], &edge[2], &edge[1].inverse()]), Wire::from_iter(vec![&edge[3], &edge[7], &edge[4].inverse()]), Wire::from_iter(vec![&edge[5], &edge[8], &edge[6].inverse()]), Wire::from_iter(vec![&edge[2].inverse(), &edge[4], &edge[5].inverse()]), ]; let shell: Shell<_, _, _> = wire.into_iter().map(|w| Face::new(vec![w], ())).collect(); // The orientations of all faces in the shell are compatible on the shared edges. // This shell is not closed because edge[0] is included in only the 0th face. assert_eq!(shell.shell_condition(), ShellCondition::Oriented);
All edges are shared by two faces.
Examples
use truck_topology::*; use truck_topology::shell::ShellCondition; use std::iter::FromIterator; let v = Vertex::news(&[(); 8]); let edge = [ Edge::new(&v[0], &v[1] ,()), Edge::new(&v[1], &v[2] ,()), Edge::new(&v[2], &v[3] ,()), Edge::new(&v[3], &v[0] ,()), Edge::new(&v[0], &v[4] ,()), Edge::new(&v[1], &v[5] ,()), Edge::new(&v[2], &v[6] ,()), Edge::new(&v[3], &v[7] ,()), Edge::new(&v[4], &v[5] ,()), Edge::new(&v[5], &v[6] ,()), Edge::new(&v[6], &v[7] ,()), Edge::new(&v[7], &v[4] ,()), ]; let wire = vec![ Wire::from_iter(vec![&edge[0], &edge[1], &edge[2], &edge[3]]), Wire::from_iter(vec![&edge[0].inverse(), &edge[4], &edge[8], &edge[5].inverse()]), Wire::from_iter(vec![&edge[1].inverse(), &edge[5], &edge[9], &edge[6].inverse()]), Wire::from_iter(vec![&edge[2].inverse(), &edge[6], &edge[10], &edge[7].inverse()]), Wire::from_iter(vec![&edge[3].inverse(), &edge[7], &edge[11], &edge[4].inverse()]), Wire::from_iter(vec![&edge[8], &edge[9], &edge[10], &edge[11]]), ]; let mut shell: Shell<_, _, _> = wire.into_iter().map(|w| Face::new(vec![w], ())).collect(); shell[5].invert(); assert_eq!(shell.shell_condition(), ShellCondition::Closed);
Trait Implementations
impl Debug for ShellCondition
impl Eq for ShellCondition
impl PartialEq<ShellCondition> for ShellCondition
pub fn eq(&self, other: &ShellCondition) -> bool
#[must_use]pub fn ne(&self, other: &Rhs) -> bool
1.0.0[src]
impl StructuralEq for ShellCondition
impl StructuralPartialEq for ShellCondition
Auto Trait Implementations
impl RefUnwindSafe for ShellCondition
impl Send for ShellCondition
impl Sync for ShellCondition
impl Unpin for ShellCondition
impl UnwindSafe for ShellCondition
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> From<T> for T
[src]
impl<T> Instrument for T
[src]
pub fn instrument(self, span: Span) -> Instrumented<Self>
[src]
pub fn in_current_span(self) -> Instrumented<Self>
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> Pointable for T
pub const ALIGN: usize
type Init = T
The type for initializers.
pub unsafe fn init(init: <T as Pointable>::Init) -> usize
pub unsafe fn deref<'a>(ptr: usize) -> &'a T
pub unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T
pub unsafe fn drop(ptr: usize)
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,