aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Geometry/RotationBase.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2009-01-29 09:36:48 +0000
committerGravatar Gael Guennebaud <g.gael@free.fr>2009-01-29 09:36:48 +0000
commit1752a3a6772dcb586646254233d62d5e86cf047d (patch)
tree78dcdb92b4532e4d867eaa52ad6cfd6bc46cc54e /Eigen/src/Geometry/RotationBase.h
parent36c8a649238221cc370268b6d877e89caed8805f (diff)
more MSVC fixes, and more code factorization in Geometry module
Diffstat (limited to 'Eigen/src/Geometry/RotationBase.h')
-rw-r--r--Eigen/src/Geometry/RotationBase.h42
1 files changed, 36 insertions, 6 deletions
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<Derived>::Scalar Scalar;
-
+
/** corresponding linear transformation matrix type */
typedef Matrix<Scalar,Dim,Dim> RotationMatrixType;
+ typedef Matrix<Scalar,Dim,1> VectorType;
+
+ protected:
+ template<typename MatrixType, bool IsVector=MatrixType::IsVectorAtCompileTime>
+ struct generic_product_selector
+ {
+ typedef RotationMatrixType ReturnType;
+ inline static RotationMatrixType run(const Derived& r, const MatrixType& m)
+ { return r.toRotationMatrix() * m; }
+ };
+ template<typename OtherVectorType>
+ struct generic_product_selector<OtherVectorType,true>
+ {
+ 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<const Derived*>(this); }
inline Derived& derived() { return *static_cast<Derived*>(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<Scalar>& 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<typename OtherDerived>
- inline RotationMatrixType operator*(const MatrixBase<OtherDerived>& l) const
- { return toRotationMatrix() * l.derived(); }
-
+ inline typename generic_product_selector<OtherDerived>::ReturnType
+ operator*(const MatrixBase<OtherDerived>& e) const
+ { return generic_product_selector<OtherDerived>::run(derived(), e.derived()); }
+
/** \returns the concatenation of a linear transformation \a l with the rotation \a r */
template<typename OtherDerived> friend
inline RotationMatrixType operator*(const MatrixBase<OtherDerived>& 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<Scalar,Dim> operator*(const Transform<Scalar,Dim>& t) const
{ return toRotationMatrix() * t; }
+
+ template<typename OtherVectorType>
+ inline VectorType _transformVector(const OtherVectorType& v) const
+ { return toRotationMatrix() * v; }
};
/** \geometry_module