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// this file aims to contains the various representations of rotation/orientation 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// in 2D and 3D space excepted Matrix and Quaternion. 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class RotationBase 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Common base class for compact rotation representations 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Derived is the derived type, i.e., a rotation type 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _Dim the dimension of the space 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, int _Dim> 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass RotationBase 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Dim = _Dim }; 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** the scalar type of the coefficients */ 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename ei_traits<Derived>::Scalar Scalar; 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** corresponding linear transformation matrix type */ 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,Dim,Dim> RotationMatrixType; 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Derived& derived() const { return *static_cast<const Derived*>(this); } 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& derived() { return *static_cast<Derived*>(this); } 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns an equivalent rotation matrix */ 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); } 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the inverse rotation */ 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived inverse() const { return derived().inverse(); } 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the concatenation of the rotation \c *this with a translation \a t */ 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Transform<Scalar,Dim> operator*(const Translation<Scalar,Dim>& t) const 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return toRotationMatrix() * t; } 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the concatenation of the rotation \c *this with a scaling \a s */ 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline RotationMatrixType operator*(const Scaling<Scalar,Dim>& s) const 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return toRotationMatrix() * s; } 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the concatenation of the rotation \c *this with an affine transformation \a t */ 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Transform<Scalar,Dim> operator*(const Transform<Scalar,Dim>& t) const 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return toRotationMatrix() * t; } 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \geometry_module 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Constructs a Dim x Dim rotation matrix from the rotation \a r 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols> 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived> 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols> 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r) 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim)) 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *this = r.toRotationMatrix(); 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \geometry_module 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Set a Dim x Dim rotation matrix from the rotation \a r 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols> 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived> 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>& 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols> 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r) 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim)) 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this = r.toRotationMatrix(); 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Helper function to return an arbitrary rotation object to a rotation matrix. 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Scalar the numeric type of the matrix coefficients 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Dim the dimension of the current space 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It returns a Dim x Dim fixed size matrix. 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Default specializations are provided for: 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - any scalar type (2D), 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - any matrix expression, 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D) 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Currently ei_toRotationMatrix is only used by Transform. 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Transform, class Rotation2D, class Quaternion, class AngleAxis 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Dim> 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic inline Matrix<Scalar,2,2> ei_toRotationMatrix(const Scalar& s) 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT(Dim==2,YOU_MADE_A_PROGRAMMING_MISTAKE) 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Rotation2D<Scalar>(s).toRotationMatrix(); 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Dim, typename OtherDerived> 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic inline Matrix<Scalar,Dim,Dim> ei_toRotationMatrix(const RotationBase<OtherDerived,Dim>& r) 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return r.toRotationMatrix(); 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Dim, typename OtherDerived> 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic inline const MatrixBase<OtherDerived>& ei_toRotationMatrix(const MatrixBase<OtherDerived>& mat) 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime==Dim && OtherDerived::ColsAtCompileTime==Dim, 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath YOU_MADE_A_PROGRAMMING_MISTAKE) 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return mat; 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 124