pub struct Aabb<S> where
S: EuclideanSpace, {
pub origin: S,
pub extent: Vector<S>,
}
Expand description
Axis-aligned bounding box.
Represents an $n$-dimensional volume along each basis vector of a Euclidean space. The bounding box is defined by the region between its origin and endpoint.
Fields
origin: S
The origin of the bounding box.
The origin does not necessarily represent the lower or upper bound
of the Aabb
. See lower_bound
and upper_bound
.
extent: Vector<S>
The extent of the bounding box.
The extent describes the endpoint as a translation from the origin. The endpoint $P_E$ is formed by $P_0 + \vec{v}$, where $P_0$ is the origin and $\vec{v}$ is the extent.
Implementations
sourceimpl<S> Aabb<S> where
S: EuclideanSpace,
impl<S> Aabb<S> where
S: EuclideanSpace,
sourcepub fn from_points<I>(points: I) -> Self where
I: IntoIterator<Item = S>,
Scalar<S>: IntrinsicOrd,
pub fn from_points<I>(points: I) -> Self where
I: IntoIterator<Item = S>,
Scalar<S>: IntrinsicOrd,
Creates an Aabb
from a set of points.
The bounding box is formed from the lower and upper bounds of the
points. If the set of points is empty, then the Aabb
will sit at the
origin with zero volume.
pub fn endpoint(&self) -> S
pub fn upper_bound(&self) -> S where
Scalar<S>: IntrinsicOrd,
pub fn lower_bound(&self) -> S where
Scalar<S>: IntrinsicOrd,
sourcepub fn volume(&self) -> Scalar<S>
pub fn volume(&self) -> Scalar<S>
Gets the Lebesgue measure ($n$-dimensional volume) of the bounding box.
This value is analogous to length, area, and volume in one, two, and three dimensions, respectively.
pub fn union(&self, aabb: &Self) -> Self where
Scalar<S>: IntrinsicOrd,
Trait Implementations
sourceimpl<S: Clone> Clone for Aabb<S> where
S: EuclideanSpace,
impl<S: Clone> Clone for Aabb<S> where
S: EuclideanSpace,
sourceimpl<S> Default for Aabb<S> where
S: EuclideanSpace,
impl<S> Default for Aabb<S> where
S: EuclideanSpace,
sourceimpl<S> Intersection<Aabb<S>> for S where
S: EuclideanSpace,
Aabb<S>: Intersection<S>,
impl<S> Intersection<Aabb<S>> for S where
S: EuclideanSpace,
Aabb<S>: Intersection<S>,
Symmetrical intersection.
type Output = <Aabb<S> as Intersection<S>>::Output
fn intersection(&self, other: &Aabb<S>) -> Option<Self::Output>
sourceimpl<S> Intersection<Aabb<S>> for Aabb<S> where
S: EuclideanSpace,
Scalar<S>: IntrinsicOrd + Signed,
impl<S> Intersection<Aabb<S>> for Aabb<S> where
S: EuclideanSpace,
Scalar<S>: IntrinsicOrd + Signed,
Intersection of axis-aligned bounding boxes.
sourceimpl<S> Intersection<Aabb<S>> for Ray<S> where
S: EuclideanSpace,
Aabb<S>: Intersection<Ray<S>>,
impl<S> Intersection<Aabb<S>> for Ray<S> where
S: EuclideanSpace,
Aabb<S>: Intersection<Ray<S>>,
Symmetrical intersection.
type Output = <Aabb<S> as Intersection<Ray<S>>>::Output
fn intersection(&self, other: &Aabb<S>) -> Option<Self::Output>
sourceimpl<S> Intersection<Ray<S>> for Aabb<S> where
S: EuclideanSpace,
Scalar<S>: Bounded + Infinite + IntrinsicOrd + Signed,
impl<S> Intersection<Ray<S>> for Aabb<S> where
S: EuclideanSpace,
Scalar<S>: Bounded + Infinite + IntrinsicOrd + Signed,
Intersection of an axis-aligned bounding box and a ray.
type Output = (<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar, <<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar)
type Output = (<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar, <<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar)
The minimum and maximum times of impact of the intersection.
The times of impact $t_{min}$ and $t_{max}$ describe the distance along the half-line from the ray’s origin at which the intersection occurs.
sourcefn intersection(&self, ray: &Ray<S>) -> Option<Self::Output>
fn intersection(&self, ray: &Ray<S>) -> Option<Self::Output>
Determines the minimum and maximum times of impact of a Ray
intersection with an Aabb
.
Given a ray formed by an origin $P_0$ and a unit direction $\hat{u}$, the nearest point of intersection is $P_0 + t_{min}\hat{u}$.
Examples
Determine the point of impact between a ray and axis-aligned bounding box:
use nalgebra::Point2;
use theon::space::{EuclideanSpace, VectorSpace};
use theon::query::{Aabb, Intersection, Ray, Unit};
type E2 = Point2<f64>;
let aabb = Aabb::<E2> {
origin: EuclideanSpace::from_xy(1.0, -1.0),
extent: VectorSpace::from_xy(2.0, 2.0),
};
let ray = Ray::<E2> {
origin: EuclideanSpace::origin(),
direction: Unit::x(),
};
let (min, _) = ray.intersection(&aabb).unwrap();
let point = ray.origin + (ray.direction.get() * min);
sourceimpl<S> Intersection<S> for Aabb<S> where
S: EuclideanSpace,
Scalar<S>: IntrinsicOrd + Signed,
impl<S> Intersection<S> for Aabb<S> where
S: EuclideanSpace,
Scalar<S>: IntrinsicOrd + Signed,
Intersection of an axis-aligned bounding box and a point.
type Output = <S as EuclideanSpace>::CoordinateSpace
fn intersection(&self, point: &S) -> Option<Self::Output>
impl<S: Copy> Copy for Aabb<S> where
S: EuclideanSpace,
impl<S> StructuralPartialEq for Aabb<S> where
S: EuclideanSpace,
Auto Trait Implementations
impl<S> RefUnwindSafe for Aabb<S> where
S: RefUnwindSafe,
<S as EuclideanSpace>::CoordinateSpace: RefUnwindSafe,
impl<S> Send for Aabb<S> where
S: Send,
<S as EuclideanSpace>::CoordinateSpace: Send,
impl<S> Sync for Aabb<S> where
S: Sync,
<S as EuclideanSpace>::CoordinateSpace: Sync,
impl<S> Unpin for Aabb<S> where
S: Unpin,
<S as EuclideanSpace>::CoordinateSpace: Unpin,
impl<S> UnwindSafe for Aabb<S> where
S: UnwindSafe,
<S as EuclideanSpace>::CoordinateSpace: UnwindSafe,
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<SS, SP> SupersetOf<SS> for SP where
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SP where
SS: SubsetOf<SP>,
fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
The inverse inclusion map: attempts to construct self
from the equivalent element of its
superset. Read more
fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
Checks if self
is actually part of its subset T
(and can be converted to it).
fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
Use with care! Same as self.to_subset
but without any property checks. Always succeeds.
fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
The inclusion map: converts self
to the equivalent element of its superset.