pub enum SplitResult<T> {
Pair(T, T),
Negative,
Positive,
}Expand description
The result of a plane-splitting operation.
This enum represents the three possible outcomes when splitting a geometric shape with a plane. It efficiently handles all cases without unnecessary allocations when the shape doesn’t need to be split.
§Type Parameter
The generic type T represents the shape being split. Common types include:
§Half-Space Definition
Given a plane defined by a normal vector n and bias b, a point p lies in:
- Negative half-space if
n · p < b(behind the plane) - Positive half-space if
n · p > b(in front of the plane) - On the plane if
n · p ≈ b(within epsilon tolerance)
§Examples
§Splitting an AABB
use parry3d::bounding_volume::Aabb;
use parry3d::math::Point;
use parry3d::query::SplitResult;
let aabb = Aabb::new(Point::new(0.0, 0.0, 0.0), Point::new(10.0, 10.0, 10.0));
// Split along X-axis at x = 5.0
match aabb.canonical_split(0, 5.0, 1e-6) {
SplitResult::Pair(left, right) => {
println!("AABB split into two pieces");
println!("Left AABB: {:?}", left);
println!("Right AABB: {:?}", right);
}
SplitResult::Negative => {
println!("AABB is entirely on the negative side (x < 5.0)");
}
SplitResult::Positive => {
println!("AABB is entirely on the positive side (x > 5.0)");
}
}§Splitting a Segment
use parry3d::shape::Segment;
use parry3d::math::Point;
use parry3d::query::SplitResult;
let segment = Segment::new(Point::new(0.0, 0.0, 0.0), Point::new(10.0, 0.0, 0.0));
// Split along X-axis at x = 3.0
match segment.canonical_split(0, 3.0, 1e-6) {
SplitResult::Pair(seg1, seg2) => {
println!("Segment split at x = 3.0");
println!("First segment: {:?} to {:?}", seg1.a, seg1.b);
println!("Second segment: {:?} to {:?}", seg2.a, seg2.b);
}
SplitResult::Negative => {
println!("Entire segment is on the negative side");
}
SplitResult::Positive => {
println!("Entire segment is on the positive side");
}
}Variants§
Pair(T, T)
The split operation yielded two results: one lying on the negative half-space of the plane and the second lying on the positive half-space of the plane.
The first element is the shape piece on the negative side of the plane (where n · p < b).
The second element is the shape piece on the positive side of the plane (where n · p > b).
For closed meshes, both pieces are typically “capped” with new geometry on the cutting plane to ensure the result consists of valid closed shapes.
Negative
The shape being split is fully contained in the negative half-space of the plane.
This means all points of the shape satisfy n · p < b (or are within epsilon of the plane).
No splitting occurred because the shape doesn’t cross the plane.
Positive
The shape being split is fully contained in the positive half-space of the plane.
This means all points of the shape satisfy n · p > b (or are within epsilon of the plane).
No splitting occurred because the shape doesn’t cross the plane.
Auto Trait Implementations§
impl<T> Freeze for SplitResult<T>where
T: Freeze,
impl<T> RefUnwindSafe for SplitResult<T>where
T: RefUnwindSafe,
impl<T> Send for SplitResult<T>where
T: Send,
impl<T> Sync for SplitResult<T>where
T: Sync,
impl<T> Unpin for SplitResult<T>where
T: Unpin,
impl<T> UnwindSafe for SplitResult<T>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.