pub struct Ray<S> where
S: EuclideanSpace, {
pub origin: S,
pub direction: Unit<Vector<S>>,
}
Expand description
Ray or half-line.
Describes a decomposed line with an origin or initial point and a direction. Rays extend infinitely from their origin. The origin $P_0$ and the point $P_0 + \hat{u}$ (where $\hat{u}$ is the direction of the ray) form a half-line originating from $P_0$.
Fields
origin: S
The origin or initial point of the ray.
direction: Unit<Vector<S>>
The unit direction in which the ray extends from its origin.
Implementations
Trait Implementations
sourceimpl<S: Clone> Clone for Ray<S> where
S: EuclideanSpace,
impl<S: Clone> Clone for Ray<S> where
S: EuclideanSpace,
sourceimpl<S> Default for Ray<S> where
S: EuclideanSpace,
impl<S> Default for Ray<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<Self::Output>
sourceimpl<S> Intersection<Plane<S>> for Ray<S> where
S: EuclideanSpace,
Plane<S>: Intersection<Ray<S>>,
impl<S> Intersection<Plane<S>> for Ray<S> where
S: EuclideanSpace,
Plane<S>: Intersection<Ray<S>>,
Symmetrical intersection.
type Output = <Plane<S> as Intersection<Ray<S>>>::Output
fn intersection(&self, other: &Plane<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<Ray<S>> for Plane<S> where
S: EuclideanSpace + FiniteDimensional,
<S as FiniteDimensional>::N: Cmp<U2, Output = Greater>,
Scalar<S>: Signed,
impl<S> Intersection<Ray<S>> for Plane<S> where
S: EuclideanSpace + FiniteDimensional,
<S as FiniteDimensional>::N: Cmp<U2, Output = Greater>,
Scalar<S>: Signed,
Intersection of a plane and a ray.
type Output = PlaneRay<S>
type Output = PlaneRay<S>
The time of impact of a point intersection or the ray if it lies within the plane.
The time of impact $t$ describes 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 if a ray intersects a plane at a point or lies within the
plane. Computes the time of impact of a Ray
for a point
intersection.
Given a ray formed by an origin $P_0$ and a unit direction $\hat{u}$, the point of intersection with the plane is $P_0 + t\hat{u}$.
sourceimpl<S> Neg for Ray<S> where
S: EuclideanSpace,
impl<S> Neg for Ray<S> where
S: EuclideanSpace,
impl<S: Copy> Copy for Ray<S> where
S: EuclideanSpace,
impl<S> StructuralPartialEq for Ray<S> where
S: EuclideanSpace,
Auto Trait Implementations
impl<S> RefUnwindSafe for Ray<S> where
S: RefUnwindSafe,
<S as EuclideanSpace>::CoordinateSpace: RefUnwindSafe,
impl<S> Send for Ray<S> where
S: Send,
<S as EuclideanSpace>::CoordinateSpace: Send,
impl<S> Sync for Ray<S> where
S: Sync,
<S as EuclideanSpace>::CoordinateSpace: Sync,
impl<S> Unpin for Ray<S> where
S: Unpin,
<S as EuclideanSpace>::CoordinateSpace: Unpin,
impl<S> UnwindSafe for Ray<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.