pub enum IntersectResult<T> {
Intersect(T),
Negative,
Positive,
}Expand description
The result of a plane-intersection operation.
This enum represents the outcome when computing the intersection between a geometric shape
and a plane. Unlike SplitResult which produces pieces of the original shape, this produces
the geometry that lies exactly on the plane (within epsilon tolerance).
§Type Parameter
The generic type T represents the result of the intersection. Common types include:
Polyline- For mesh-plane intersections, representing the cross-section outline
§Use Cases
Plane-intersection operations are useful for:
- Cross-sectional analysis: Computing 2D slices of 3D geometry
- Contour generation: Finding outlines at specific heights
- Visualization: Displaying cutting planes through complex geometry
- CAD/CAM: Generating toolpaths or analyzing part geometry
§Examples
§Computing a Mesh Cross-Section
use parry3d::shape::TriMesh;
use parry3d::math::Point;
use parry3d::query::IntersectResult;
// Create a simple tetrahedron mesh
let vertices = vec![
Point::new(0.0, 0.0, 0.0),
Point::new(1.0, 0.0, 0.0),
Point::new(0.5, 1.0, 0.0),
Point::new(0.5, 0.5, 1.0),
];
let indices = vec![
[0u32, 1, 2], // Bottom face
[0, 1, 3], // Front face
[1, 2, 3], // Right face
[2, 0, 3], // Left face
];
let mesh = TriMesh::new(vertices, indices).unwrap();
// Compute cross-section at z = 0.5
match mesh.canonical_intersection_with_plane(2, 0.5, 1e-6) {
IntersectResult::Intersect(polyline) => {
println!("Cross-section computed!");
println!("Number of vertices: {}", polyline.vertices().len());
// The polyline represents the outline of the mesh at z = 0.5
// It may consist of multiple disconnected loops if the mesh
// has multiple separate pieces at this height
}
IntersectResult::Negative => {
println!("Mesh is entirely below z = 0.5");
}
IntersectResult::Positive => {
println!("Mesh is entirely above z = 0.5");
}
}§Handling Multiple Connected Components
use parry3d::shape::TriMesh;
use parry3d::query::IntersectResult;
// When intersecting a mesh with holes or multiple separate parts,
// the resulting polyline may have multiple connected components
match mesh.canonical_intersection_with_plane(2, 0.5, 1e-6) {
IntersectResult::Intersect(polyline) => {
// The polyline contains all intersection curves
// You can identify separate components by analyzing connectivity
// through the polyline's segment indices
let indices = polyline.indices();
println!("Number of edges in cross-section: {}", indices.len());
}
_ => println!("No intersection"),
}Variants§
Intersect(T)
The intersect operation yielded a result, lying on the plane (within epsilon tolerance).
For triangle meshes, this is typically a Polyline representing
the outline where the mesh intersects the plane. The polyline may consist of multiple
disconnected loops if the mesh has holes or multiple separate pieces at the intersection
height.
The intersection geometry lies on the plane, meaning all points p satisfy n · p ≈ b
(within the specified epsilon tolerance).
Negative
The shape being intersected is fully contained in the negative half-space of the plane.
This means all points of the shape satisfy n · p < b (the shape is entirely “behind”
or “below” the plane). The plane doesn’t intersect the shape at all.
Positive
The shape being intersected is fully contained in the positive half-space of the plane.
This means all points of the shape satisfy n · p > b (the shape is entirely “in front of”
or “above” the plane). The plane doesn’t intersect the shape at all.
Auto Trait Implementations§
impl<T> Freeze for IntersectResult<T>where
T: Freeze,
impl<T> RefUnwindSafe for IntersectResult<T>where
T: RefUnwindSafe,
impl<T> Send for IntersectResult<T>where
T: Send,
impl<T> Sync for IntersectResult<T>where
T: Sync,
impl<T> Unpin for IntersectResult<T>where
T: Unpin,
impl<T> UnwindSafe for IntersectResult<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.