//! **nalgebra** prelude. use std::num::{Zero, One}; pub use traits::{ Absolute, AbsoluteRotate, AlgebraicVec, AlgebraicVecExt, Basis, Cast, Col, Cov, Cross, CrossMatrix, Dim, Dot, FromHomogeneous, Indexable, Inv, Iterable, IterableMut, LMul, Mat, Mean, Norm, Outer, RMul, Rotate, Rotation, RotationMatrix, RotationWithTranslation, Row, ScalarAdd, ScalarSub, ToHomogeneous, Transform, Transformation, Translate, Translation, Transpose, UniformSphereSample, Vec, VecExt }; pub use structs::{ Identity, DMat, DVec, Iso2, Iso3, Iso4, Mat1, Mat2, Mat3, Mat4, Mat5, Mat6, Rot2, Rot3, Rot4, Vec0, Vec1, Vec2, Vec3, Vec4, Vec5, Vec6 }; // // // Constructors // // /// Create a special identity object. /// /// Same as `Identity::new()`. #[inline(always)] pub fn identity() -> Identity { Identity::new() } /// Create a zero-valued value. /// /// This is the same as `std::num::Zero::zero()`. #[inline(always)] pub fn zero() -> T { Zero::zero() } /// Create a one-valued value. /// /// This is the same as `std::num::One::one()`. #[inline(always)] pub fn one() -> T { One::one() } // // // Geometry // // /* * Translation */ /// Gets the translation applicable by `m`. /// /// ```rust /// extern mod nalgebra; /// use nalgebra::types::{Vec3, Iso3}; /// use nalgebra::na; /// /// pub main() { /// let t = Iso3::new(Vec3::new(1.0, 1.0, 1.0), na::zero()); /// let trans = na::translation(t); /// /// assert!(trans == Vec3::new(1.0, 1.0, 1.0)); /// } /// ``` #[inline(always)] pub fn translation>(m: &M) -> V { m.translation() } /// Gets the inverse translation applicable by `m`. /// /// ```rust /// extern mod nalgebra; /// use nalgebra::types::{Vec3, Iso3}; /// use nalgebra::na; /// /// pub main() { /// let t = Iso3::new(Vec3::new(1.0, 1.0, 1.0), na::zero()); /// let itrans = na::inv_translation(t); /// /// assert!(itrans == Vec3::new(-1.0, -1.0, -1.0)); /// } /// ``` #[inline(always)] pub fn inv_translation>(m: &M) -> V { m.inv_translation() } /// Appied the translation `v` to a copy of `m`. #[inline(always)] pub fn append_translation>(m: &M, v: &V) -> M { Translation::append_translation_cpy(m, v) } /* * Translate */ /// Applies a translation to a vector. /// /// ```rust /// extern mod nalgebra; /// use nalgebra::na::{Vec3, Iso3}; /// use nalgebra::na; /// /// pub main() { /// let t = Iso3::new(Vec3::new(1.0, 1.0, 1.0), na::zero()); /// let v = Vec3::new(2.0, 2.0, 2.0); /// /// let tv = na::translate(&t, &v); /// /// assert!(tv == Vec3::new(3.0, 3.0, 3.0)) /// } /// ``` #[inline(always)] pub fn translate>(m: &M, v: &V) -> V { m.translate(v) } /// Applies an inverse translation to a vector. /// /// ```rust /// extern mod nalgebra; /// use nalgebra::na::{Vec3, Iso3}; /// use nalgebra::na; /// /// pub main() { /// let t = Iso3::new(Vec3::new(1.0, 1.0, 1.0), na::zero()); /// let v = Vec3::new(2.0, 2.0, 2.0); /// /// let tv = na::translate(&t, &v); /// /// assert!(tv == Vec3::new(1.0, 1.0, 1.0)) /// } #[inline(always)] pub fn inv_translate>(m: &M, v: &V) -> V { m.inv_translate(v) } /* * Rotation */ /// Gets the rotation applicable by `m`. /// /// ```rust /// extern mod nalgebra; /// use nalgebra::na::{Vec3, Rot3}; /// use nalgebra::na; /// /// pub main() { /// let t = Rot3::new(Vec3::new(1.0, 1.0, 1.0)); /// /// assert!(na::rotation(t) == Vec3::new(1.0, 1.0, 1.0)); /// } /// ``` #[inline(always)] pub fn rotation>(m: &M) -> V { m.rotation() } /// Gets the inverse rotation applicable by `m`. /// /// ```rust /// extern mod nalgebra; /// use nalgebra::na::{Vec3, Rot3}; /// use nalgebra::na; /// /// pub main() { /// let t = Rot3::new(Vec3::new(1.0, 1.0, 1.0)); /// /// assert!(na::inv_rotation(t) == Vec3::new(-1.0, -1.0, -1.0)); /// } /// ``` #[inline(always)] pub fn inv_rotation>(m: &M) -> V { m.inv_rotation() } /// Applies the rotation `v` to a copy of `m`. /// /// ```rust /// extern mod nalgebra; /// use nalgebra::na::{Vec3, Rot3}; /// use nalgebra::na; /// /// pub main() { /// let t = Rot3::new(Vec3::new(0.0, 0.0, 0.0)); /// let v = Vec3::new(1.0, 1.0, 1.0); /// let rt = na::append_rotation(&t, &v); /// /// assert!(na::rotation(&rt) == Vec3::new(1.0, 1.0, 1.0)) /// } /// ``` #[inline(always)] pub fn append_rotation>(m: &M, v: &V) -> M { Rotation::append_rotation_cpy(m, v) } /* * Rotate */ /// Applies a rotation to a vector. /// /// ```rust /// extern mod nalgebra; /// use nalgebra::na::{Rot3, Vec3}; /// use nalgebra::na; /// /// pub main() { /// let t = Rot3::new(Vec3::new(1.0, 0.0, 0.0)); /// let v = Vec3::new(0.0, 0.0, na::pi() / 2.0); /// /// let tv = na::rotate(&t, &v); /// /// assert!(tv == Vec3::new(0.0, 1.0, 0.0)) /// } /// ``` #[inline(always)] pub fn rotate>(m: &M, v: &V) -> V { m.rotate(v) } /// Applies an inverse rotation to a vector. /// /// ```rust /// extern mod nalgebra; /// use nalgebra::na; /// /// pub main() { /// let t = Rot3::new(Vec3::new(1.0, 0.0, 0.0)); /// let v = Vec3::new(0.0, 0.0, na::pi() / 2.0); /// /// let tv = na::rotate(&t, &v); /// /// assert!(tv == Vec3::new(0.0, -1.0, 0.0)) /// } /// ``` #[inline(always)] pub fn inv_rotate>(m: &M, v: &V) -> V { m.inv_rotate(v) } /* * RotationWithTranslation */ /// Rotates a copy of `m` by `amount` using `center` ase the pivot point. #[inline(always)] pub fn append_rotation_wrt_point, AV, M: RotationWithTranslation>( m: &M, amount: &AV, center: &LV) -> M { RotationWithTranslation::append_rotation_wrt_point_cpy(m, amount, center) } /// Rotates a copy of `m` by `amount` using `m.translation()` as the pivot point. #[inline(always)] pub fn rotate_wrt_center, AV, M: RotationWithTranslation>( m: &M, amount: &AV) -> M { RotationWithTranslation::append_rotation_wrt_center_cpy(m, amount) } /* * RotationMatrix */ /// Builds a rotation matrix from `r`. #[inline(always)] pub fn to_rot_mat + Rotation, R: RotationMatrix>(r: &R) -> M { r.to_rot_mat() } /* * AbsoluteRotate */ /// Applies a rotation using the absolute values of its components. #[inline(always)] pub fn absolute_rotate>(m: &M, v: &V) -> V { m.absolute_rotate(v) } /* * Transformation */ /// Gets the transformation applicable by `m`. #[inline(always)] pub fn transformation>(m: &M) -> T { m.transformation() } /// Gets the inverse transformation applicable by `m`. #[inline(always)] pub fn inv_transformation>(m: &M) -> T { m.inv_transformation() } /// Gets a transformed copy of `m`. #[inline(always)] pub fn append_transformation>(m: &M, t: &T) -> M { Transformation::append_transformation_cpy(m, t) } /* * Transform */ /// Applies a transformation to a vector. #[inline(always)] pub fn transform>(m: &M, v: &V) -> V { m.transform(v) } /// Applies an inverse transformation to a vector. #[inline(always)] pub fn inv_transform>(m: &M, v: &V) -> V { m.inv_transform(v) } /* * Dot */ /// Computes the dot product of two vectors. #[inline(always)] pub fn dot, N>(a: &V, b: &V) -> N { a.dot(b) } /// Computes a subtraction followed by a dot product. #[inline(always)] pub fn sub_dot, N>(a: &V, b: &V, c: &V) -> N { a.sub_dot(b, c) } /* * Norm */ /// Computes the L2 norm of a vector. #[inline(always)] pub fn norm, N: Algebraic>(v: &V) -> N { v.norm() } /// Computes the squared L2 norm of a vector. #[inline(always)] pub fn sqnorm, N: Algebraic>(v: &V) -> N { v.sqnorm() } /// Gets the normalized version of a vector. #[inline(always)] pub fn normalize, N: Algebraic>(v: &V) -> V { Norm::normalize_cpy(v) } /* * Cross */ /// Computes the cross product of two vectors. #[inline(always)] pub fn cross, AV>(a: &LV, b: &LV) -> AV { a.cross(b) } /* * CrossMatrix */ /// Given a vector, computes the matrix which, when multiplied by another vector, computes a cross /// product. #[inline(always)] pub fn cross_matrix, M>(v: &V) -> M { v.cross_matrix() } /* * ToHomogeneous */ /// Converts a matrix or vector to homogoneous coordinates. #[inline(always)] pub fn to_homogeneous, Res>(m: &M) -> Res { m.to_homogeneous() } /* * FromHomogeneous */ /// Converts a matrix or vector from homogoneous coordinates. /// /// w-normalization is appied. #[inline(always)] pub fn from_homogeneous>(m: &M) -> Res { FromHomogeneous::from(m) } /* * UniformSphereSample */ /// Samples the unit sphere living on the dimension as the samples types. /// /// The number of sampling point is implementation-specific. It is always uniform. #[inline(always)] pub fn sample_sphere(f: &fn(V)) { UniformSphereSample::sample(f) } // // // Operations // // /* * Absolute */ /// Computes a component-wise absolute value. #[inline(always)] pub fn absolute, Res>(m: &M) -> Res { m.absolute() } /* * Inv */ /// Gets an inverted copy of a matrix. #[inline(always)] pub fn inv(m: &M) -> Option { Inv::inv_cpy(m) } /* * Transpose */ /// Gets a transposed copy of a matrix. #[inline(always)] pub fn transpose(m: &M) -> M { Transpose::transpose_cpy(m) } /* * Outer */ /// Computes the outer product of two vectors. #[inline(always)] pub fn outer, M>(a: &V, b: &V) -> M { a.outer(b) } /* * Cov */ /// Computes the covariance of a set of observations. #[inline(always)] pub fn cov, Res>(observations: &M) -> Res { observations.cov() } /* * Mean */ /// Computes the mean of a set of observations. #[inline(always)] pub fn mean>(observations: &M) -> N { observations.mean() } // // // Structure // // /* * Basis */ /// Computes the canonical basis for a given dimension. #[inline(always)] pub fn canonical_basis(f: &fn(V) -> bool) { Basis::canonical_basis(f) } /// Computes the basis of the orthonormal subspace of a given vector. #[inline(always)] pub fn orthonormal_subspace_basis(v: &V, f: &fn(V) -> bool) { v.orthonormal_subspace_basis(f) } /* * Row */ /* * Col */ /* * Dim */ /// Gets the dimension an object lives in. /// /// Same as `Dim::dim::(None::)`. #[inline(always)] pub fn dim() -> uint { Dim::dim(None::) } /* * Cast */ /// Converts an object from one type to another. /// /// For primitive types, this is the same as the `as` keywords. /// The following properties are preserved by a cast: /// /// * Type-level geometric invariants cannot be broken (eg. a cast from Rot3 to Rot3 is /// not possible) /// * A cast to a type with more type-level invariants cannot be done (eg. a cast from Mat to /// Rot3 is not possible) /// * For primitive types an unbounded cast is done using the `as` keyword (this is different from /// the standard library which makes bound-checking to ensure eg. that a i64 is not out of the /// range of an i32 when a cast from i64 to i32 is done). /// * A cast does not affect the dimension of an algebraic object. Note that this prevents an /// isometric transform to be cast to a raw matrix. Use `to_homogeneous` for that special purpose. #[inline(always)] pub fn cast>(t: T) -> U { Cast::from(t) } /* * Indexable */