From 1752a3a6772dcb586646254233d62d5e86cf047d Mon Sep 17 00:00:00 2001 From: Gael Guennebaud Date: Thu, 29 Jan 2009 09:36:48 +0000 Subject: more MSVC fixes, and more code factorization in Geometry module --- Eigen/src/Geometry/RotationBase.h | 42 +++++++++++++++++++++++++++++++++------ 1 file changed, 36 insertions(+), 6 deletions(-) (limited to 'Eigen/src/Geometry/RotationBase.h') diff --git a/Eigen/src/Geometry/RotationBase.h b/Eigen/src/Geometry/RotationBase.h index 9d5f16e3f..1ce8834a4 100644 --- a/Eigen/src/Geometry/RotationBase.h +++ b/Eigen/src/Geometry/RotationBase.h @@ -42,10 +42,31 @@ class RotationBase enum { Dim = _Dim }; /** the scalar type of the coefficients */ typedef typename ei_traits::Scalar Scalar; - + /** corresponding linear transformation matrix type */ typedef Matrix RotationMatrixType; + typedef Matrix VectorType; + + protected: + template + struct generic_product_selector + { + typedef RotationMatrixType ReturnType; + inline static RotationMatrixType run(const Derived& r, const MatrixType& m) + { return r.toRotationMatrix() * m; } + }; + template + struct generic_product_selector + { + typedef VectorType ReturnType; + inline static VectorType run(const Derived& r, const OtherVectorType& v) + { + return r._transformVector(v); + } + }; + + public: inline const Derived& derived() const { return *static_cast(this); } inline Derived& derived() { return *static_cast(this); } @@ -62,12 +83,17 @@ class RotationBase /** \returns the concatenation of the rotation \c *this with a uniform scaling \a s */ inline RotationMatrixType operator*(const UniformScaling& s) const { return toRotationMatrix() * s.factor(); } - - /** \returns the concatenation of the rotation \c *this with a linear transformation \a l */ + + /** \returns the concatenation of the rotation \c *this with a generic expression \a e + * \a e can be: + * - a DimxDim linear transformation matrix (including an axis aligned scaling) + * - a vector of size Dim + */ template - inline RotationMatrixType operator*(const MatrixBase& l) const - { return toRotationMatrix() * l.derived(); } - + inline typename generic_product_selector::ReturnType + operator*(const MatrixBase& e) const + { return generic_product_selector::run(derived(), e.derived()); } + /** \returns the concatenation of a linear transformation \a l with the rotation \a r */ template friend inline RotationMatrixType operator*(const MatrixBase& l, const Derived& r) @@ -76,6 +102,10 @@ class RotationBase /** \returns the concatenation of the rotation \c *this with an affine transformation \a t */ inline Transform operator*(const Transform& t) const { return toRotationMatrix() * t; } + + template + inline VectorType _transformVector(const OtherVectorType& v) const + { return toRotationMatrix() * v; } }; /** \geometry_module -- cgit v1.2.3