diff options
author | Gael Guennebaud <g.gael@free.fr> | 2008-08-30 21:36:04 +0000 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2008-08-30 21:36:04 +0000 |
commit | 9c450a52a28e10f4caf87a968612fa8d007ce4b1 (patch) | |
tree | c95245adcfa486f6cf7d75bba3456bd226d778d3 /Eigen/src | |
parent | 6ba991aa3a2ddd1a1ed1d64956aeab5cab680e54 (diff) |
Split Rotation.h to Rotation2D.h and RotationBase.h,
and more code factorization based on RotationBase.
Added notes about the main aim of the Translation and Scaling classes.
Diffstat (limited to 'Eigen/src')
-rw-r--r-- | Eigen/src/Core/Matrix.h | 8 | ||||
-rw-r--r-- | Eigen/src/Core/util/ForwardDeclarations.h | 1 | ||||
-rw-r--r-- | Eigen/src/Geometry/AngleAxis.h | 38 | ||||
-rw-r--r-- | Eigen/src/Geometry/Quaternion.h | 25 | ||||
-rw-r--r-- | Eigen/src/Geometry/Rotation2D.h (renamed from Eigen/src/Geometry/Rotation.h) | 93 | ||||
-rw-r--r-- | Eigen/src/Geometry/RotationBase.h | 137 | ||||
-rw-r--r-- | Eigen/src/Geometry/Scaling.h | 2 | ||||
-rw-r--r-- | Eigen/src/Geometry/Translation.h | 2 |
8 files changed, 157 insertions, 149 deletions
diff --git a/Eigen/src/Core/Matrix.h b/Eigen/src/Core/Matrix.h index 44e4c45b8..cf018ffef 100644 --- a/Eigen/src/Core/Matrix.h +++ b/Eigen/src/Core/Matrix.h @@ -364,10 +364,10 @@ class Matrix /////////// Geometry module /////////// - explicit Matrix(const Quaternion<Scalar>& q); - Matrix& operator=(const Quaternion<Scalar>& q); - explicit Matrix(const AngleAxis<Scalar>& aa); - Matrix& operator=(const AngleAxis<Scalar>& aa); + template<typename OtherDerived> + explicit Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r); + template<typename OtherDerived> + Matrix& operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r); }; /** \defgroup matrixtypedefs Global matrix typedefs diff --git a/Eigen/src/Core/util/ForwardDeclarations.h b/Eigen/src/Core/util/ForwardDeclarations.h index b85ef94f7..015f4e5b7 100644 --- a/Eigen/src/Core/util/ForwardDeclarations.h +++ b/Eigen/src/Core/util/ForwardDeclarations.h @@ -100,6 +100,7 @@ template<typename MatrixType> class Cholesky; template<typename MatrixType> class CholeskyWithoutSquareRoot; // Geometry module: +template<typename Derived, int _Dim> class RotationBase; template<typename Lhs, typename Rhs> class Cross; template<typename Scalar> class Quaternion; template<typename Scalar> class Rotation2D; diff --git a/Eigen/src/Geometry/AngleAxis.h b/Eigen/src/Geometry/AngleAxis.h index 0d43b277e..0b4fd03d0 100644 --- a/Eigen/src/Geometry/AngleAxis.h +++ b/Eigen/src/Geometry/AngleAxis.h @@ -44,6 +44,10 @@ * \include AngleAxis_mimic_euler.cpp * Output: \verbinclude AngleAxis_mimic_euler.out * + * \note This class is not aimed to be used to store a rotation transformation, + * but rather to make easier the creation of other rotation (Quaternion, rotation Matrix) + * and transformation objects. + * * \sa class Quaternion, class Transform, MatrixBase::UnitX() */ @@ -104,18 +108,15 @@ public: { return a * QuaternionType(b); } /** Concatenates two rotations */ - inline Matrix3 - operator* (const Matrix3& other) const + inline Matrix3 operator* (const Matrix3& other) const { return toRotationMatrix() * other; } /** Concatenates two rotations */ - inline friend Matrix3 - operator* (const Matrix3& a, const AngleAxis& b) + inline friend Matrix3 operator* (const Matrix3& a, const AngleAxis& b) { return a * b.toRotationMatrix(); } /** Applies rotation to vector */ - inline Vector3 - operator* (const Vector3& other) const + inline Vector3 operator* (const Vector3& other) const { return toRotationMatrix() * other; } /** \returns the inverse rotation, i.e., an angle-axis with opposite rotation angle */ @@ -198,29 +199,4 @@ AngleAxis<Scalar>::toRotationMatrix(void) const return res; } -/** \geometry_module - * - * Constructs a 3x3 rotation matrix from the angle-axis \a aa - * - * \sa Matrix(const Quaternion&) - */ -template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols> -Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>::Matrix(const AngleAxis<Scalar>& aa) -{ - EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,3,3); - *this = aa.toRotationMatrix(); -} - -/** \geometry_module - * - * Set a 3x3 rotation matrix from the angle-axis \a aa - */ -template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols> -Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>& -Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>::operator=(const AngleAxis<Scalar>& aa) -{ - EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,3,3); - return *this = aa.toRotationMatrix(); -} - #endif // EIGEN_ANGLEAXIS_H diff --git a/Eigen/src/Geometry/Quaternion.h b/Eigen/src/Geometry/Quaternion.h index fc1537711..8fbc645ea 100644 --- a/Eigen/src/Geometry/Quaternion.h +++ b/Eigen/src/Geometry/Quaternion.h @@ -432,29 +432,4 @@ struct ei_quaternion_assign_impl<Other,4,1> } }; -/** \geometry_module - * - * Constructs a 3x3 rotation matrix from the quaternion \a q - * - * \sa Matrix(const AngleAxis&) - */ -template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols> -Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>::Matrix(const Quaternion<Scalar>& q) -{ - EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,3,3); - *this = q.toRotationMatrix(); -} - -/** \geometry_module - * - * Set a 3x3 rotation matrix from the quaternion \a q - */ -template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols> -Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>& -Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>::operator=(const Quaternion<Scalar>& q) -{ - EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,3,3); - return *this = q.toRotationMatrix(); -} - #endif // EIGEN_QUATERNION_H diff --git a/Eigen/src/Geometry/Rotation.h b/Eigen/src/Geometry/Rotation2D.h index 696fcdd4e..1c3cbc05d 100644 --- a/Eigen/src/Geometry/Rotation.h +++ b/Eigen/src/Geometry/Rotation2D.h @@ -22,49 +22,8 @@ // License and a copy of the GNU General Public License along with // Eigen. If not, see <http://www.gnu.org/licenses/>. -#ifndef EIGEN_ROTATION_H -#define EIGEN_ROTATION_H - -// this file aims to contains the various representations of rotation/orientation -// in 2D and 3D space excepted Matrix and Quaternion. - -/** \class RotationBase - * - * \brief Common base class for compact rotation representations - * - * \param Derived is the derived type, i.e., a rotation type - * \param _Dim the dimension of the space - */ -template<typename Derived, int _Dim> -class RotationBase -{ - public: - enum { Dim = _Dim }; - /** the scalar type of the coefficients */ - typedef typename ei_traits<Derived>::Scalar Scalar; - - /** corresponding linear transformation matrix type */ - typedef Matrix<Scalar,Dim,Dim> RotationMatrixType; - - inline const Derived& derived() const { return *static_cast<const Derived*>(this); } - inline Derived& derived() { return *static_cast<Derived*>(this); } - - /** \returns an equivalent rotation matrix */ - inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); } - - /** \returns the concatenation of the rotation \c *this with a translation \a t */ - inline Transform<Scalar,Dim> operator*(const Translation<Scalar,Dim>& t) const - { return toRotationMatrix() * t; } - - /** \returns the concatenation of the rotation \c *this with a scaling \a s */ - inline RotationMatrixType operator*(const Scaling<Scalar,Dim>& s) const - { return toRotationMatrix() * s; } - - /** \returns the concatenation of the rotation \c *this with an affine transformation \a t */ - inline Transform<Scalar,Dim> operator*(const Transform<Scalar,Dim>& t) const - { return toRotationMatrix() * t; } - -}; +#ifndef EIGEN_ROTATION2D_H +#define EIGEN_ROTATION2D_H /** \geometry_module \ingroup GeometryModule * @@ -115,11 +74,6 @@ public: /** \returns a read-write reference to the rotation angle */ inline Scalar& angle() { return m_angle; } - /** Automatic convertion to a 2D rotation matrix. - * \sa toRotationMatrix() - */ - inline operator Matrix2() const { return toRotationMatrix(); } - /** \returns the inverse rotation */ inline Rotation2D inverse() const { return -m_angle; } @@ -143,7 +97,7 @@ public: * parameter \a t. It is in fact equivalent to a linear interpolation. */ inline Rotation2D slerp(Scalar t, const Rotation2D& other) const - { return m_angle * (1-t) + t * other; } + { return m_angle * (1-t) + other.angle() * t; } }; /** \ingroup GeometryModule @@ -177,43 +131,4 @@ Rotation2D<Scalar>::toRotationMatrix(void) const return (Matrix2() << cosA, -sinA, sinA, cosA).finished(); } -/** \internal - * - * Helper function to return an arbitrary rotation object to a rotation matrix. - * - * \param Scalar the numeric type of the matrix coefficients - * \param Dim the dimension of the current space - * - * It returns a Dim x Dim fixed size matrix. - * - * Default specializations are provided for: - * - any scalar type (2D), - * - any matrix expression, - * - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D) - * - * Currently ei_toRotationMatrix is only used by Transform. - * - * \sa class Transform, class Rotation2D, class Quaternion, class AngleAxis - */ -template<typename Scalar, int Dim> -inline static Matrix<Scalar,2,2> ei_toRotationMatrix(const Scalar& s) -{ - EIGEN_STATIC_ASSERT(Dim==2,you_did_a_programming_error); - return Rotation2D<Scalar>(s).toRotationMatrix(); -} - -template<typename Scalar, int Dim, typename OtherDerived> -inline static Matrix<Scalar,Dim,Dim> ei_toRotationMatrix(const RotationBase<OtherDerived,Dim>& r) -{ - return r.toRotationMatrix(); -} - -template<typename Scalar, int Dim, typename OtherDerived> -inline static const MatrixBase<OtherDerived>& ei_toRotationMatrix(const MatrixBase<OtherDerived>& mat) -{ - EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime==Dim && OtherDerived::ColsAtCompileTime==Dim, - you_did_a_programming_error); - return mat; -} - -#endif // EIGEN_ROTATION_H +#endif // EIGEN_ROTATION2D_H diff --git a/Eigen/src/Geometry/RotationBase.h b/Eigen/src/Geometry/RotationBase.h new file mode 100644 index 000000000..e436f8fe6 --- /dev/null +++ b/Eigen/src/Geometry/RotationBase.h @@ -0,0 +1,137 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. Eigen itself is part of the KDE project. +// +// Copyright (C) 2008 Gael Guennebaud <g.gael@free.fr> +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see <http://www.gnu.org/licenses/>. + +#ifndef EIGEN_ROTATIONBASE_H +#define EIGEN_ROTATIONBASE_H + +// this file aims to contains the various representations of rotation/orientation +// in 2D and 3D space excepted Matrix and Quaternion. + +/** \class RotationBase + * + * \brief Common base class for compact rotation representations + * + * \param Derived is the derived type, i.e., a rotation type + * \param _Dim the dimension of the space + */ +template<typename Derived, int _Dim> +class RotationBase +{ + public: + enum { Dim = _Dim }; + /** the scalar type of the coefficients */ + typedef typename ei_traits<Derived>::Scalar Scalar; + + /** corresponding linear transformation matrix type */ + typedef Matrix<Scalar,Dim,Dim> RotationMatrixType; + + inline const Derived& derived() const { return *static_cast<const Derived*>(this); } + inline Derived& derived() { return *static_cast<Derived*>(this); } + + /** \returns an equivalent rotation matrix */ + inline RotationMatrixType toRotationMatrix() const { return derived().toRotationMatrix(); } + + /** \returns the inverse rotation */ + inline Derived inverse() const { return derived().inverse(); } + + /** \returns the concatenation of the rotation \c *this with a translation \a t */ + inline Transform<Scalar,Dim> operator*(const Translation<Scalar,Dim>& t) const + { return toRotationMatrix() * t; } + + /** \returns the concatenation of the rotation \c *this with a scaling \a s */ + inline RotationMatrixType operator*(const Scaling<Scalar,Dim>& s) const + { return toRotationMatrix() * s; } + + /** \returns the concatenation of the rotation \c *this with an affine transformation \a t */ + inline Transform<Scalar,Dim> operator*(const Transform<Scalar,Dim>& t) const + { return toRotationMatrix() * t; } +}; + +/** \geometry_module + * + * Constructs a Dim x Dim rotation matrix from the rotation \a r + */ +template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols> +template<typename OtherDerived> +Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols> +::Matrix(const RotationBase<OtherDerived,ColsAtCompileTime>& r) +{ + EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,OtherDerived::Dim,OtherDerived::Dim); + *this = r.toRotationMatrix(); +} + +/** \geometry_module + * + * Set a Dim x Dim rotation matrix from the rotation \a r + */ +template<typename _Scalar, int _Rows, int _Cols, int _Storage, int _MaxRows, int _MaxCols> +template<typename OtherDerived> +Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols>& +Matrix<_Scalar, _Rows, _Cols, _Storage, _MaxRows, _MaxCols> +::operator=(const RotationBase<OtherDerived,ColsAtCompileTime>& r) +{ + EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix,OtherDerived::Dim,OtherDerived::Dim); + return *this = r.toRotationMatrix(); +} + +/** \internal + * + * Helper function to return an arbitrary rotation object to a rotation matrix. + * + * \param Scalar the numeric type of the matrix coefficients + * \param Dim the dimension of the current space + * + * It returns a Dim x Dim fixed size matrix. + * + * Default specializations are provided for: + * - any scalar type (2D), + * - any matrix expression, + * - any type based on RotationBase (e.g., Quaternion, AngleAxis, Rotation2D) + * + * Currently ei_toRotationMatrix is only used by Transform. + * + * \sa class Transform, class Rotation2D, class Quaternion, class AngleAxis + */ +template<typename Scalar, int Dim> +inline static Matrix<Scalar,2,2> ei_toRotationMatrix(const Scalar& s) +{ + EIGEN_STATIC_ASSERT(Dim==2,you_did_a_programming_error); + return Rotation2D<Scalar>(s).toRotationMatrix(); +} + +template<typename Scalar, int Dim, typename OtherDerived> +inline static Matrix<Scalar,Dim,Dim> ei_toRotationMatrix(const RotationBase<OtherDerived,Dim>& r) +{ + return r.toRotationMatrix(); +} + +template<typename Scalar, int Dim, typename OtherDerived> +inline static const MatrixBase<OtherDerived>& ei_toRotationMatrix(const MatrixBase<OtherDerived>& mat) +{ + EIGEN_STATIC_ASSERT(OtherDerived::RowsAtCompileTime==Dim && OtherDerived::ColsAtCompileTime==Dim, + you_did_a_programming_error); + return mat; +} + +#endif // EIGEN_ROTATIONBASE_H diff --git a/Eigen/src/Geometry/Scaling.h b/Eigen/src/Geometry/Scaling.h index 4712b7d94..ded1b6220 100644 --- a/Eigen/src/Geometry/Scaling.h +++ b/Eigen/src/Geometry/Scaling.h @@ -34,6 +34,8 @@ * \param _Scalar the scalar type, i.e., the type of the coefficients. * \param _Dim the dimension of the space, can be a compile time value or Dynamic * + * \note This class is not aimed to be used to store a scaling transformation, + * but rather to make easier the constructions and updates of Transformation object. * * \sa class Translation, class Transform */ diff --git a/Eigen/src/Geometry/Translation.h b/Eigen/src/Geometry/Translation.h index f35670546..056fd2818 100644 --- a/Eigen/src/Geometry/Translation.h +++ b/Eigen/src/Geometry/Translation.h @@ -34,6 +34,8 @@ * \param _Scalar the scalar type, i.e., the type of the coefficients. * \param _Dim the dimension of the space, can be a compile time value or Dynamic * + * \note This class is not aimed to be used to store a translation transformation, + * but rather to make easier the constructions and updates of Transformation object. * * \sa class Scaling, class Transform */ |