devela/geom/dir/orientation.rs
1// devela/src/geom/dir/orientation.rs
2//
3//! Defines [`Orientation`][1|2|3].
4//
5
6#[cfg(doc)]
7use crate::{Distance, Position};
8
9#[doc = crate::_tags!(geom dir)]
10/// A unitless directional vector in `D`-dimensional space.
11#[doc = crate::_doc_meta!{location("geom/dir")}]
12///
13/// Represents **only the direction of movement**, without an absolute
14/// reference point or inherent magnitude. It is **typically normalized**
15/// to remove scale dependence.
16///
17/// - Unlike [`Position`], `Orientation` **does not describe a fixed location**.
18/// - Unlike [`Distance`], `Orientation` **does not measure separation**.
19///
20/// This type does **not enforce normalization**, but it is expected
21/// to be normalized in most use cases.
22///
23/// See also: [`Orientation1`], [`Orientation2`], [`Orientation3`], [`ori!`][crate::ori].
24#[must_use]
25#[repr(transparent)]
26pub struct Orientation<T, const D: usize> {
27 /// The directional components in `D`-dimensional space.
28 pub dim: [T; D],
29}
30
31#[doc = crate::_tags!(geom dir)]
32/// A 1-dimensional [`Orientation`].
33#[doc = crate::_doc_meta!{location("geom/dir")}]
34pub type Orientation1<T> = Orientation<T, 1>;
35
36#[doc = crate::_tags!(geom dir)]
37/// A 2-dimensional [`Orientation`].
38#[doc = crate::_doc_meta!{location("geom/dir")}]
39pub type Orientation2<T> = Orientation<T, 2>;
40
41#[doc = crate::_tags!(geom dir)]
42/// A 3-dimensional [`Orientation`].
43#[doc = crate::_doc_meta!{location("geom/dir")}]
44pub type Orientation3<T> = Orientation<T, 3>;
45
46crate::_geom_dim_impl_common![common_methods: Orientation];
47crate::_geom_dim_impl_common![common_traits: Orientation];