Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis > Class Template Reference

Represents a fixed Euler rotation system. More...

#include <EulerSystem.h>

Public Types

enum  {
  AlphaAxisAbs = internal::Abs<AlphaAxis>::value , BetaAxisAbs = internal::Abs<BetaAxis>::value , GammaAxisAbs = internal::Abs<GammaAxis>::value , IsAlphaOpposite = (AlphaAxis < 0) ? 1 : 0 ,
  IsBetaOpposite = (BetaAxis < 0) ? 1 : 0 , IsGammaOpposite = (GammaAxis < 0) ? 1 : 0 , IsOdd = ((AlphaAxisAbs) % 3 == (BetaAxisAbs - 1) % 3) ? 0 : 1 , IsEven = IsOdd ? 0 : 1 ,
  IsTaitBryan
}
 

Static Public Attributes

static constexpr int AlphaAxis = _AlphaAxis
 
static constexpr int BetaAxis = _BetaAxis
 
static constexpr int GammaAxis = _GammaAxis
 

Private Member Functions

 EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT (internal::IsValidAxis< AlphaAxis >::value, ALPHA_AXIS_IS_INVALID)
 
 EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT (internal::IsValidAxis< BetaAxis >::value, BETA_AXIS_IS_INVALID)
 
 EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT (internal::IsValidAxis< GammaAxis >::value, GAMMA_AXIS_IS_INVALID)
 
 EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT ((unsigned) AlphaAxisAbs !=(unsigned) BetaAxisAbs, ALPHA_AXIS_CANT_BE_EQUAL_TO_BETA_AXIS)
 
 EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT ((unsigned) BetaAxisAbs !=(unsigned) GammaAxisAbs, BETA_AXIS_CANT_BE_EQUAL_TO_GAMMA_AXIS)
 

Static Private Member Functions

template<typename Derived >
static void CalcEulerAngles_imp (Matrix< typename MatrixBase< Derived >::Scalar, 3, 1 > &res, const MatrixBase< Derived > &mat, internal::true_type)
 
template<typename Derived >
static void CalcEulerAngles_imp (Matrix< typename MatrixBase< Derived >::Scalar, 3, 1 > &res, const MatrixBase< Derived > &mat, internal::false_type)
 
template<typename Scalar >
static void CalcEulerAngles (EulerAngles< Scalar, EulerSystem > &res, const typename EulerAngles< Scalar, EulerSystem >::Matrix3 &mat)
 

Static Private Attributes

static const int I_ = AlphaAxisAbs - 1
 
static const int J_ = (AlphaAxisAbs - 1 + 1 + IsOdd) % 3
 
static const int K_ = (AlphaAxisAbs - 1 + 2 - IsOdd) % 3
 

Friends

template<typename Scalar_ , class _System >
class Eigen::EulerAngles
 
template<typename System , typename Other , int OtherRows, int OtherCols>
struct internal::eulerangles_assign_impl
 

Detailed Description

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
class Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >

Represents a fixed Euler rotation system.

This meta-class goal is to represent the Euler system in compilation time, for EulerAngles.

