3rdparty/Eigen/Eigen/src/Geometry/Quaternion.h
Go to the documentation of this file.
1 // This file is part of Eigen, a lightweight C++ template library
2 // for linear algebra.
3 //
4 // Copyright (C) 2008-2010 Gael Guennebaud <gael.guennebaud@inria.fr>
5 // Copyright (C) 2009 Mathieu Gautier <mathieu.gautier@cea.fr>
6 //
7 // This Source Code Form is subject to the terms of the Mozilla
8 // Public License v. 2.0. If a copy of the MPL was not distributed
9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10 
11 #ifndef EIGEN_QUATERNION_H
12 #define EIGEN_QUATERNION_H
13 namespace Eigen {
14 
15 
16 /***************************************************************************
17 * Definition of QuaternionBase<Derived>
18 * The implementation is at the end of the file
19 ***************************************************************************/
20 
21 namespace internal {
22 template<typename Other,
23  int OtherRows=Other::RowsAtCompileTime,
24  int OtherCols=Other::ColsAtCompileTime>
26 }
27 
34 template<class Derived>
35 class QuaternionBase : public RotationBase<Derived, 3>
36 {
37  public:
39 
40  using Base::operator*;
41  using Base::derived;
42 
46  typedef typename Coefficients::CoeffReturnType CoeffReturnType;
48  Scalar&, CoeffReturnType>::type NonConstCoeffReturnType;
49 
50 
51  enum {
53  };
54 
55  // typedef typename Matrix<Scalar,4,1> Coefficients;
62 
63 
64 
66  EIGEN_DEVICE_FUNC inline CoeffReturnType x() const { return this->derived().coeffs().coeff(0); }
68  EIGEN_DEVICE_FUNC inline CoeffReturnType y() const { return this->derived().coeffs().coeff(1); }
70  EIGEN_DEVICE_FUNC inline CoeffReturnType z() const { return this->derived().coeffs().coeff(2); }
72  EIGEN_DEVICE_FUNC inline CoeffReturnType w() const { return this->derived().coeffs().coeff(3); }
73 
75  EIGEN_DEVICE_FUNC inline NonConstCoeffReturnType x() { return this->derived().coeffs().x(); }
77  EIGEN_DEVICE_FUNC inline NonConstCoeffReturnType y() { return this->derived().coeffs().y(); }
79  EIGEN_DEVICE_FUNC inline NonConstCoeffReturnType z() { return this->derived().coeffs().z(); }
81  EIGEN_DEVICE_FUNC inline NonConstCoeffReturnType w() { return this->derived().coeffs().w(); }
82 
84  EIGEN_DEVICE_FUNC inline const VectorBlock<const Coefficients,3> vec() const { return coeffs().template head<3>(); }
85 
87  EIGEN_DEVICE_FUNC inline VectorBlock<Coefficients,3> vec() { return coeffs().template head<3>(); }
88 
90  EIGEN_DEVICE_FUNC inline const typename internal::traits<Derived>::Coefficients& coeffs() const { return derived().coeffs(); }
91 
93  EIGEN_DEVICE_FUNC inline typename internal::traits<Derived>::Coefficients& coeffs() { return derived().coeffs(); }
94 
96  template<class OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator=(const QuaternionBase<OtherDerived>& other);
97 
98 // disabled this copy operator as it is giving very strange compilation errors when compiling
99 // test_stdvector with GCC 4.4.2. This looks like a GCC bug though, so feel free to re-enable it if it's
100 // useful; however notice that we already have the templated operator= above and e.g. in MatrixBase
101 // we didn't have to add, in addition to templated operator=, such a non-templated copy operator.
102 // Derived& operator=(const QuaternionBase& other)
103 // { return operator=<Derived>(other); }
104 
105  EIGEN_DEVICE_FUNC Derived& operator=(const AngleAxisType& aa);
106  template<class OtherDerived> EIGEN_DEVICE_FUNC Derived& operator=(const MatrixBase<OtherDerived>& m);
107 
112 
115  EIGEN_DEVICE_FUNC inline QuaternionBase& setIdentity() { coeffs() << Scalar(0), Scalar(0), Scalar(0), Scalar(1); return *this; }
116 
120  EIGEN_DEVICE_FUNC inline Scalar squaredNorm() const { return coeffs().squaredNorm(); }
121 
125  EIGEN_DEVICE_FUNC inline Scalar norm() const { return coeffs().norm(); }
126 
129  EIGEN_DEVICE_FUNC inline void normalize() { coeffs().normalize(); }
132  EIGEN_DEVICE_FUNC inline Quaternion<Scalar> normalized() const { return Quaternion<Scalar>(coeffs().normalized()); }
133 
139  template<class OtherDerived> EIGEN_DEVICE_FUNC inline Scalar dot(const QuaternionBase<OtherDerived>& other) const { return coeffs().dot(other.coeffs()); }
140 
141  template<class OtherDerived> EIGEN_DEVICE_FUNC Scalar angularDistance(const QuaternionBase<OtherDerived>& other) const;
142 
144  EIGEN_DEVICE_FUNC inline Matrix3 toRotationMatrix() const;
145 
147  template<typename Derived1, typename Derived2>
148  EIGEN_DEVICE_FUNC Derived& setFromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);
149 
151  template<class OtherDerived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived& operator*= (const QuaternionBase<OtherDerived>& q);
152 
155 
158 
159  template<class OtherDerived> EIGEN_DEVICE_FUNC Quaternion<Scalar> slerp(const Scalar& t, const QuaternionBase<OtherDerived>& other) const;
160 
165  template<class OtherDerived>
167  { return coeffs() == other.coeffs(); }
168 
173  template<class OtherDerived>
175  { return coeffs() != other.coeffs(); }
176 
181  template<class OtherDerived>
183  { return coeffs().isApprox(other.coeffs(), prec); }
184 
186  EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Vector3 _transformVector(const Vector3& v) const;
187 
188  #ifdef EIGEN_PARSED_BY_DOXYGEN
189 
194  template<typename NewScalarType>
196 
197  #else
198 
199  template<typename NewScalarType>
200  EIGEN_DEVICE_FUNC inline
202  {
203  return derived();
204  }
205 
206  template<typename NewScalarType>
207  EIGEN_DEVICE_FUNC inline
209  {
210  return Quaternion<NewScalarType>(coeffs().template cast<NewScalarType>());
211  }
212  #endif
213 
214 #ifndef EIGEN_NO_IO
215  friend std::ostream& operator<<(std::ostream& s, const QuaternionBase<Derived>& q) {
216  s << q.x() << "i + " << q.y() << "j + " << q.z() << "k" << " + " << q.w();
217  return s;
218  }
219 #endif
220 
221 #ifdef EIGEN_QUATERNIONBASE_PLUGIN
222 # include EIGEN_QUATERNIONBASE_PLUGIN
223 #endif
224 protected:
227 };
228 
229 /***************************************************************************
230 * Definition/implementation of Quaternion<Scalar>
231 ***************************************************************************/
232 
258 namespace internal {
259 template<typename _Scalar,int _Options>
260 struct traits<Quaternion<_Scalar,_Options> >
261 {
263  typedef _Scalar Scalar;
265  enum{
267  Flags = LvalueBit
268  };
269 };
270 }
271 
272 template<typename _Scalar, int _Options>
273 class Quaternion : public QuaternionBase<Quaternion<_Scalar,_Options> >
274 {
275 public:
277  enum { NeedsAlignment = internal::traits<Quaternion>::Alignment>0 };
278 
279  typedef _Scalar Scalar;
280 
282  using Base::operator*=;
283 
286 
289 
297  EIGEN_DEVICE_FUNC inline Quaternion(const Scalar& w, const Scalar& x, const Scalar& y, const Scalar& z) : m_coeffs(x, y, z, w){}
298 
300  EIGEN_DEVICE_FUNC explicit inline Quaternion(const Scalar* data) : m_coeffs(data) {}
301 
303  template<class Derived> EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion(const QuaternionBase<Derived>& other) { this->Base::operator=(other); }
304 
306  EIGEN_DEVICE_FUNC explicit inline Quaternion(const AngleAxisType& aa) { *this = aa; }
307 
312  template<typename Derived>
313  EIGEN_DEVICE_FUNC explicit inline Quaternion(const MatrixBase<Derived>& other) { *this = other; }
314 
316  template<typename OtherScalar, int OtherOptions>
318  { m_coeffs = other.coeffs().template cast<Scalar>(); }
319 
320 #if EIGEN_HAS_RVALUE_REFERENCES
321  // We define a copy constructor, which means we don't get an implicit move constructor or assignment operator.
324  : m_coeffs(std::move(other.coeffs()))
325  {}
326 
329  {
330  m_coeffs = std::move(other.coeffs());
331  return *this;
332  }
333 #endif
334 
335  EIGEN_DEVICE_FUNC static Quaternion UnitRandom();
336 
337  template<typename Derived1, typename Derived2>
338  EIGEN_DEVICE_FUNC static Quaternion FromTwoVectors(const MatrixBase<Derived1>& a, const MatrixBase<Derived2>& b);
339 
340  EIGEN_DEVICE_FUNC inline Coefficients& coeffs() { return m_coeffs;}
341  EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs;}
342 
343  EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(bool(NeedsAlignment))
344 
345 #ifdef EIGEN_QUATERNION_PLUGIN
346 # include EIGEN_QUATERNION_PLUGIN
347 #endif
348 
349 protected:
350  Coefficients m_coeffs;
351 
352 #ifndef EIGEN_PARSED_BY_DOXYGEN
354  {
355  EIGEN_STATIC_ASSERT( (_Options & DontAlign) == _Options,
356  INVALID_MATRIX_TEMPLATE_PARAMETERS)
357  }
358 #endif
359 };
360 
367 
368 /***************************************************************************
369 * Specialization of Map<Quaternion<Scalar>>
370 ***************************************************************************/
371 
372 namespace internal {
373  template<typename _Scalar, int _Options>
374  struct traits<Map<Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> >
375  {
377  };
378 }
379 
380 namespace internal {
381  template<typename _Scalar, int _Options>
382  struct traits<Map<const Quaternion<_Scalar>, _Options> > : traits<Quaternion<_Scalar, (int(_Options)&Aligned)==Aligned ? AutoAlign : DontAlign> >
383  {
386  enum {
387  Flags = TraitsBase::Flags & ~LvalueBit
388  };
389  };
390 }
391 
403 template<typename _Scalar, int _Options>
404 class Map<const Quaternion<_Scalar>, _Options >
405  : public QuaternionBase<Map<const Quaternion<_Scalar>, _Options> >
406 {
407  public:
409 
410  typedef _Scalar Scalar;
413  using Base::operator*=;
414 
421  EIGEN_DEVICE_FUNC explicit EIGEN_STRONG_INLINE Map(const Scalar* coeffs) : m_coeffs(coeffs) {}
422 
423  EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs;}
424 
425  protected:
426  const Coefficients m_coeffs;
427 };
428 
440 template<typename _Scalar, int _Options>
441 class Map<Quaternion<_Scalar>, _Options >
442  : public QuaternionBase<Map<Quaternion<_Scalar>, _Options> >
443 {
444  public:
446 
447  typedef _Scalar Scalar;
450  using Base::operator*=;
451 
458  EIGEN_DEVICE_FUNC explicit EIGEN_STRONG_INLINE Map(Scalar* coeffs) : m_coeffs(coeffs) {}
459 
460  EIGEN_DEVICE_FUNC inline Coefficients& coeffs() { return m_coeffs; }
461  EIGEN_DEVICE_FUNC inline const Coefficients& coeffs() const { return m_coeffs; }
462 
463  protected:
464  Coefficients m_coeffs;
465 };
466 
475 typedef Map<Quaternion<float>, Aligned> QuaternionMapAlignedf;
478 typedef Map<Quaternion<double>, Aligned> QuaternionMapAlignedd;
479 
480 /***************************************************************************
481 * Implementation of QuaternionBase methods
482 ***************************************************************************/
483 
484 // Generic Quaternion * Quaternion product
485 // This product can be specialized for a given architecture via the Arch template argument.
486 namespace internal {
487 template<int Arch, class Derived1, class Derived2, typename Scalar> struct quat_product
488 {
490  return Quaternion<Scalar>
491  (
492  a.w() * b.w() - a.x() * b.x() - a.y() * b.y() - a.z() * b.z(),
493  a.w() * b.x() + a.x() * b.w() + a.y() * b.z() - a.z() * b.y(),
494  a.w() * b.y() + a.y() * b.w() + a.z() * b.x() - a.x() * b.z(),
495  a.w() * b.z() + a.z() * b.w() + a.x() * b.y() - a.y() * b.x()
496  );
497  }
498 };
499 }
500 
502 template <class Derived>
503 template <class OtherDerived>
506 {
508  YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
509  return internal::quat_product<Architecture::Target, Derived, OtherDerived,
510  typename internal::traits<Derived>::Scalar>::run(*this, other);
511 }
512 
514 template <class Derived>
515 template <class OtherDerived>
517 {
518  derived() = derived() * other.derived();
519  return derived();
520 }
521 
529 template <class Derived>
532 {
533  // Note that this algorithm comes from the optimization by hand
534  // of the conversion to a Matrix followed by a Matrix/Vector product.
535  // It appears to be much faster than the common algorithm found
536  // in the literature (30 versus 39 flops). It also requires two
537  // Vector3 as temporaries.
538  Vector3 uv = this->vec().cross(v);
539  uv += uv;
540  return v + this->w() * uv + this->vec().cross(uv);
541 }
542 
543 template<class Derived>
545 {
546  coeffs() = other.coeffs();
547  return derived();
548 }
549 
550 template<class Derived>
551 template<class OtherDerived>
553 {
554  coeffs() = other.coeffs();
555  return derived();
556 }
557 
560 template<class Derived>
562 {
565  Scalar ha = Scalar(0.5)*aa.angle(); // Scalar(0.5) to suppress precision loss warnings
566  this->w() = cos(ha);
567  this->vec() = sin(ha) * aa.axis();
568  return derived();
569 }
570 
577 template<class Derived>
578 template<class MatrixDerived>
580 {
582  YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY)
584  return derived();
585 }
586 
590 template<class Derived>
593 {
594  // NOTE if inlined, then gcc 4.2 and 4.4 get rid of the temporary (not gcc 4.3 !!)
595  // if not inlined then the cost of the return by value is huge ~ +35%,
596  // however, not inlining this function is an order of magnitude slower, so
597  // it has to be inlined, and so the return by value is not an issue
598  Matrix3 res;
599 
600  const Scalar tx = Scalar(2)*this->x();
601  const Scalar ty = Scalar(2)*this->y();
602  const Scalar tz = Scalar(2)*this->z();
603  const Scalar twx = tx*this->w();
604  const Scalar twy = ty*this->w();
605  const Scalar twz = tz*this->w();
606  const Scalar txx = tx*this->x();
607  const Scalar txy = ty*this->x();
608  const Scalar txz = tz*this->x();
609  const Scalar tyy = ty*this->y();
610  const Scalar tyz = tz*this->y();
611  const Scalar tzz = tz*this->z();
612 
613  res.coeffRef(0,0) = Scalar(1)-(tyy+tzz);
614  res.coeffRef(0,1) = txy-twz;
615  res.coeffRef(0,2) = txz+twy;
616  res.coeffRef(1,0) = txy+twz;
617  res.coeffRef(1,1) = Scalar(1)-(txx+tzz);
618  res.coeffRef(1,2) = tyz-twx;
619  res.coeffRef(2,0) = txz-twy;
620  res.coeffRef(2,1) = tyz+twx;
621  res.coeffRef(2,2) = Scalar(1)-(txx+tyy);
622 
623  return res;
624 }
625 
636 template<class Derived>
637 template<typename Derived1, typename Derived2>
639 {
641  Vector3 v0 = a.normalized();
642  Vector3 v1 = b.normalized();
643  Scalar c = v1.dot(v0);
644 
645  // if dot == -1, vectors are nearly opposites
646  // => accurately compute the rotation axis by computing the
647  // intersection of the two planes. This is done by solving:
648  // x^T v0 = 0
649  // x^T v1 = 0
650  // under the constraint:
651  // ||x|| = 1
652  // which yields a singular value problem
654  {
655  c = numext::maxi(c,Scalar(-1));
656  Matrix<Scalar,2,3> m; m << v0.transpose(), v1.transpose();
658  Vector3 axis = svd.matrixV().col(2);
659 
660  Scalar w2 = (Scalar(1)+c)*Scalar(0.5);
661  this->w() = sqrt(w2);
662  this->vec() = axis * sqrt(Scalar(1) - w2);
663  return derived();
664  }
665  Vector3 axis = v0.cross(v1);
666  Scalar s = sqrt((Scalar(1)+c)*Scalar(2));
667  Scalar invs = Scalar(1)/s;
668  this->vec() = axis * invs;
669  this->w() = s * Scalar(0.5);
670 
671  return derived();
672 }
673 
678 template<typename Scalar, int Options>
680 {
684  const Scalar u1 = internal::random<Scalar>(0, 1),
685  u2 = internal::random<Scalar>(0, 2*EIGEN_PI),
686  u3 = internal::random<Scalar>(0, 2*EIGEN_PI);
687  const Scalar a = sqrt(Scalar(1) - u1),
688  b = sqrt(u1);
689  return Quaternion (a * sin(u2), a * cos(u2), b * sin(u3), b * cos(u3));
690 }
691 
692 
703 template<typename Scalar, int Options>
704 template<typename Derived1, typename Derived2>
706 {
707  Quaternion quat;
708  quat.setFromTwoVectors(a, b);
709  return quat;
710 }
711 
712 
719 template <class Derived>
721 {
722  // FIXME should this function be called multiplicativeInverse and conjugate() be called inverse() or opposite() ??
723  Scalar n2 = this->squaredNorm();
724  if (n2 > Scalar(0))
725  return Quaternion<Scalar>(conjugate().coeffs() / n2);
726  else
727  {
728  // return an invalid result to flag the error
729  return Quaternion<Scalar>(Coefficients::Zero());
730  }
731 }
732 
733 // Generic conjugate of a Quaternion
734 namespace internal {
735 template<int Arch, class Derived, typename Scalar> struct quat_conj
736 {
738  return Quaternion<Scalar>(q.w(),-q.x(),-q.y(),-q.z());
739  }
740 };
741 }
742 
749 template <class Derived>
752 {
755 
756 }
757 
761 template <class Derived>
762 template <class OtherDerived>
765 {
767  Quaternion<Scalar> d = (*this) * other.conjugate();
768  return Scalar(2) * atan2( d.vec().norm(), numext::abs(d.w()) );
769 }
770 
771 
772 
779 template <class Derived>
780 template <class OtherDerived>
783 {
786  const Scalar one = Scalar(1) - NumTraits<Scalar>::epsilon();
787  Scalar d = this->dot(other);
788  Scalar absD = numext::abs(d);
789 
790  Scalar scale0;
791  Scalar scale1;
792 
793  if(absD>=one)
794  {
795  scale0 = Scalar(1) - t;
796  scale1 = t;
797  }
798  else
799  {
800  // theta is the angle between the 2 quaternions
801  Scalar theta = acos(absD);
802  Scalar sinTheta = sin(theta);
803 
804  scale0 = sin( ( Scalar(1) - t ) * theta) / sinTheta;
805  scale1 = sin( ( t * theta) ) / sinTheta;
806  }
807  if(d<Scalar(0)) scale1 = -scale1;
808 
809  return Quaternion<Scalar>(scale0 * coeffs() + scale1 * other.coeffs());
810 }
811 
812 namespace internal {
813 
814 // set from a rotation matrix
815 template<typename Other>
816 struct quaternionbase_assign_impl<Other,3,3>
817 {
818  typedef typename Other::Scalar Scalar;
819  template<class Derived> EIGEN_DEVICE_FUNC static inline void run(QuaternionBase<Derived>& q, const Other& a_mat)
820  {
821  const typename internal::nested_eval<Other,2>::type mat(a_mat);
823  // This algorithm comes from "Quaternion Calculus and Fast Animation",
824  // Ken Shoemake, 1987 SIGGRAPH course notes
825  Scalar t = mat.trace();
826  if (t > Scalar(0))
827  {
828  t = sqrt(t + Scalar(1.0));
829  q.w() = Scalar(0.5)*t;
830  t = Scalar(0.5)/t;
831  q.x() = (mat.coeff(2,1) - mat.coeff(1,2)) * t;
832  q.y() = (mat.coeff(0,2) - mat.coeff(2,0)) * t;
833  q.z() = (mat.coeff(1,0) - mat.coeff(0,1)) * t;
834  }
835  else
836  {
837  Index i = 0;
838  if (mat.coeff(1,1) > mat.coeff(0,0))
839  i = 1;
840  if (mat.coeff(2,2) > mat.coeff(i,i))
841  i = 2;
842  Index j = (i+1)%3;
843  Index k = (j+1)%3;
844 
845  t = sqrt(mat.coeff(i,i)-mat.coeff(j,j)-mat.coeff(k,k) + Scalar(1.0));
846  q.coeffs().coeffRef(i) = Scalar(0.5) * t;
847  t = Scalar(0.5)/t;
848  q.w() = (mat.coeff(k,j)-mat.coeff(j,k))*t;
849  q.coeffs().coeffRef(j) = (mat.coeff(j,i)+mat.coeff(i,j))*t;
850  q.coeffs().coeffRef(k) = (mat.coeff(k,i)+mat.coeff(i,k))*t;
851  }
852  }
853 };
854 
855 // set from a vector of coefficients assumed to be a quaternion
856 template<typename Other>
857 struct quaternionbase_assign_impl<Other,4,1>
858 {
859  typedef typename Other::Scalar Scalar;
860  template<class Derived> EIGEN_DEVICE_FUNC static inline void run(QuaternionBase<Derived>& q, const Other& vec)
861  {
862  q.coeffs() = vec;
863  }
864 };
865 
866 } // end namespace internal
867 
868 } // end namespace Eigen
869 
870 #endif // EIGEN_QUATERNION_H
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Map(const Scalar *coeffs)
Matrix3f m
EIGEN_DEVICE_FUNC Coefficients & coeffs()
internal::traits< Derived >::Coefficients Coefficients
SCALAR Scalar
Definition: bench_gemm.cpp:46
cout<< "Here is the matrix m:"<< endl<< m<< endl;JacobiSVD< MatrixXf > svd(m, ComputeThinU|ComputeThinV)
#define EIGEN_STRONG_INLINE
Definition: Macros.h:917
EIGEN_DEVICE_FUNC CoeffReturnType x() const
Jet< T, N > cos(const Jet< T, N > &f)
Definition: jet.h:426
Scalar * b
Definition: benchVecAdd.cpp:17
Vector v1
#define EIGEN_PI
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion(const QuaternionBase< Derived > &other)
EIGEN_DEVICE_FUNC const VectorBlock< const Coefficients, 3 > vec() const
A matrix or vector expression mapping an existing array of data.
Definition: Map.h:94
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Derived & operator*=(const QuaternionBase< OtherDerived > &q)
EIGEN_DEVICE_FUNC bool operator!=(const QuaternionBase< OtherDerived > &other) const
EIGEN_DEVICE_FUNC const PlainObject normalized() const
Definition: Dot.h:124
const unsigned int LvalueBit
Definition: Constants.h:144
EIGEN_DEVICE_FUNC CoeffReturnType z() const
EIGEN_DEVICE_FUNC bool operator==(const QuaternionBase< OtherDerived > &other) const
Scalar Scalar * c
Definition: benchVecAdd.cpp:17
Jet< T, N > acos(const Jet< T, N > &f)
Definition: jet.h:432
Jet< T, N > sin(const Jet< T, N > &f)
Definition: jet.h:439
Namespace containing all symbols from the Eigen library.
Definition: jet.h:637
EIGEN_DEVICE_FUNC Quaternion(const Scalar &w, const Scalar &x, const Scalar &y, const Scalar &z)
EIGEN_DEVICE_FUNC CoeffReturnType w() const
Holds information about the various numeric (i.e. scalar) types allowed by Eigen. ...
Definition: NumTraits.h:232
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion< Scalar > run(const QuaternionBase< Derived > &q)
#define EIGEN_STATIC_ASSERT(CONDITION, MSG)
Definition: StaticAssert.h:127
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE T maxi(const T &x, const T &y)
Vector u2
#define EIGEN_DEFAULT_COPY_CONSTRUCTOR(CLASS)
Definition: Macros.h:1221
EIGEN_DEVICE_FUNC const InverseReturnType inverse() const
static double epsilon
Definition: testRot3.cpp:37
#define EIGEN_NOEXCEPT_IF(x)
Definition: Macros.h:1419
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Scalar & coeffRef(Index rowId, Index colId)
EIGEN_DEVICE_FUNC internal::enable_if< internal::is_same< Scalar, NewScalarType >::value, const Derived & >::type cast() const
EIGEN_DEVICE_FUNC Quaternion(const MatrixBase< Derived > &other)
static EIGEN_DEVICE_FUNC void run(QuaternionBase< Derived > &q, const Other &vec)
EIGEN_DEVICE_FUNC Derived & setFromTwoVectors(const MatrixBase< Derived1 > &a, const MatrixBase< Derived2 > &b)
EIGEN_DEVICE_FUNC internal::enable_if<!internal::is_same< Scalar, NewScalarType >::value, Quaternion< NewScalarType > >::type cast() const
static EIGEN_STRONG_INLINE void _check_template_params()
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
#define EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF(NeedsToAlign)
Definition: Memory.h:838
Expression of a fixed-size or dynamic-size sub-vector.
static EIGEN_DEVICE_FUNC Quaternion< Scalar > Identity()
EIGEN_DEVICE_FUNC EIGEN_ALWAYS_INLINE internal::enable_if< NumTraits< T >::IsSigned||NumTraits< T >::IsComplex, typename NumTraits< T >::Real >::type abs(const T &x)
Scalar EIGEN_BLAS_FUNC() dot(int *n, RealScalar *px, int *incx, RealScalar *py, int *incy)
EIGEN_DEVICE_FUNC VectorBlock< Coefficients, 3 > vec()
traits< Quaternion< _Scalar,(int(_Options)&Aligned)==Aligned ? AutoAlign :DontAlign > > TraitsBase
EIGEN_DEVICE_FUNC bool isApprox(const QuaternionBase< OtherDerived > &other, const RealScalar &prec=NumTraits< Scalar >::dummy_precision()) const
EIGEN_DEVICE_FUNC internal::traits< Derived >::Coefficients & coeffs()
static EIGEN_DEVICE_FUNC Matrix< Scalar, 2, 2 > toRotationMatrix(const Scalar &s)
Definition: RotationBase.h:182
EIGEN_DEVICE_FUNC Quaternion< Scalar > conjugate() const
EIGEN_DEVICE_FUNC const Derived & derived() const
Definition: RotationBase.h:41
EIGEN_DEVICE_FUNC Scalar angle() const
Definition: AngleAxis.h:91
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion< Scalar > operator*(const QuaternionBase< OtherDerived > &q) const
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
static EIGEN_DEVICE_FUNC Quaternion FromTwoVectors(const MatrixBase< Derived1 > &a, const MatrixBase< Derived2 > &b)
EIGEN_DEVICE_FUNC Quaternion(const Scalar *data)
Array< int, Dynamic, 1 > v
EIGEN_DEVICE_FUNC NewType cast(const OldType &x)
int data[]
EIGEN_DEVICE_FUNC NonConstCoeffReturnType x()
EIGEN_DEVICE_FUNC Quaternion< Scalar > inverse() const
Common base class for compact rotation representations.
RealScalar s
EIGEN_DEVICE_FUNC const internal::traits< Derived >::Coefficients & coeffs() const
EIGEN_DEVICE_FUNC const Scalar & q
#define EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Derived)
Definition: Macros.h:1231
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Map(Scalar *coeffs)
EIGEN_DEVICE_FUNC Quaternion(const Quaternion< OtherScalar, OtherOptions > &other)
EIGEN_DEVICE_FUNC ConjugateReturnType conjugate() const
EIGEN_DEVICE_FUNC CoeffReturnType y() const
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorUInt128< uint64_t, uint64_t > operator*(const TensorUInt128< HL, LL > &lhs, const TensorUInt128< HR, LR > &rhs)
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Vector3 _transformVector(const Vector3 &v) const
Base class for quaternion expressions.
RowVector3d w
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE QuaternionBase< Derived > & operator=(const QuaternionBase< Derived > &other)
EIGEN_DEVICE_FUNC Quaternion(const AngleAxisType &aa)
EIGEN_DEVICE_FUNC NonConstCoeffReturnType y()
EIGEN_DEVICE_FUNC QuaternionBase & setIdentity()
EIGEN_DEVICE_FUNC const Vector3 & axis() const
Definition: AngleAxis.h:96
EIGEN_DEVICE_FUNC NonConstCoeffReturnType w()
QuaternionBase< Map< const Quaternion< _Scalar >, _Options > > Base
#define EIGEN_DEVICE_FUNC
Definition: Macros.h:976
Map< Quaternion< float >, 0 > QuaternionMapf
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC bfloat16 & operator*=(bfloat16 &a, const bfloat16 &b)
Definition: BFloat16.h:188
EIGEN_DEVICE_FUNC const Coefficients & coeffs() const
EIGEN_DEVICE_FUNC NonConstCoeffReturnType z()
The quaternion class used to represent 3D orientations and rotations.
#define EIGEN_USING_STD(FUNC)
Definition: Macros.h:1185
static const double v0
#define EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(Derived)
Definition: Macros.h:1247
EIGEN_DEVICE_FUNC Scalar dot(const QuaternionBase< OtherDerived > &other) const
Map< Quaternion< double >, 0 > QuaternionMapd
Two-sided Jacobi SVD decomposition of a rectangular matrix.
Map< Quaternion< float >, Aligned > QuaternionMapAlignedf
const AutoDiffScalar< Matrix< typename internal::traits< typename internal::remove_all< DerTypeA >::type >::Scalar, Dynamic, 1 > > atan2(const AutoDiffScalar< DerTypeA > &a, const AutoDiffScalar< DerTypeB > &b)
internal::traits< Quaternion >::Coefficients Coefficients
EIGEN_DEVICE_FUNC Scalar squaredNorm() const
EIGEN_DEVICE_FUNC Scalar angularDistance(const QuaternionBase< OtherDerived > &other) const
Jet< T, N > sqrt(const Jet< T, N > &f)
Definition: jet.h:418
EIGEN_DEVICE_FUNC Matrix3 toRotationMatrix() const
Generic expression where a coefficient-wise unary operator is applied to an expression.
Definition: CwiseUnaryOp.h:55
static EIGEN_DEVICE_FUNC Quaternion UnitRandom()
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
internal::traits< Derived >::Scalar Scalar
Base class for all dense matrices, vectors, and expressions.
Definition: MatrixBase.h:48
Represents a 3D rotation as a rotation angle around an arbitrary 3D axis.
std::ptrdiff_t j
static EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE Quaternion< Scalar > run(const QuaternionBase< Derived1 > &a, const QuaternionBase< Derived2 > &b)
Point2 t(10, 10)
QuaternionBase< Quaternion< _Scalar, _Options > > Base
Map< Quaternion< double >, Aligned > QuaternionMapAlignedd
Definition: pytypes.h:1370
EIGEN_DEVICE_FUNC Quaternion< Scalar > slerp(const Scalar &t, const QuaternionBase< OtherDerived > &other) const
EIGEN_DEVICE_FUNC Quaternion< Scalar > normalized() const
Eigen::Quaternion< double, Eigen::DontAlign > Quaternion
QuaternionBase< Map< Quaternion< _Scalar >, _Options > > Base
static EIGEN_DEVICE_FUNC void run(QuaternionBase< Derived > &q, const Other &a_mat)


gtsam
Author(s):
autogenerated on Tue Jul 4 2023 02:35:29