pub struct Aabb<S> where
S: EuclideanSpace, {
pub origin: S,
pub extent: <S as EuclideanSpace>::CoordinateSpace,
}
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: <S as EuclideanSpace>::CoordinateSpace
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) -> Aabb<S> where
I: IntoIterator<Item = S>,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: IntrinsicOrd,
pub fn from_points<I>(points: I) -> Aabb<S> where
I: IntoIterator<Item = S>,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: 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
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: IntrinsicOrd,
pub fn lower_bound(&self) -> S where
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: IntrinsicOrd,
sourcepub fn volume(
&self
) -> <<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar
pub fn volume(
&self
) -> <<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar
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: &Aabb<S>) -> Aabb<S> where
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: IntrinsicOrd,
Trait Implementations
sourceimpl<S> Clone for Aabb<S> where
S: Clone + EuclideanSpace,
impl<S> Clone for Aabb<S> where
S: Clone + EuclideanSpace,
sourceimpl<S> Debug for Aabb<S> where
S: Debug + EuclideanSpace,
<S as EuclideanSpace>::CoordinateSpace: Debug,
impl<S> Debug for Aabb<S> where
S: Debug + EuclideanSpace,
<S as EuclideanSpace>::CoordinateSpace: Debug,
sourceimpl<S> Default for Aabb<S> where
S: EuclideanSpace,
impl<S> Default for Aabb<S> where
S: EuclideanSpace,
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<<Ray<S> as Intersection<Aabb<S>>>::Output>
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<<S as Intersection<Aabb<S>>>::Output>
sourceimpl<S> Intersection<Aabb<S>> for Aabb<S> where
S: EuclideanSpace,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: IntrinsicOrd,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: Signed,
impl<S> Intersection<Aabb<S>> for Aabb<S> where
S: EuclideanSpace,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: IntrinsicOrd,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: Signed,
Intersection of axis-aligned bounding boxes.
type Output = Aabb<S>
fn intersection(
&self,
other: &Aabb<S>
) -> Option<<Aabb<S> as Intersection<Aabb<S>>>::Output>
sourceimpl<S> Intersection<Ray<S>> for Aabb<S> where
S: EuclideanSpace,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: Bounded,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: Infinite,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: IntrinsicOrd,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: Signed,
impl<S> Intersection<Ray<S>> for Aabb<S> where
S: EuclideanSpace,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: Bounded,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: Infinite,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: IntrinsicOrd,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: 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<<Aabb<S> as Intersection<Ray<S>>>::Output>
fn intersection(
&self,
ray: &Ray<S>
) -> Option<<Aabb<S> as Intersection<Ray<S>>>::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,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: IntrinsicOrd,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: Signed,
impl<S> Intersection<S> for Aabb<S> where
S: EuclideanSpace,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: IntrinsicOrd,
<<S as EuclideanSpace>::CoordinateSpace as VectorSpace>::Scalar: Signed,
Intersection of an axis-aligned bounding box and a point.
type Output = <S as EuclideanSpace>::CoordinateSpace
fn intersection(
&self,
point: &S
) -> Option<<Aabb<S> as Intersection<S>>::Output>
impl<S> Copy for Aabb<S> where
S: Copy + 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
sourceimpl<T> FromGeometry<T> for T
impl<T> FromGeometry<T> for T
fn from_geometry(other: T) -> T
sourceimpl<T, U> IntoGeometry<U> for T where
U: FromGeometry<T>,
impl<T, U> IntoGeometry<U> for T where
U: FromGeometry<T>,
fn into_geometry(self) -> U
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.