diff options
author | Gael Guennebaud <g.gael@free.fr> | 2008-07-19 13:03:23 +0000 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2008-07-19 13:03:23 +0000 |
commit | 05ad0834676b7f375df7fd33d90a7db871787330 (patch) | |
tree | 762654dac952a2abb928ec685c7009e95fa67c99 /Eigen/src/Core/CwiseNullaryOp.h | |
parent | 7245c63067c69dcaac036ef9045c84ed1401c12d (diff) |
Added MatrixBase::Unit*() static function to easily create unit/basis vectors.
Removed EulerAngles, addes typdefs for Quaternion and AngleAxis,
and added automatic conversions from Quaternion/AngleAxis to Matrix3 such that:
Matrix3f m = AngleAxisf(0.2,Vector3f::UnitX) * AngleAxisf(0.2,Vector3f::UnitY);
just works.
Diffstat (limited to 'Eigen/src/Core/CwiseNullaryOp.h')
-rw-r--r-- | Eigen/src/Core/CwiseNullaryOp.h | 84 |
1 files changed, 76 insertions, 8 deletions
diff --git a/Eigen/src/Core/CwiseNullaryOp.h b/Eigen/src/Core/CwiseNullaryOp.h index 167993e02..3cf9070e2 100644 --- a/Eigen/src/Core/CwiseNullaryOp.h +++ b/Eigen/src/Core/CwiseNullaryOp.h @@ -43,13 +43,13 @@ template<typename NullaryOp, typename MatrixType> struct ei_traits<CwiseNullaryOp<NullaryOp, MatrixType> > { - typedef typename MatrixType::Scalar Scalar; + typedef typename ei_traits<MatrixType>::Scalar Scalar; enum { - RowsAtCompileTime = MatrixType::RowsAtCompileTime, - ColsAtCompileTime = MatrixType::ColsAtCompileTime, - MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime, - MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime, - Flags = (MatrixType::Flags + RowsAtCompileTime = ei_traits<MatrixType>::RowsAtCompileTime, + ColsAtCompileTime = ei_traits<MatrixType>::ColsAtCompileTime, + MaxRowsAtCompileTime = ei_traits<MatrixType>::MaxRowsAtCompileTime, + MaxColsAtCompileTime = ei_traits<MatrixType>::MaxColsAtCompileTime, + Flags = (ei_traits<MatrixType>::Flags & ( HereditaryBits | (ei_functor_has_linear_access<NullaryOp>::ret ? LinearAccessBit : 0) | (ei_functor_traits<NullaryOp>::PacketAccess ? PacketAccessBit : 0))) @@ -453,7 +453,7 @@ Derived& MatrixBase<Derived>::setOnes() * \sa identity(), setIdentity(), isIdentity() */ template<typename Derived> -inline const CwiseNullaryOp<ei_scalar_identity_op<typename ei_traits<Derived>::Scalar>, Derived> +inline const typename MatrixBase<Derived>::IdentityReturnType MatrixBase<Derived>::identity(int rows, int cols) { return NullaryExpr(rows, cols, ei_scalar_identity_op<Scalar>()); @@ -470,7 +470,7 @@ MatrixBase<Derived>::identity(int rows, int cols) * \sa identity(int,int), setIdentity(), isIdentity() */ template<typename Derived> -inline const CwiseNullaryOp<ei_scalar_identity_op<typename ei_traits<Derived>::Scalar>, Derived> +inline const typename MatrixBase<Derived>::IdentityReturnType MatrixBase<Derived>::identity() { EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) @@ -522,4 +522,72 @@ inline Derived& MatrixBase<Derived>::setIdentity() return *this = identity(rows(), cols()); } +/** \returns an expression of the i-th unit (basis) vector. + * + * \only_for_vectors + * + * \sa MatrixBase::Unit(int), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(int size, int i) +{ + EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); + return BasisReturnType(SquareMatrixType::identity(size,size), i); +} + +/** \returns an expression of the i-th unit (basis) vector. + * + * \only_for_vectors + * + * This variant is for fixed-size vector only. + * + * \sa MatrixBase::Unit(int,int), MatrixBase::UnitX(), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::Unit(int i) +{ + EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived); + return BasisReturnType(SquareMatrixType::identity(),i); +} + +/** \returns an expression of the X axis unit vector (1{,0}^*) + * + * \only_for_vectors + * + * \sa MatrixBase::Unit(int,int), MatrixBase::Unit(int), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitX() +{ return Derived::Unit(0); } + +/** \returns an expression of the Y axis unit vector (0,1{,0}^*) + * + * \only_for_vectors + * + * \sa MatrixBase::Unit(int,int), MatrixBase::Unit(int), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitY() +{ return Derived::Unit(1); } + +/** \returns an expression of the Z axis unit vector (0,0,1{,0}^*) + * + * \only_for_vectors + * + * \sa MatrixBase::Unit(int,int), MatrixBase::Unit(int), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitZ() +{ return Derived::Unit(2); } + +/** \returns an expression of the W axis unit vector (0,0,0,1) + * + * \only_for_vectors + * + * \sa MatrixBase::Unit(int,int), MatrixBase::Unit(int), MatrixBase::UnitY(), MatrixBase::UnitZ(), MatrixBase::UnitW() + */ +template<typename Derived> +const typename MatrixBase<Derived>::BasisReturnType MatrixBase<Derived>::UnitW() +{ return Derived::Unit(3); } + #endif // EIGEN_CWISE_NULLARY_OP_H |