Skip to main content

Direction

Struct Direction 

Source
pub struct Direction(/* private fields */);
Expand description

A unit vector in space.

Implementations§

Source§

impl Direction

Source

pub const X: Self

+X.

Source

pub const Y: Self

+Y.

Source

pub const Z: Self

+Z.

Source

pub fn new(v: Vector, tol: Tolerances) -> OgeomResult<Self>

Normalize v into a direction.

§Errors

OgeomError::Construction if v is non-finite or shorter than tol.confusion().

Source

pub fn from_coords(x: f64, y: f64, z: f64, tol: Tolerances) -> OgeomResult<Self>

Normalize components into a direction.

§Errors

As Direction::new.

Source

pub fn unit(v: Vector, tol: Tolerances) -> OgeomResult<Self>

A direction from a vector that is already a unit vector.

Checks rather than normalizes, and the distinction is the whole reason it exists: dividing a unit vector by its own magnitude does not give it back, it gives something a bit or two away. That is invisible until something has to reproduce a direction exactly: reading a document back from a file, above all, where the drift turns a round trip that should be the identity into one that changes the model a little every time.

§Errors

OgeomError::Construction if v is non-finite, or its length differs from one by more than tol.confusion().

Source

pub const fn vector(self) -> Vector

The underlying unit vector.

Source

pub const fn x(self) -> f64

X component.

Source

pub const fn y(self) -> f64

Y component.

Source

pub const fn z(self) -> f64

Z component.

Source

pub const fn to_array(self) -> [f64; 3]

Components as an array.

Source

pub fn dot(self, other: Self) -> f64

Dot product with another direction: the cosine of the angle between them, in [-1, 1] up to rounding.

Source

pub fn dot_vector(self, v: Vector) -> f64

Dot product with a free vector.

Source

pub fn cross_vector(self, other: Self) -> Vector

Cross product, as a free vector. Its magnitude is the sine of the angle between the two directions, so it is not itself a direction; for nearly parallel inputs it is nearly null.

Source

pub fn cross_with(self, v: Vector) -> Vector

Cross product with a free vector.

Its magnitude is the component of v perpendicular to this direction, which makes it the accurate way to get a perpendicular distance: subtracting the parallel component instead cancels catastrophically for a point far along the direction.

Source

pub fn cross(self, other: Self, tol: Tolerances) -> OgeomResult<Self>

Cross product, renormalized into a direction.

Collinearity is judged against the angular tolerance, not the linear one: for unit inputs the cross product’s magnitude is the sine of the angle between them, a dimensionless quantity that a length tolerance does not describe.

§Errors

OgeomError::Construction if the two directions are collinear.

Source

pub fn from_cross(a: Vector, b: Vector, tol: Tolerances) -> OgeomResult<Self>

The unit normal to two free vectors.

The right way to build a normal from two edges of a triangle. Naively normalizing a.cross(b) compares its magnitude (which is twice the triangle’s area, and so scales as the square of the size) against a length tolerance. A triangle a micron across then looks degenerate even though its normal is perfectly well determined. The test here is relative: |a x b| > tol.angular() * |a| * |b|, which asks the question that actually matters, whether the two vectors are collinear, and gives the same answer at every scale.

§Errors

OgeomError::Construction if a and b are collinear, or either is null.

Source

pub fn angle(self, other: Self) -> f64

Angle to other, in [0, π].

Source

pub fn is_equal(self, other: Self, tol: Tolerances) -> bool

Whether the two point the same way, within tol.angular().

Source

pub fn is_opposite(self, other: Self, tol: Tolerances) -> bool

Whether the two point opposite ways, within tol.angular().

Source

pub fn is_parallel(self, other: Self, tol: Tolerances) -> bool

Whether the two are parallel, ignoring sense.

Source

pub fn is_normal(self, other: Self, tol: Tolerances) -> bool

Whether the two are perpendicular, within tol.angular().

Source

pub fn any_perpendicular(self) -> Self

Some direction perpendicular to this one.

Which one is unspecified but deterministic. Chosen by crossing with whichever axis this direction is least aligned with, so the cross product is never near-degenerate and the result is numerically sound for every input.

Source

pub const fn reversed(self) -> Self

This direction reflected through the origin.

Source

pub fn to_2d(self, tol: Tolerances) -> OgeomResult<Direction2>

This direction with the Z component dropped, renormalized.

§Errors

OgeomError::Construction if this direction is parallel to Z, leaving nothing to project.

Trait Implementations§

Source§

impl Clone for Direction

Source§

fn clone(&self) -> Direction

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Direction

Source§

impl Debug for Direction

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<Direction> for Vector

Source§

fn from(d: Direction) -> Self

Converts to this type from the input type.
Source§

impl Mul<Direction> for f64

Source§

type Output = Vector

The resulting type after applying the * operator.
Source§

fn mul(self, d: Direction) -> Vector

Performs the * operation. Read more
Source§

impl Mul<f64> for Direction

Source§

fn mul(self, s: f64) -> Vector

Scaling a direction yields a free vector: the result is no longer unit length, so it is no longer a direction.

Source§

type Output = Vector

The resulting type after applying the * operator.
Source§

impl Neg for Direction

Source§

type Output = Direction

The resulting type after applying the - operator.
Source§

fn neg(self) -> Self

Performs the unary - operation. Read more
Source§

impl PartialEq for Direction

Source§

fn eq(&self, other: &Direction) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for Direction

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> ClosedNeg for T
where T: Neg<Output = T>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Scalar for T
where T: 'static + Clone + PartialEq + Debug,

§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

§

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

Checks if self is actually part of its subset T (and can be converted to it).
§

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

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.