11 #ifndef EIGEN_QUATERNION_H
12 #define EIGEN_QUATERNION_H
13 #include "./InternalHeaderCheck.h"
24 template<
typename Other,
25 int OtherRows=Other::RowsAtCompileTime,
26 int OtherCols=Other::ColsAtCompileTime>
27 struct quaternionbase_assign_impl;
36 template<
class Derived>
42 using Base::operator*;
45 typedef typename internal::traits<Derived>::Scalar Scalar;
47 typedef typename internal::traits<Derived>::Coefficients Coefficients;
48 typedef typename Coefficients::CoeffReturnType CoeffReturnType;
49 typedef std::conditional_t<bool(internal::traits<Derived>::Flags&
LvalueBit),
50 Scalar&, CoeffReturnType> NonConstCoeffReturnType;
54 Flags = Eigen::internal::traits<Derived>::Flags
68 EIGEN_DEVICE_FUNC
inline CoeffReturnType
x()
const {
return this->derived().coeffs().coeff(0); }
70 EIGEN_DEVICE_FUNC
inline CoeffReturnType
y()
const {
return this->derived().coeffs().coeff(1); }
72 EIGEN_DEVICE_FUNC
inline CoeffReturnType
z()
const {
return this->derived().coeffs().coeff(2); }
74 EIGEN_DEVICE_FUNC
inline CoeffReturnType
w()
const {
return this->derived().coeffs().coeff(3); }
77 EIGEN_DEVICE_FUNC
inline NonConstCoeffReturnType
x() {
return this->derived().coeffs().x(); }
79 EIGEN_DEVICE_FUNC
inline NonConstCoeffReturnType
y() {
return this->derived().coeffs().y(); }
81 EIGEN_DEVICE_FUNC
inline NonConstCoeffReturnType
z() {
return this->derived().coeffs().z(); }
83 EIGEN_DEVICE_FUNC
inline NonConstCoeffReturnType
w() {
return this->derived().coeffs().w(); }
92 EIGEN_DEVICE_FUNC
inline const typename internal::traits<Derived>::Coefficients&
coeffs()
const {
return derived().coeffs(); }
95 EIGEN_DEVICE_FUNC
inline typename internal::traits<Derived>::Coefficients&
coeffs() {
return derived().coeffs(); }
127 EIGEN_DEVICE_FUNC
inline Scalar
norm()
const {
return coeffs().norm(); }
149 template<
typename Derived1,
typename Derived2>
167 template<
class OtherDerived>
175 template<
class OtherDerived>
183 template<
class OtherDerived>
190 #ifdef EIGEN_PARSED_BY_DOXYGEN
196 template<
typename NewScalarType>
197 EIGEN_DEVICE_FUNC
inline typename internal::cast_return_type<Derived,Quaternion<NewScalarType> >::type
cast()
const;
201 template<
typename NewScalarType>
202 EIGEN_DEVICE_FUNC
inline
203 std::enable_if_t<internal::is_same<Scalar,NewScalarType>::value,
const Derived&>
cast()
const
208 template<
typename NewScalarType>
209 EIGEN_DEVICE_FUNC
inline
217 friend std::ostream& operator<<(std::ostream& s,
const QuaternionBase<Derived>& q) {
218 s << q.x() <<
"i + " << q.y() <<
"j + " << q.z() <<
"k" <<
" + " << q.w();
223 #ifdef EIGEN_QUATERNIONBASE_PLUGIN
224 # include EIGEN_QUATERNIONBASE_PLUGIN
227 EIGEN_DEFAULT_COPY_CONSTRUCTOR(QuaternionBase)
228 EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(QuaternionBase)
261 template<
typename Scalar_,
int Options_>
262 struct traits<Quaternion<Scalar_,Options_> >
264 typedef Quaternion<Scalar_,Options_> PlainObject;
265 typedef Scalar_ Scalar;
266 typedef Matrix<Scalar_,4,1,Options_> Coefficients;
268 Alignment = internal::traits<Coefficients>::Alignment,
274 template<
typename Scalar_,
int Options_>
279 enum { NeedsAlignment = internal::traits<Quaternion>::Alignment>0 };
281 typedef Scalar_ Scalar;
283 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(
Quaternion)
284 using Base::operator*=;
286 typedef typename internal::traits<Quaternion>::Coefficients Coefficients;
299 EIGEN_DEVICE_FUNC
inline Quaternion(
const Scalar&
w,
const Scalar&
x,
const Scalar&
y,
const Scalar&
z) : m_coeffs(
x,
y,
z,
w){}
302 EIGEN_DEVICE_FUNC
explicit inline Quaternion(
const Scalar* data) : m_coeffs(data) {}
314 template<
typename Derived>
318 template<
typename OtherScalar,
int OtherOptions>
320 { m_coeffs = other.coeffs().template cast<Scalar>(); }
324 EIGEN_DEVICE_FUNC
inline Quaternion(
Quaternion&& other) EIGEN_NOEXCEPT_IF(std::is_nothrow_move_constructible<Scalar>::value)
325 : m_coeffs(std::move(other.coeffs()))
331 m_coeffs = std::move(other.
coeffs());
337 template<
typename Derived1,
typename Derived2>
340 EIGEN_DEVICE_FUNC
inline Coefficients& coeffs() {
return m_coeffs;}
341 EIGEN_DEVICE_FUNC
inline const Coefficients& coeffs()
const {
return m_coeffs;}
343 EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(
bool(NeedsAlignment))
345 #ifdef EIGEN_QUATERNION_PLUGIN
346 # include EIGEN_QUATERNION_PLUGIN
350 Coefficients m_coeffs;
352 #ifndef EIGEN_PARSED_BY_DOXYGEN
353 EIGEN_STATIC_ASSERT( (Options_ &
DontAlign) == Options_,
354 INVALID_MATRIX_TEMPLATE_PARAMETERS)
370 template<
typename Scalar_,
int Options_>
371 struct traits<
Map<
Quaternion<Scalar_>, Options_> > : traits<Quaternion<Scalar_, (int(Options_)&Aligned)==Aligned ? AutoAlign : DontAlign> >
378 template<
typename Scalar_,
int Options_>
379 struct traits<Map<const Quaternion<Scalar_>, Options_> > : traits<Quaternion<Scalar_, (int(Options_)&Aligned)==Aligned ? AutoAlign : DontAlign> >
381 typedef Map<const Matrix<Scalar_,4,1>, Options_> Coefficients;
400 template<
typename Scalar_,
int Options_>
402 :
public QuaternionBase<Map<const Quaternion<Scalar_>, Options_> >
407 typedef Scalar_ Scalar;
408 typedef typename internal::traits<Map>::Coefficients Coefficients;
409 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(
Map)
410 using Base::operator*=;
418 EIGEN_DEVICE_FUNC
explicit EIGEN_STRONG_INLINE
Map(
const Scalar* coeffs) : m_coeffs(coeffs) {}
420 EIGEN_DEVICE_FUNC
inline const Coefficients& coeffs()
const {
return m_coeffs;}
423 const Coefficients m_coeffs;
437 template<
typename Scalar_,
int Options_>
444 typedef Scalar_ Scalar;
445 typedef typename internal::traits<Map>::Coefficients Coefficients;
446 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(
Map)
447 using Base::operator*=;
455 EIGEN_DEVICE_FUNC
explicit EIGEN_STRONG_INLINE
Map(Scalar* coeffs) : m_coeffs(coeffs) {}
457 EIGEN_DEVICE_FUNC
inline Coefficients& coeffs() {
return m_coeffs; }
458 EIGEN_DEVICE_FUNC
inline const Coefficients& coeffs()
const {
return m_coeffs; }
461 Coefficients m_coeffs;
484 template<
int Arch,
class Derived1,
class Derived2,
typename Scalar>
struct quat_product
489 a.
w() * b.
w() - a.
x() * b.
x() - a.
y() * b.
y() - a.
z() * b.
z(),
490 a.
w() * b.
x() + a.
x() * b.
w() + a.
y() * b.
z() - a.
z() * b.
y(),
491 a.
w() * b.
y() + a.
y() * b.
w() + a.
z() * b.
x() - a.
x() * b.
z(),
492 a.
w() * b.
z() + a.
z() * b.
w() + a.
x() * b.
y() - a.
y() * b.
x()
499 template <
class Derived>
500 template <
class OtherDerived>
501 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion<typename internal::traits<Derived>::Scalar>
504 EIGEN_STATIC_ASSERT((internal::is_same<typename Derived::Scalar, typename OtherDerived::Scalar>::value),
505 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
506 return internal::quat_product<Architecture::Target, Derived, OtherDerived,
507 typename internal::traits<Derived>::Scalar>::run(*
this, other);
511 template <
class Derived>
512 template <
class OtherDerived>
515 derived() = derived() * other.derived();
526 template <
class Derived>
535 Vector3 uv = this->vec().cross(v);
537 return v + this->w() * uv + this->vec().cross(uv);
540 template<
class Derived>
543 coeffs() = other.
coeffs();
547 template<
class Derived>
548 template<
class OtherDerived>
549 EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& QuaternionBase<Derived>::operator=(
const QuaternionBase<OtherDerived>& other)
551 coeffs() = other.coeffs();
557 template<
class Derived>
562 Scalar ha = Scalar(0.5)*aa.
angle();
564 this->vec() =
sin(ha) * aa.
axis();
574 template<
class Derived>
575 template<
class MatrixDerived>
578 EIGEN_STATIC_ASSERT((internal::is_same<typename Derived::Scalar, typename MatrixDerived::Scalar>::value),
579 YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
580 internal::quaternionbase_assign_impl<MatrixDerived>::run(*
this, xpr.
derived());
587 template<
class Derived>
597 const Scalar tx = Scalar(2)*this->x();
598 const Scalar ty = Scalar(2)*this->y();
599 const Scalar tz = Scalar(2)*this->z();
600 const Scalar twx = tx*this->w();
601 const Scalar twy = ty*this->w();
602 const Scalar twz = tz*this->w();
603 const Scalar txx = tx*this->x();
604 const Scalar txy = ty*this->x();
605 const Scalar txz = tz*this->x();
606 const Scalar tyy = ty*this->y();
607 const Scalar tyz = tz*this->y();
608 const Scalar tzz = tz*this->z();
610 res.
coeffRef(0,0) = Scalar(1)-(tyy+tzz);
614 res.
coeffRef(1,1) = Scalar(1)-(txx+tzz);
618 res.
coeffRef(2,2) = Scalar(1)-(txx+tyy);
633 template<
class Derived>
634 template<
typename Derived1,
typename Derived2>
637 EIGEN_USING_STD(
sqrt)
640 Scalar c = v1.dot(v0);
652 c = numext::maxi(c,Scalar(-1));
657 Scalar w2 = (Scalar(1)+c)*Scalar(0.5);
658 this->w() =
sqrt(w2);
659 this->vec() = axis *
sqrt(Scalar(1) - w2);
663 Scalar s =
sqrt((Scalar(1)+c)*Scalar(2));
664 Scalar invs = Scalar(1)/s;
665 this->vec() = axis * invs;
666 this->w() = s * Scalar(0.5);
675 template<
typename Scalar,
int Options>
678 EIGEN_USING_STD(
sqrt)
681 const Scalar u1 = internal::random<Scalar>(0, 1),
682 u2 = internal::random<Scalar>(0, 2*EIGEN_PI),
683 u3 = internal::random<Scalar>(0, 2*EIGEN_PI);
684 const Scalar a =
sqrt(Scalar(1) - u1),
700 template<
typename Scalar,
int Options>
701 template<
typename Derived1,
typename Derived2>
716 template <
class Derived>
720 Scalar n2 = this->squaredNorm();
732 template<
int Arch,
class Derived,
typename Scalar>
struct quat_conj
746 template <
class Derived>
747 EIGEN_DEVICE_FUNC
inline Quaternion<typename internal::traits<Derived>::Scalar>
750 return internal::quat_conj<Architecture::Target, Derived,
751 typename internal::traits<Derived>::Scalar>::run(*
this);
758 template <
class Derived>
759 template <
class OtherDerived>
760 EIGEN_DEVICE_FUNC
inline typename internal::traits<Derived>::Scalar
763 EIGEN_USING_STD(atan2)
765 return Scalar(2) * atan2( d.
vec().norm(), numext::abs(d.
w()) );
776 template <
class Derived>
777 template <
class OtherDerived>
781 EIGEN_USING_STD(
acos)
784 Scalar d = this->dot(other);
785 Scalar absD = numext::abs(d);
792 scale0 = Scalar(1) - t;
798 Scalar theta =
acos(absD);
799 Scalar sinTheta =
sin(theta);
801 scale0 =
sin( ( Scalar(1) - t ) * theta) / sinTheta;
802 scale1 =
sin( ( t * theta) ) / sinTheta;
804 if(d<Scalar(0)) scale1 = -scale1;
812 template<
typename Other>
813 struct quaternionbase_assign_impl<Other,3,3>
815 typedef typename Other::Scalar Scalar;
816 template<
class Derived> EIGEN_DEVICE_FUNC
static inline void run(
QuaternionBase<Derived>& q,
const Other& a_mat)
818 const typename internal::nested_eval<Other,2>::type mat(a_mat);
819 EIGEN_USING_STD(
sqrt)
822 Scalar t = mat.trace();
825 t =
sqrt(t + Scalar(1.0));
826 q.
w() = Scalar(0.5)*t;
828 q.
x() = (mat.coeff(2,1) - mat.coeff(1,2)) * t;
829 q.
y() = (mat.coeff(0,2) - mat.coeff(2,0)) * t;
830 q.
z() = (mat.coeff(1,0) - mat.coeff(0,1)) * t;
835 if (mat.coeff(1,1) > mat.coeff(0,0))
837 if (mat.coeff(2,2) > mat.coeff(i,i))
842 t =
sqrt(mat.coeff(i,i)-mat.coeff(j,j)-mat.coeff(k,k) + Scalar(1.0));
843 q.
coeffs().coeffRef(i) = Scalar(0.5) * t;
845 q.
w() = (mat.coeff(k,j)-mat.coeff(j,k))*t;
846 q.
coeffs().coeffRef(j) = (mat.coeff(j,i)+mat.coeff(i,j))*t;
847 q.
coeffs().coeffRef(k) = (mat.coeff(k,i)+mat.coeff(i,k))*t;
853 template<
typename Other>
854 struct quaternionbase_assign_impl<Other,4,1>
856 typedef typename Other::Scalar Scalar;
857 template<
class Derived> EIGEN_DEVICE_FUNC
static inline void run(QuaternionBase<Derived>& q,
const Other& vec)
Represents a 3D rotation as a rotation angle around an arbitrary 3D axis.
Definition: AngleAxis.h:52
const Vector3 & axis() const
Definition: AngleAxis.h:98
Scalar angle() const
Definition: AngleAxis.h:93
Derived & derived()
Definition: EigenBase.h:48
Two-sided Jacobi SVD decomposition of a rectangular matrix.
Definition: JacobiSVD.h:514
Map(Scalar *coeffs)
Definition: Quaternion.h:455
Map(const Scalar *coeffs)
Definition: Quaternion.h:418
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:98
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:52
const PlainObject normalized() const
Definition: Dot.h:121
Scalar & coeffRef(Index rowId, Index colId)
Definition: PlainObjectBase.h:187
Base class for quaternion expressions.
Definition: Quaternion.h:38
Scalar squaredNorm() const
Definition: Quaternion.h:122
const internal::traits< Derived >::Coefficients & coeffs() const
Definition: Quaternion.h:92
QuaternionBase & setIdentity()
Definition: Quaternion.h:117
bool operator!=(const QuaternionBase< OtherDerived > &other) const
Definition: Quaternion.h:176
Quaternion< Scalar > conjugate() const
Definition: Quaternion.h:748
NonConstCoeffReturnType y()
Definition: Quaternion.h:79
bool isApprox(const QuaternionBase< OtherDerived > &other, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
Definition: Quaternion.h:184
static Quaternion< Scalar > Identity()
Definition: Quaternion.h:113
void normalize()
Definition: Quaternion.h:131
Derived & setFromTwoVectors(const MatrixBase< Derived1 > &a, const MatrixBase< Derived2 > &b)
Definition: Quaternion.h:635
CoeffReturnType z() const
Definition: Quaternion.h:72
NonConstCoeffReturnType x()
Definition: Quaternion.h:77
Matrix3 toRotationMatrix() const
Definition: Quaternion.h:589
VectorBlock< Coefficients, 3 > vec()
Definition: Quaternion.h:89
internal::cast_return_type< Derived, Quaternion< NewScalarType > >::type cast() const
Matrix< Scalar, 3, 1 > Vector3
Definition: Quaternion.h:59
NonConstCoeffReturnType z()
Definition: Quaternion.h:81
Scalar dot(const QuaternionBase< OtherDerived > &other) const
Definition: Quaternion.h:141
Derived & operator=(const AngleAxisType &aa)
Definition: Quaternion.h:558
Vector3 _transformVector(const Vector3 &v) const
Definition: Quaternion.h:528
CoeffReturnType y() const
Definition: Quaternion.h:70
Scalar norm() const
Definition: Quaternion.h:127
Quaternion< Scalar > inverse() const
Definition: Quaternion.h:717
CoeffReturnType w() const
Definition: Quaternion.h:74
Matrix< Scalar, 3, 3 > Matrix3
Definition: Quaternion.h:61
bool operator==(const QuaternionBase< OtherDerived > &other) const
Definition: Quaternion.h:168
NonConstCoeffReturnType w()
Definition: Quaternion.h:83
const VectorBlock< const Coefficients, 3 > vec() const
Definition: Quaternion.h:86
Quaternion< Scalar > normalized() const
Definition: Quaternion.h:134
internal::traits< Derived >::Coefficients & coeffs()
Definition: Quaternion.h:95
AngleAxis< Scalar > AngleAxisType
Definition: Quaternion.h:63
Derived & operator*=(const QuaternionBase< OtherDerived > &q)
Definition: Quaternion.h:513
CoeffReturnType x() const
Definition: Quaternion.h:68
The quaternion class used to represent 3D orientations and rotations.
Definition: Quaternion.h:276
Quaternion & operator=(Quaternion &&other) EIGEN_NOEXCEPT_IF(std
Definition: Quaternion.h:329
Quaternion(const Quaternion< OtherScalar, OtherOptions > &other)
Definition: Quaternion.h:319
Quaternion(const Scalar &w, const Scalar &x, const Scalar &y, const Scalar &z)
Definition: Quaternion.h:299
Quaternion(const QuaternionBase< Derived > &other)
Definition: Quaternion.h:305
static Quaternion UnitRandom()
Definition: Quaternion.h:676
Quaternion(const MatrixBase< Derived > &other)
Definition: Quaternion.h:315
Quaternion(const AngleAxisType &aa)
Definition: Quaternion.h:308
Quaternion()
Definition: Quaternion.h:290
Quaternion(Quaternion &&other) EIGEN_NOEXCEPT_IF(std
Definition: Quaternion.h:324
Quaternion(const Scalar *data)
Definition: Quaternion.h:302
Common base class for compact rotation representations.
Definition: RotationBase.h:32
internal::traits< Derived >::Scalar Scalar
Definition: RotationBase.h:36
const MatrixVType & matrixV() const
Definition: SVDBase.h:191
Expression of a fixed-size or dynamic-size sub-vector.
Definition: VectorBlock.h:62
Map< Quaternion< double >, Aligned > QuaternionMapAlignedd
Definition: Quaternion.h:475
Quaternion< double > Quaterniond
Definition: Quaternion.h:363
Quaternion< float > Quaternionf
Definition: Quaternion.h:360
Map< Quaternion< float >, 0 > QuaternionMapf
Definition: Quaternion.h:466
Map< Quaternion< double >, 0 > QuaternionMapd
Definition: Quaternion.h:469
Map< Quaternion< float >, Aligned > QuaternionMapAlignedf
Definition: Quaternion.h:472
@ Aligned
Definition: Constants.h:242
@ DontAlign
Definition: Constants.h:327
@ AutoAlign
Definition: Constants.h:325
@ ComputeFullV
Definition: Constants.h:399
const unsigned int LvalueBit
Definition: Constants.h:146
Namespace containing all symbols from the Eigen library.
Definition: Core:139
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_acos_op< typename Derived::Scalar >, const Derived > acos(const Eigen::ArrayBase< Derived > &x)
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:59
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_cos_op< typename Derived::Scalar >, const Derived > cos(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sin_op< typename Derived::Scalar >, const Derived > sin(const Eigen::ArrayBase< Derived > &x)
const Eigen::CwiseUnaryOp< Eigen::internal::scalar_sqrt_op< typename Derived::Scalar >, const Derived > sqrt(const Eigen::ArrayBase< Derived > &x)
Holds information about the various numeric (i.e. scalar) types allowed by Eigen.
Definition: NumTraits.h:231