You can use this class to get two things:

  • Build an Euler system, and then pass it as a template parameter to EulerAngles.
  • Query some compile time data about an Euler system. (e.g. Whether it's Tait-Bryan)

Euler rotation is a set of three rotation on fixed axes. (see EulerAngles) This meta-class store constantly those signed axes. (see EulerAxis)

Types of Euler systems

All and only valid 3 dimension Euler rotation over standard signed axes{+X,+Y,+Z,-X,-Y,-Z} are supported:

  • all axes X, Y, Z in each valid order (see below what order is valid)
  • rotation over the axis is supported both over the positive and negative directions.
  • both Tait-Bryan and proper/classic Euler angles (i.e. the opposite).

Since EulerSystem support both positive and negative directions, you may call this rotation distinction in other names:

  • right handed or left handed
  • counterclockwise or clockwise

Notice all axed combination are valid, and would trigger a static assertion. Same unsigned axes can't be neighbors, e.g. {X,X,Y} is invalid. This yield two and only two classes:

  • Tait-Bryan - all unsigned axes are distinct, e.g. {X,Y,Z}
  • proper/classic Euler angles - The first and the third unsigned axes is equal, and the second is different, e.g. {X,Y,X}

Intrinsic vs extrinsic Euler systems

Only intrinsic Euler systems are supported for simplicity. If you want to use extrinsic Euler systems, just use the equal intrinsic opposite order for axes and angles. I.e axes (A,B,C) becomes (C,B,A), and angles (a,b,c) becomes (c,b,a).

Convenient user typedefs

Convenient typedefs for EulerSystem exist (only for positive axes Euler systems), in a form of EulerSystem{A}{B}{C}, e.g. EulerSystemXYZ.

Additional reading

More information about Euler angles: https://en.wikipedia.org/wiki/Euler_angles

Template Parameters
_AlphaAxisthe first fixed EulerAxis
_BetaAxisthe second fixed EulerAxis
_GammaAxisthe third fixed EulerAxis

Member Enumeration Documentation

◆ anonymous enum

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
anonymous enum
Enumerator
AlphaAxisAbs 

the first rotation axis unsigned

BetaAxisAbs 

the second rotation axis unsigned

GammaAxisAbs 

the third rotation axis unsigned

IsAlphaOpposite 

whether alpha axis is negative

IsBetaOpposite 

whether beta axis is negative

IsGammaOpposite 

whether gamma axis is negative

IsOdd 

whether the Euler system is odd

IsEven 

whether the Euler system is even

IsTaitBryan 

whether the Euler system is Tait-Bryan

135  {
140  IsAlphaOpposite = (AlphaAxis < 0) ? 1 : 0,
141  IsBetaOpposite = (BetaAxis < 0) ? 1 : 0,
142  IsGammaOpposite = (GammaAxis < 0) ? 1 : 0,
144  // Parity is even if alpha axis X is followed by beta axis Y, or Y is followed
145  // by Z, or Z is followed by X; otherwise it is odd.
146  IsOdd = ((AlphaAxisAbs) % 3 == (BetaAxisAbs - 1) % 3) ? 0 : 1,
147  IsEven = IsOdd ? 0 : 1,
149  IsTaitBryan =
150  ((unsigned)AlphaAxisAbs != (unsigned)GammaAxisAbs) ? 1 : 0
151  };
static constexpr int AlphaAxis
Definition: EulerSystem.h:127
static constexpr int GammaAxis
Definition: EulerSystem.h:133
@ GammaAxisAbs
Definition: EulerSystem.h:138
@ IsOdd
Definition: EulerSystem.h:146
@ IsGammaOpposite
Definition: EulerSystem.h:142
@ IsAlphaOpposite
Definition: EulerSystem.h:140
@ IsEven
Definition: EulerSystem.h:147
@ AlphaAxisAbs
Definition: EulerSystem.h:136
@ BetaAxisAbs
Definition: EulerSystem.h:137
@ IsTaitBryan
Definition: EulerSystem.h:149
@ IsBetaOpposite
Definition: EulerSystem.h:141
static constexpr int BetaAxis
Definition: EulerSystem.h:130
@ value
Definition: EulerSystem.h:25

Member Function Documentation

◆ CalcEulerAngles()

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
template<typename Scalar >
static void Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::CalcEulerAngles ( EulerAngles< Scalar, EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis > > &  res,
const typename EulerAngles< Scalar, EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis > >::Matrix3 &  mat 
)
inlinestaticprivate
245  {
246  CalcEulerAngles_imp(res.angles(), mat,
247  std::conditional_t<IsTaitBryan, internal::true_type, internal::false_type>());
248 
249  if (IsAlphaOpposite) res.alpha() = -res.alpha();
250 
251  if (IsBetaOpposite) res.beta() = -res.beta();
252 
253  if (IsGammaOpposite) res.gamma() = -res.gamma();
254  }
cout<< "Here is the matrix m:"<< endl<< m<< endl;Matrix< ptrdiff_t, 3, 1 > res
Definition: PartialRedux_count.cpp:3
static void CalcEulerAngles_imp(Matrix< typename MatrixBase< Derived >::Scalar, 3, 1 > &res, const MatrixBase< Derived > &mat, internal::true_type)
Definition: EulerSystem.h:175

References Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::CalcEulerAngles_imp(), Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::IsAlphaOpposite, Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::IsBetaOpposite, Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::IsGammaOpposite, and res.

◆ CalcEulerAngles_imp() [1/2]

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
template<typename Derived >
static void Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::CalcEulerAngles_imp ( Matrix< typename MatrixBase< Derived >::Scalar, 3, 1 > &  res,
const MatrixBase< Derived > &  mat,
internal::false_type   
)
inlinestaticprivate
211  {
212  using std::atan2;
213  using std::sqrt;
214 
215  typedef typename Derived::Scalar Scalar;
216 
217  const Scalar plusMinus = IsEven ? 1 : -1;
218  const Scalar minusPlus = IsOdd ? 1 : -1;
219 
220  const Scalar Rsum = sqrt((mat(I_, J_) * mat(I_, J_) + mat(I_, K_) * mat(I_, K_) + mat(J_, I_) * mat(J_, I_) +
221  mat(K_, I_) * mat(K_, I_)) /
222  2);
223 
224  res[1] = atan2(Rsum, mat(I_, I_));
225 
226  // There is a singularity when sin(beta) == 0
227  if (Rsum > 4 * NumTraits<Scalar>::epsilon()) { // sin(beta) != 0
228  res[0] = atan2(mat(J_, I_), minusPlus * mat(K_, I_));
229  res[2] = atan2(mat(I_, J_), plusMinus * mat(I_, K_));
230  } else if (mat(I_, I_) > 0) { // sin(beta) == 0 and cos(beta) == 1
231  Scalar spos = plusMinus * mat(K_, J_) + minusPlus * mat(J_, K_); // 2*sin(alpha + gamma)
232  Scalar cpos = mat(J_, J_) + mat(K_, K_); // 2*cos(alpha + gamma)
233  res[0] = atan2(spos, cpos);
234  res[2] = 0;
235  } else { // sin(beta) == 0 and cos(beta) == -1
236  Scalar sneg = plusMinus * mat(K_, J_) + plusMinus * mat(J_, K_); // 2*sin(alpha - gamma)
237  Scalar cneg = mat(J_, J_) - mat(K_, K_); // 2*cos(alpha - gamma)
238  res[0] = atan2(sneg, cneg);
239  res[2] = 0;
240  }
241  }
AnnoyingScalar atan2(const AnnoyingScalar &y, const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:139
AnnoyingScalar sqrt(const AnnoyingScalar &x)
Definition: AnnoyingScalar.h:134
Eigen::SparseMatrix< double > mat
Definition: EigenUnitTest.cpp:10
SCALAR Scalar
Definition: bench_gemm.cpp:45
static const int I_
Definition: EulerSystem.h:170
static const int J_
Definition: EulerSystem.h:171
static const int K_
Definition: EulerSystem.h:171
AutoDiffScalar< Matrix< typename internal::traits< internal::remove_all_t< DerTypeA > >::Scalar, Dynamic, 1 > > atan2(const AutoDiffScalar< DerTypeA > &a, const AutoDiffScalar< DerTypeB > &b)
Definition: AutoDiffScalar.h:558
void plusMinus()
Definition: skew_symmetric_matrix3.cpp:56
double epsilon
Definition: osc_ring_sarah_asymptotics.h:43

References atan2(), Eigen::atan2(), Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::I_, Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::IsEven, Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::IsOdd, Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::J_, Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::K_, anonymous_namespace{skew_symmetric_matrix3.cpp}::plusMinus(), res, and sqrt().

◆ CalcEulerAngles_imp() [2/2]

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
template<typename Derived >
static void Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::CalcEulerAngles_imp ( Matrix< typename MatrixBase< Derived >::Scalar, 3, 1 > &  res,
const MatrixBase< Derived > &  mat,
internal::true_type   
)
inlinestaticprivate
176  {
177  using std::atan2;
178  using std::sqrt;
179 
180  typedef typename Derived::Scalar Scalar;
181 
182  const Scalar plusMinus = IsEven ? 1 : -1;
183  const Scalar minusPlus = IsOdd ? 1 : -1;
184 
185  const Scalar Rsum = sqrt((mat(I_, I_) * mat(I_, I_) + mat(I_, J_) * mat(I_, J_) + mat(J_, K_) * mat(J_, K_) +
186  mat(K_, K_) * mat(K_, K_)) /
187  2);
188  res[1] = atan2(plusMinus * mat(I_, K_), Rsum);
189 
190  // There is a singularity when cos(beta) == 0
191  if (Rsum > 4 * NumTraits<Scalar>::epsilon()) { // cos(beta) != 0
192  res[0] = atan2(minusPlus * mat(J_, K_), mat(K_, K_));
193  res[2] = atan2(minusPlus * mat(I_, J_), mat(I_, I_));
194  } else if (plusMinus * mat(I_, K_) > 0) { // cos(beta) == 0 and sin(beta) == 1
195  Scalar spos = mat(J_, I_) + plusMinus * mat(K_, J_); // 2*sin(alpha + plusMinus * gamma
196  Scalar cpos = mat(J_, J_) + minusPlus * mat(K_, I_); // 2*cos(alpha + plusMinus * gamma)
197  Scalar alphaPlusMinusGamma = atan2(spos, cpos);
198  res[0] = alphaPlusMinusGamma;
199  res[2] = 0;
200  } else { // cos(beta) == 0 and sin(beta) == -1
201  Scalar sneg = plusMinus * (mat(K_, J_) + minusPlus * mat(J_, I_)); // 2*sin(alpha + minusPlus*gamma)
202  Scalar cneg = mat(J_, J_) + plusMinus * mat(K_, I_); // 2*cos(alpha + minusPlus*gamma)
203  Scalar alphaMinusPlusBeta = atan2(sneg, cneg);
204  res[0] = alphaMinusPlusBeta;
205  res[2] = 0;
206  }
207  }

References atan2(), Eigen::atan2(), Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::I_, Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::IsEven, Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::IsOdd, Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::J_, Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::K_, anonymous_namespace{skew_symmetric_matrix3.cpp}::plusMinus(), res, and sqrt().

Referenced by Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::CalcEulerAngles().

◆ EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT() [1/5]

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT ( (unsigned) AlphaAxisAbs = (unsignedBetaAxisAbs,
ALPHA_AXIS_CANT_BE_EQUAL_TO_BETA_AXIS   
)
private

◆ EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT() [2/5]

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT ( (unsigned) BetaAxisAbs = (unsignedGammaAxisAbs,
BETA_AXIS_CANT_BE_EQUAL_TO_GAMMA_AXIS   
)
private

◆ EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT() [3/5]

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT ( internal::IsValidAxis< AlphaAxis >::value  ,
ALPHA_AXIS_IS_INVALID   
)
private

◆ EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT() [4/5]

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT ( internal::IsValidAxis< BetaAxis >::value  ,
BETA_AXIS_IS_INVALID   
)
private

◆ EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT() [5/5]

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT ( internal::IsValidAxis< GammaAxis >::value  ,
GAMMA_AXIS_IS_INVALID   
)
private

Friends And Related Function Documentation

◆ Eigen::EulerAngles

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
template<typename Scalar_ , class _System >
friend class Eigen::EulerAngles
friend

◆ internal::eulerangles_assign_impl

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
template<typename System , typename Other , int OtherRows, int OtherCols>
friend struct internal::eulerangles_assign_impl
friend

Member Data Documentation

◆ AlphaAxis

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
constexpr int Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::AlphaAxis = _AlphaAxis
staticconstexpr

The first rotation axis

◆ BetaAxis

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
constexpr int Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::BetaAxis = _BetaAxis
staticconstexpr

The second rotation axis

◆ GammaAxis

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
constexpr int Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::GammaAxis = _GammaAxis
staticconstexpr

The third rotation axis

◆ I_

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
const int Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::I_ = AlphaAxisAbs - 1
staticprivate

◆ J_

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
const int Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::J_ = (AlphaAxisAbs - 1 + 1 + IsOdd) % 3
staticprivate

◆ K_

template<int _AlphaAxis, int _BetaAxis, int _GammaAxis>
const int Eigen::EulerSystem< _AlphaAxis, _BetaAxis, _GammaAxis >::K_ = (AlphaAxisAbs - 1 + 2 - IsOdd) % 3
staticprivate

The documentation for this class was generated from the following file: