1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 27faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// no include guard, we'll include this twice from All.h from Eigen2Support, and it's internal anyway 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \geometry_module \ingroup Geometry_Module 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \class Translation 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Represents a translation transformation 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _Scalar the scalar type, i.e., the type of the coefficients. 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _Dim the dimension of the space, can be a compile time value or Dynamic 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \note This class is not aimed to be used to store a translation transformation, 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * but rather to make easier the constructions and updates of Transform objects. 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Scaling, class Transform 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Dim> 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass Translation 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic: 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF_VECTORIZABLE_FIXED_SIZE(_Scalar,_Dim) 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** dimension of the space */ 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Dim = _Dim }; 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** the scalar type of the coefficients */ 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef _Scalar Scalar; 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** corresponding vector type */ 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,Dim,1> VectorType; 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** corresponding linear transformation matrix type */ 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,Dim,Dim> LinearMatrixType; 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** corresponding scaling transformation type */ 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Scaling<Scalar,Dim> ScalingType; 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** corresponding affine transformation type */ 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Transform<Scalar,Dim> TransformType; 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprotected: 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VectorType m_coeffs; 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathpublic: 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Default constructor without initialization. */ 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Translation() {} 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** */ 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Translation(const Scalar& sx, const Scalar& sy) 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ei_assert(Dim==2); 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_coeffs.x() = sx; 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_coeffs.y() = sy; 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** */ 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Translation(const Scalar& sx, const Scalar& sy, const Scalar& sz) 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ei_assert(Dim==3); 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_coeffs.x() = sx; 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_coeffs.y() = sy; 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_coeffs.z() = sz; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Constructs and initialize the scaling transformation from a vector of scaling coefficients */ 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit inline Translation(const VectorType& vector) : m_coeffs(vector) {} 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const VectorType& vector() const { return m_coeffs; } 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath VectorType& vector() { return m_coeffs; } 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Concatenates two translation */ 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Translation operator* (const Translation& other) const 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return Translation(m_coeffs + other.m_coeffs); } 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Concatenates a translation and a scaling */ 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline TransformType operator* (const ScalingType& other) const; 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Concatenates a translation and a linear transformation */ 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline TransformType operator* (const LinearMatrixType& linear) const; 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename Derived> 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline TransformType operator*(const RotationBase<Derived,Dim>& r) const 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return *this * r.toRotationMatrix(); } 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Concatenates a linear transformation and a translation */ 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // its a nightmare to define a templated friend function outside its declaration 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline TransformType operator* (const LinearMatrixType& linear, const Translation& t) 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath TransformType res; 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.matrix().setZero(); 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.linear() = linear; 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.translation() = linear * t.m_coeffs; 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.matrix().row(Dim).setZero(); 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res(Dim,Dim) = Scalar(1); 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return res; 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Concatenates a translation and an affine transformation */ 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline TransformType operator* (const TransformType& t) const; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Applies translation to vector */ 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline VectorType operator* (const VectorType& other) const 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return m_coeffs + other; } 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the inverse translation (opposite) */ 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Translation inverse() const { return Translation(-m_coeffs); } 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Translation& operator=(const Translation& other) 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_coeffs = other.m_coeffs; 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns \c *this with scalar type casted to \a NewScalarType 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Note that if \a NewScalarType is equal to the current scalar type of \c *this 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * then this function smartly returns a const reference to \c *this. 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename NewScalarType> 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type cast() const 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return typename internal::cast_return_type<Translation,Translation<NewScalarType,Dim> >::type(*this); } 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Copy constructor with scalar type conversion */ 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherScalarType> 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline explicit Translation(const Translation<OtherScalarType,Dim>& other) 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { m_coeffs = other.vector().template cast<Scalar>(); } 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns \c true if \c *this is approximately equal to \a other, within the precision 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * determined by \a prec. 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa MatrixBase::isApprox() */ 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool isApprox(const Translation& other, typename NumTraits<Scalar>::Real prec = precision<Scalar>()) const 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return m_coeffs.isApprox(other.m_coeffs, prec); } 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \addtogroup Geometry_Module */ 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//@{ 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef Translation<float, 2> Translation2f; 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef Translation<double,2> Translation2d; 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef Translation<float, 3> Translation3f; 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef Translation<double,3> Translation3d; 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//@} 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Dim> 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename Translation<Scalar,Dim>::TransformType 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathTranslation<Scalar,Dim>::operator* (const ScalingType& other) const 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath TransformType res; 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.matrix().setZero(); 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.linear().diagonal() = other.coeffs(); 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.translation() = m_coeffs; 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res(Dim,Dim) = Scalar(1); 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return res; 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Dim> 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename Translation<Scalar,Dim>::TransformType 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathTranslation<Scalar,Dim>::operator* (const LinearMatrixType& linear) const 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath TransformType res; 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.matrix().setZero(); 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.linear() = linear; 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.translation() = m_coeffs; 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.matrix().row(Dim).setZero(); 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res(Dim,Dim) = Scalar(1); 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return res; 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Dim> 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline typename Translation<Scalar,Dim>::TransformType 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathTranslation<Scalar,Dim>::operator* (const TransformType& t) const 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath TransformType res = t; 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.pretranslate(m_coeffs); 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return res; 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 185