#[cfg(feature = "arbitrary")] use quickcheck::{Arbitrary, Gen}; #[cfg(feature = "arbitrary")] use core::storage::Owned; use num::{Zero, One}; use rand::{Rng, Rand}; use alga::general::ClosedAdd; use core::{DefaultAllocator, Scalar, VectorN}; use core::dimension::{DimName, U1, U2, U3, U4, U5, U6}; use core::allocator::Allocator; use geometry::Translation; impl Translation where DefaultAllocator: Allocator { /// Creates a new square identity rotation of the given `dimension`. #[inline] pub fn identity() -> Translation { Self::from_vector(VectorN::::from_element(N::zero())) } } impl One for Translation where DefaultAllocator: Allocator { #[inline] fn one() -> Self { Self::identity() } } impl Rand for Translation where DefaultAllocator: Allocator { #[inline] fn rand(rng: &mut G) -> Self { Self::from_vector(rng.gen()) } } #[cfg(feature = "arbitrary")] impl Arbitrary for Translation where DefaultAllocator: Allocator, Owned: Send { #[inline] fn arbitrary(rng: &mut G) -> Self { Self::from_vector(Arbitrary::arbitrary(rng)) } } /* * * Small translation construction from components. * */ macro_rules! componentwise_constructors_impl( ($($D: ty, $($args: ident:$irow: expr),*);* $(;)*) => {$( impl Translation where DefaultAllocator: Allocator { /// Initializes this matrix from its components. #[inline] pub fn new($($args: N),*) -> Self { Self::from_vector(VectorN::::new($($args),*)) } } )*} ); componentwise_constructors_impl!( U1, x:0; U2, x:0, y:1; U3, x:0, y:1, z:2; U4, x:0, y:1, z:2, w:3; U5, x:0, y:1, z:2, w:3, a:4; U6, x:0, y:1, z:2, w:3, a:4, b:5; );