#[cfg(feature = "arbitrary")] use base::storage::Owned; #[cfg(feature = "arbitrary")] use quickcheck::{Arbitrary, Gen}; use num::{One, Zero}; use rand::distributions::{Distribution, Standard}; use rand::Rng; use alga::general::ClosedAdd; use base::allocator::Allocator; use base::dimension::{DimName, U1, U2, U3, U4, U5, U6}; use base::{DefaultAllocator, Scalar, VectorN}; 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 Distribution> for Standard where DefaultAllocator: Allocator, Standard: Distribution, { #[inline] fn sample<'a, G: Rng + ?Sized>(&self, rng: &'a mut G) -> Translation { Translation::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; );