11#ifndef EIGEN_EULERSYSTEM_H
12#define EIGEN_EULERSYSTEM_H
15#include "./InternalHeaderCheck.h"
19template <
typename Scalar_,
class _System>
24template <
int Num,
bool IsPositive = (Num > 0)>
25struct Abs : std::integral_constant<int, Num> {};
28struct Abs<Num, false> : std::integral_constant<int, -Num> {};
31struct IsValidAxis : bool_constant<Axis != 0 && Abs<Axis>::value <= 3> {};
33template <typename System, typename Other, int OtherRows = Other::RowsAtCompileTime,
34 int OtherCols = Other::ColsAtCompileTime>
35struct eulerangles_assign_impl;
38#define EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(COND, MSG) typedef char static_assertion_##MSG[(COND) ? 1 : -1]
115template <int _AlphaAxis, int _BetaAxis, int _GammaAxis>
121 static constexpr int AlphaAxis = _AlphaAxis;
124 static constexpr int BetaAxis = _BetaAxis;
127 static constexpr int GammaAxis = _GammaAxis;
130 AlphaAxisAbs = internal::Abs<AlphaAxis>::value,
131 BetaAxisAbs = internal::Abs<BetaAxis>::value,
132 GammaAxisAbs = internal::Abs<GammaAxis>::value,
134 IsAlphaOpposite = (AlphaAxis < 0) ? 1 : 0,
135 IsBetaOpposite = (BetaAxis < 0) ? 1 : 0,
136 IsGammaOpposite = (GammaAxis < 0) ? 1 : 0,
140 IsOdd = (AlphaAxisAbs % 3 == (BetaAxisAbs - 1) % 3) ? 0 : 1,
141 IsEven = IsOdd ? 0 : 1,
144 ((unsigned)AlphaAxisAbs != (unsigned)GammaAxisAbs) ? 1 : 0
148 EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(internal::IsValidAxis<AlphaAxis>::value, ALPHA_AXIS_IS_INVALID);
150 EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(internal::IsValidAxis<BetaAxis>::value, BETA_AXIS_IS_INVALID);
152 EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT(internal::IsValidAxis<GammaAxis>::value, GAMMA_AXIS_IS_INVALID);
154 EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT((unsigned)AlphaAxisAbs != (unsigned)BetaAxisAbs,
155 ALPHA_AXIS_CANT_BE_EQUAL_TO_BETA_AXIS);
157 EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT((unsigned)BetaAxisAbs != (unsigned)GammaAxisAbs,
158 BETA_AXIS_CANT_BE_EQUAL_TO_GAMMA_AXIS);
160 template <typename Scalar>
161 static void CalcEulerAngles(EulerAngles<Scalar, EulerSystem>& res,
162 const typename EulerAngles<Scalar, EulerSystem>::Matrix3& mat) {
163 res.angles() = mat.canonicalEulerAngles(AlphaAxisAbs - 1, BetaAxisAbs - 1, GammaAxisAbs - 1);
165 EIGEN_IF_CONSTEXPR (IsAlphaOpposite) res.alpha() = -res.alpha();
167 EIGEN_IF_CONSTEXPR (IsBetaOpposite) res.beta() = -res.beta();
169 EIGEN_IF_CONSTEXPR (IsGammaOpposite) res.gamma() = -res.gamma();
172 template <typename Scalar_, class _System>
173 friend class Eigen::EulerAngles;
175 template <typename System, typename Other, int OtherRows, int OtherCols>
176 friend struct internal::eulerangles_assign_impl;
179#define EIGEN_EULER_SYSTEM_TYPEDEF(A, B, C) typedef EulerSystem<EULER_##A, EULER_##B, EULER_##C> EulerSystem##A##B##C;
184EIGEN_EULER_SYSTEM_TYPEDEF(X, Y, Z)
185EIGEN_EULER_SYSTEM_TYPEDEF(X, Y, X)
186EIGEN_EULER_SYSTEM_TYPEDEF(X, Z, Y)
187EIGEN_EULER_SYSTEM_TYPEDEF(X, Z, X)
189EIGEN_EULER_SYSTEM_TYPEDEF(Y, Z, X)
190EIGEN_EULER_SYSTEM_TYPEDEF(Y, Z, Y)
191EIGEN_EULER_SYSTEM_TYPEDEF(Y, X, Z)
192EIGEN_EULER_SYSTEM_TYPEDEF(Y, X, Y)
194EIGEN_EULER_SYSTEM_TYPEDEF(Z, X, Y)
195EIGEN_EULER_SYSTEM_TYPEDEF(Z, X, Z)
196EIGEN_EULER_SYSTEM_TYPEDEF(Z, Y, X)
197EIGEN_EULER_SYSTEM_TYPEDEF(Z, Y, Z)
200#undef EIGEN_EULER_ANGLES_CLASS_STATIC_ASSERT
201#undef EIGEN_EULER_SYSTEM_TYPEDEF
Represents a rotation in a 3 dimensional space as three Euler angles.
Definition EulerAngles.h:104
Namespace containing all symbols from the Eigen library.