1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.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#ifndef EIGEN_ROTATIONBASE_H 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_ROTATIONBASE_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// forward declaration 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename RotationDerived, typename MatrixType, bool IsVector=MatrixType::IsVectorAtCompileTime> 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct rotation_base_generic_product_selector; 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class RotationBase 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Common base class for compact rotation representations 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Derived is the derived type, i.e., a rotation type 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param _Dim the dimension of the space 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived, int _Dim> 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass RotationBase 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Dim = _Dim }; 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** the scalar type of the coefficients */ 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Scalar Scalar; 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** corresponding linear transformation matrix type */ 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,Dim,Dim> RotationMatrixType; 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<Scalar,Dim,1> VectorType; 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Derived& derived() const { return *static_cast<const Derived*>(this); } 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived& derived() { return *static_cast<Derived*>(this); } 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns an equivalent rotation matrix */ 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); } 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns an equivalent rotation matrix 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This function is added to be conform with the Transform class' naming scheme. 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline RotationMatrixType matrix() const { return derived().toRotationMatrix(); } 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the inverse rotation */ 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Derived inverse() const { return derived().inverse(); } 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the concatenation of the rotation \c *this with a translation \a t */ 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Transform<Scalar,Dim,Isometry> operator*(const Translation<Scalar,Dim>& t) const 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return Transform<Scalar,Dim,Isometry>(*this) * t; } 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the concatenation of the rotation \c *this with a uniform scaling \a s */ 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline RotationMatrixType operator*(const UniformScaling<Scalar>& s) const 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return toRotationMatrix() * s.factor(); } 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the concatenation of the rotation \c *this with a generic expression \a e 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \a e can be: 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - a DimxDim linear transformation matrix 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - a DimxDim diagonal matrix (axis aligned scaling) 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - a vector of size Dim 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STRONG_INLINE typename internal::rotation_base_generic_product_selector<Derived,OtherDerived,OtherDerived::IsVectorAtCompileTime>::ReturnType 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath operator*(const EigenBase<OtherDerived>& e) const 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return internal::rotation_base_generic_product_selector<Derived,OtherDerived>::run(derived(), e.derived()); } 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the concatenation of a linear transformation \a l with the rotation \a r */ 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherDerived> friend 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline RotationMatrixType operator*(const EigenBase<OtherDerived>& l, const Derived& r) 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return l.derived() * r.toRotationMatrix(); } 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the concatenation of a scaling \a l with the rotation \a r */ 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath friend inline Transform<Scalar,Dim,Affine> operator*(const DiagonalMatrix<Scalar,Dim>& l, const Derived& r) 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Transform<Scalar,Dim,Affine> res(r); 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.linear().applyOnTheLeft(l); 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return res; 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** \returns the concatenation of the rotation \c *this with a transformation \a t */ 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int Mode, int Options> 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Transform<Scalar,Dim,Mode> operator*(const Transform<Scalar,Dim,Mode,Options>& t) const 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return toRotationMatrix() * t; } 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename OtherVectorType> 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline VectorType _transformVector(const OtherVectorType& v) const 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return toRotationMatrix() * v; } 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// implementation of the generic product rotation * matrix 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename RotationDerived, typename MatrixType> 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct rotation_base_generic_product_selector<RotationDerived,MatrixType,false> 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Dim = RotationDerived::Dim }; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<typename RotationDerived::Scalar,Dim,Dim> ReturnType; 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline ReturnType run(const RotationDerived& r, const MatrixType& m) 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return r.toRotationMatrix() * m; } 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename RotationDerived, typename Scalar, int Dim, int MaxDim> 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct rotation_base_generic_product_selector< RotationDerived, DiagonalMatrix<Scalar,Dim,MaxDim>, false > 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Transform<Scalar,Dim,Affine> ReturnType; 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static inline ReturnType run(const RotationDerived& r, const DiagonalMatrix<Scalar,Dim,MaxDim>& m) 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ReturnType res(r); 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath res.linear() *= m; 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return res; 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename RotationDerived,typename OtherVectorType> 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstruct rotation_base_generic_product_selector<RotationDerived,OtherVectorType,true> 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { Dim = RotationDerived::Dim }; 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef Matrix<typename RotationDerived::Scalar,Dim,1> ReturnType; 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath static EIGEN_STRONG_INLINE ReturnType run(const RotationDerived& r, const OtherVectorType& v) 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return r._transformVector(v); 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \geometry_module 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Constructs a Dim x Dim rotation matrix from the rotation \a r 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols> 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived> 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols> 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r) 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim)) 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *this = r.toRotationMatrix(); 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \geometry_module 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Set a Dim x Dim rotation matrix from the rotation \a r 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols> 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename OtherDerived> 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>& 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathMatrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols> 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r) 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,int(OtherDerived::Dim),int(OtherDerived::Dim)) 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this = r.toRotationMatrix(); 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal { 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \internal 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Helper function to return an arbitrary rotation object to a rotation matrix. 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Scalar the numeric type of the matrix coefficients 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \param Dim the dimension of the current space 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * It returns a Dim x Dim fixed size matrix. 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Default specializations are provided for: 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - any scalar type (2D), 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - any matrix expression, 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D) 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Currently toRotationMatrix is only used by Transform. 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Transform, class Rotation2D, class Quaternion, class AngleAxis 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Dim> 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic inline Matrix<Scalar,2,2> toRotationMatrix(const Scalar& s) 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT(Dim==2,YOU_MADE_A_PROGRAMMING_MISTAKE) 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return Rotation2D<Scalar>(s).toRotationMatrix(); 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Dim, typename OtherDerived> 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic inline Matrix<Scalar,Dim,Dim> toRotationMatrix(const RotationBase<OtherDerived,Dim>& r) 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return r.toRotationMatrix(); 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Scalar, int Dim, typename OtherDerived> 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic inline const MatrixBase<OtherDerived>& toRotationMatrix(const MatrixBase<OtherDerived>& mat) 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime==Dim && OtherDerived::ColsAtCompileTime==Dim, 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath YOU_MADE_A_PROGRAMMING_MISTAKE) 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return mat; 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_ROTATIONBASE_H 207