Xmipp  v3.23.11-Nereus
Public Types | Public Member Functions | Static Public Member Functions | Public Attributes | Protected Attributes | List of all members
Euler Class Reference

#include <euler.h>

Collaboration diagram for Euler:
Collaboration graph
[legend]

Public Types

enum  eulerOrder {
  XYZ = 0x0101, XZY = 0x0001, YZX = 0x1101, YXZ = 0x1001,
  ZXY = 0x2101, ZYX = 0x2001, XZX = 0x0011, XYX = 0x0111,
  YXY = 0x1011, YZY = 0x1111, ZYZ = 0x2011, ZXZ = 0x2111,
  XYZr = 0x2000, XZYr = 0x2100, YZXr = 0x1000, YXZr = 0x1100,
  ZXYr = 0x0000, ZYXr = 0x0100, XZXr = 0x2110, XYXr = 0x2010,
  YXYr = 0x1110, YZYr = 0x1010, ZYZr = 0x0110, ZXZr = 0x0010,
  Legal, eulerDefault = ZYZ
}
 
enum  Axis { axisX = 0, axisY = 1, axisZ = 2 }
 
enum  InputLayout { XYZLayout, IJKLayout }
 

Public Member Functions

 Euler ()
 
void init (void)
 
 Euler (const Euler &)
 
 Euler (eulerOrder p)
 
 Euler (const Matrix1D< double > &v, eulerOrder o=eulerDefault, InputLayout l=IJKLayout)
 
 Euler (double i, double j, double k, eulerOrder o=eulerDefault, InputLayout l=IJKLayout)
 
 Euler (const Euler &euler, eulerOrder newp)
 
 Euler (const Matrix2D< double > &, eulerOrder o=eulerDefault)
 
const Euleroperator= (const Euler &)
 
const Euleroperator= (const Matrix1D< double > &)
 
void setXYZVector (const Matrix1D< double > &)
 
eulerOrder order () const
 
void setOrder (eulerOrder)
 
void set (Axis initial, bool relative, bool parityEven, bool firstRepeats)
 
void extract (const Matrix2D< double > &)
 
void toMatrix (Matrix2D< double > &M) const
 
void toXYZVector (Matrix1D< double > &v) const
 
void angleOrder (int &i, int &j, int &k) const
 
void angleMapping (int &i, int &j, int &k) const
 
void makeNear (const Euler &target)
 
bool frameStatic () const
 
bool initialRepeated () const
 
bool parityEven () const
 
Axis initialAxis () const
 
void eulerRotate (Matrix2D< double > &M, const Matrix1D< double > &r)
 

Static Public Member Functions

static bool legal (eulerOrder)
 
static double angleMod (double angle)
 
static void simpleXYZRotation (Matrix1D< double > &xyzRot, const Matrix1D< double > &targetXyzRot)
 
static void nearestRotation (Matrix1D< double > &xyzRot, const Matrix1D< double > &targetXyzRot, eulerOrder order=XYZ)
 

Public Attributes

Matrix1D< double > vec3
 
double x
 
double y
 
double z
 

Protected Attributes

bool _frameStatic: 1
 
bool _initialRepeated: 1
 
bool _parityEven: 1
 
Axis _initialAxis: 2
 

Detailed Description

Routines for computing Euler angles following different approaches

Definition at line 39 of file euler.h.

Member Enumeration Documentation

◆ Axis

Enumerator
axisX 
axisY 
axisZ 

Definition at line 95 of file euler.h.

95 { axisX = 0, axisY = 1, axisZ = 2 };

◆ eulerOrder

Enumerator
XYZ 
XZY 
YZX 
YXZ 
ZXY 
ZYX 
XZX 
XYX 
YXY 
YZY 
ZYZ 
ZXZ 
XYZr 
XZYr 
YZXr 
YXZr 
ZXYr 
ZYXr 
XZXr 
XYXr 
YXYr 
YZYr 
ZYZr 
ZXZr 
Legal 
eulerDefault 

Definition at line 43 of file euler.h.

44  {
45  //
46  // All 24 possible orderings
47  //
48 
49  XYZ = 0x0101, // "usual" orderings
50  XZY = 0x0001,
51  YZX = 0x1101,
52  YXZ = 0x1001,
53  ZXY = 0x2101,
54  ZYX = 0x2001,
55 
56  XZX = 0x0011, // first axis repeated
57  XYX = 0x0111,
58  YXY = 0x1011,
59  YZY = 0x1111,
60  ZYZ = 0x2011,
61  ZXZ = 0x2111,
62 
63  XYZr = 0x2000, // relative orderings -- not common
64  XZYr = 0x2100,
65  YZXr = 0x1000,
66  YXZr = 0x1100,
67  ZXYr = 0x0000,
68  ZYXr = 0x0100,
69 
70  XZXr = 0x2110, // relative first axis repeated
71  XYXr = 0x2010,
72  YXYr = 0x1110,
73  YZYr = 0x1010,
74  ZYZr = 0x0110,
75  ZXZr = 0x0010,
76  // ||||
77  // VVVV
78  //Legend:ABCD
79  // A -> Initial Axis (0==x, 1==y, 2==z)
80  // B -> Parity Even (1==true)
81  // C -> Initial Repeated (1==true)
82  // D -> Frame Static (1==true)
83  //
84 
85  Legal = XYZ | XZY | YZX | YXZ | ZXY | ZYX |
86  XZX | XYX | YXY | YZY | ZYZ | ZXZ |
87  XYZr| XZYr| YZXr| YXZr| ZXYr| ZYXr|
88  XZXr| XYXr| YXYr| YZYr| ZYZr| ZXZr,
89 
90  // Min = 0x0000,
91  // Max = 0x2111,
93  } eulerOrder;
eulerOrder
Definition: euler.h:43

◆ InputLayout

Enumerator
XYZLayout 
IJKLayout 

Definition at line 97 of file euler.h.

Constructor & Destructor Documentation

◆ Euler() [1/7]

Euler::Euler ( )

Definition at line 80 of file euler.cpp.

80  :
81  _frameStatic(true),
82  _initialRepeated(false),
83  _parityEven(true),
85 {
86  init();
87 }
bool _frameStatic
Definition: euler.h:231
Axis _initialAxis
Definition: euler.h:237
void init(void)
Definition: euler.cpp:72
bool _parityEven
Definition: euler.h:235
bool _initialRepeated
Definition: euler.h:233

◆ Euler() [2/7]

Euler::Euler ( const Euler euler)

Definition at line 115 of file euler.cpp.

116 {
117  init();
118  operator=(euler);
119 }
void init(void)
Definition: euler.cpp:72
const Euler & operator=(const Euler &)
Definition: euler.cpp:355

◆ Euler() [3/7]

Euler::Euler ( Euler::eulerOrder  p)

Definition at line 89 of file euler.cpp.

89  :
90  _frameStatic(true),
91  _initialRepeated(false),
92  _parityEven(true),
94 {
95  init();
96  setOrder(p);
97 }
bool _frameStatic
Definition: euler.h:231
Axis _initialAxis
Definition: euler.h:237
void init(void)
Definition: euler.cpp:72
bool _parityEven
Definition: euler.h:235
bool _initialRepeated
Definition: euler.h:233
void setOrder(eulerOrder)
Definition: euler.cpp:335

◆ Euler() [4/7]

Euler::Euler ( const Matrix1D< double > &  v,
Euler::eulerOrder  p = eulerDefault,
Euler::InputLayout  l = IJKLayout 
)

Definition at line 99 of file euler.cpp.

102 {
103  init();
104  setOrder(p);
105  if ( l == XYZLayout )
106  setXYZVector(v);
107  else
108  {
109  x = XX(v);
110  y = YY(v);
111  z = ZZ(v);
112  }
113 }
double z
Definition: euler.h:224
void init(void)
Definition: euler.cpp:72
#define XX(v)
Definition: matrix1d.h:85
void setXYZVector(const Matrix1D< double > &)
Definition: euler.cpp:49
double x
Definition: euler.h:222
#define YY(v)
Definition: matrix1d.h:93
void setOrder(eulerOrder)
Definition: euler.cpp:335
#define ZZ(v)
Definition: matrix1d.h:101
double y
Definition: euler.h:223

◆ Euler() [5/7]

Euler::Euler ( double  i,
double  j,
double  k,
Euler::eulerOrder  p = eulerDefault,
Euler::InputLayout  l = IJKLayout 
)

Definition at line 132 of file euler.cpp.

135 {
136  setOrder(p);
137  if ( l == XYZLayout )
138  {
139  setXYZVector(vectorR3(xi,yi,zi));
140  }
141 
142  else
143  {
144  x = xi;
145  y = yi;
146  z = zi;
147  }
148 }
double z
Definition: euler.h:224
double xi
Matrix1D< double > vectorR3(double x, double y, double z)
Definition: matrix1d.cpp:892
void setXYZVector(const Matrix1D< double > &)
Definition: euler.cpp:49
double x
Definition: euler.h:222
void setOrder(eulerOrder)
Definition: euler.cpp:335
double y
Definition: euler.h:223

◆ Euler() [6/7]

Euler::Euler ( const Euler euler,
eulerOrder  newp 
)

Definition at line 122 of file euler.cpp.

123 {
124  init();
125  setOrder(p);
126  Matrix2D<double> M(3,3);
127  euler.toMatrix(M);
128  extract(M);
129 }
void extract(const Matrix2D< double > &)
Definition: euler.cpp:156
void toMatrix(Matrix2D< double > &M) const
Definition: euler.cpp:250
void init(void)
Definition: euler.cpp:72
void setOrder(eulerOrder)
Definition: euler.cpp:335

◆ Euler() [7/7]

Euler::Euler ( const Matrix2D< double > &  M,
Euler::eulerOrder  p = eulerDefault 
)

Definition at line 150 of file euler.cpp.

151 {
152  setOrder(p);
153  extract(M);
154 }
void extract(const Matrix2D< double > &)
Definition: euler.cpp:156
void setOrder(eulerOrder)
Definition: euler.cpp:335

Member Function Documentation

◆ angleMapping()

void Euler::angleMapping ( int &  i,
int &  j,
int &  k 
) const

Definition at line 36 of file euler.cpp.

37 {
38  int m[3];
39 
40  m[_initialAxis] = 0;
41  m[(_initialAxis+1) % 3] = _parityEven ? 1 : 2;
42  m[(_initialAxis+2) % 3] = _parityEven ? 2 : 1;
43  i = m[0];
44  j = m[1];
45  k = m[2];
46 }
Axis _initialAxis
Definition: euler.h:237
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
bool _parityEven
Definition: euler.h:235
#define j
int m

◆ angleMod()

double Euler::angleMod ( double  angle)
static

Definition at line 396 of file euler.cpp.

397 {
398  angle = fmod(angle, (2. * M_PI));
399 
400  if (angle < -M_PI)
401  angle += 2 * M_PI;
402  if (angle > +M_PI)
403  angle -= 2 * M_PI;
404 
405  return angle;
406 }

◆ angleOrder()

void Euler::angleOrder ( int &  i,
int &  j,
int &  k 
) const

Definition at line 28 of file euler.cpp.

29 {
30  i = _initialAxis;
31  j = _parityEven ? (i+1)%3 : (i > 0 ? i-1 : 2);
32  k = _parityEven ? (i > 0 ? i-1 : 2) : (i+1)%3;
33 }
Axis _initialAxis
Definition: euler.h:237
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
bool _parityEven
Definition: euler.h:235
#define j

◆ eulerRotate()

void Euler::eulerRotate ( Matrix2D< double > &  M,
const Matrix1D< double > &  r 
)

Definition at line 464 of file euler.cpp.

466 {
467  double cos_rz;
468  double sin_rz;
469  double cos_ry;
470  double sin_ry;
471  double cos_rx;
472  double sin_rx;
473  double m00;
474  double m01;
475  double m02;
476  double m10;
477  double m11;
478  double m12;
479  double m20;
480  double m21;
481  double m22;
482 
483  cos_rz = cos (ZZ(r));
484  cos_ry = cos (YY(r));
485  cos_rx = cos (XX(r));
486  sin_rz = sin (ZZ(r));
487  sin_ry = sin (YY(r));
488  sin_rx = sin (XX(r));
489 
490  m00 = cos_rz * cos_ry;
491  m01 = sin_rz * cos_ry;
492  m02 = -sin_ry;
493  m10 = -sin_rz * cos_rx + cos_rz * sin_ry * sin_rx;
494  m11 = cos_rz * cos_rx + sin_rz * sin_ry * sin_rx;
495  m12 = cos_ry * sin_rx;
496  m20 = -sin_rz * -sin_rx + cos_rz * sin_ry * cos_rx;
497  m21 = cos_rz * -sin_rx + sin_rz * sin_ry * cos_rx;
498  m22 = cos_ry * cos_rx;
499 
500 
501  Matrix2D<double> P (M);
502 
503  dMij(M,0,0) = dMij(P,0,0) * m00 + dMij(P,1,0) * m01 + dMij(P,2,0) * m02;
504  dMij(M,0,1) = dMij(P,0,1) * m00 + dMij(P,1,1) * m01 + dMij(P,2,1) * m02;
505  dMij(M,0,2) = dMij(P,0,2) * m00 + dMij(P,1,2) * m01 + dMij(P,2,2) * m02;
506  dMij(M,0,3) = dMij(P,0,3) * m00 + dMij(P,1,3) * m01 + dMij(P,2,3) * m02;
507 
508  dMij(M,1,0) = dMij(P,0,0) * m10 + dMij(P,1,0) * m11 + dMij(P,2,0) * m12;
509  dMij(M,1,1) = dMij(P,0,1) * m10 + dMij(P,1,1) * m11 + dMij(P,2,1) * m12;
510  dMij(M,1,2) = dMij(P,0,2) * m10 + dMij(P,1,2) * m11 + dMij(P,2,2) * m12;
511  dMij(M,1,3) = dMij(P,0,3) * m10 + dMij(P,1,3) * m11 + dMij(P,2,3) * m12;
512 
513  dMij(M,2,0) = dMij(P,0,0) * m20 + dMij(P,1,0) * m21 + dMij(P,2,0) * m22;
514  dMij(M,2,1) = dMij(P,0,1) * m20 + dMij(P,1,1) * m21 + dMij(P,2,1) * m22;
515  dMij(M,2,2) = dMij(P,0,2) * m20 + dMij(P,1,2) * m21 + dMij(P,2,2) * m22;
516  dMij(M,2,3) = dMij(P,0,3) * m20 + dMij(P,1,3) * m21 + dMij(P,2,3) * m22;
517 }
#define XX(v)
Definition: matrix1d.h:85
#define dMij(m, i, j)
Definition: matrix2d.h:139
#define YY(v)
Definition: matrix1d.h:93
#define ZZ(v)
Definition: matrix1d.h:101

◆ extract()

void Euler::extract ( const Matrix2D< double > &  M)

Definition at line 156 of file euler.cpp.

157 {
158  int i;
159  int j;
160  int k;
161  angleOrder(i,j,k);
162  if (_initialRepeated)
163  {
164  // Extract the first angle, x.
165  //
166 
167  //x = Math::atan2(M[j][i], M[k][i]);
168  x = atan2(dMij(M,j,i), dMij(M,k,i));
169 
170  //
171  // Remove the x rotation from M, so that the remaining
172  // rotation, N, is only around two axes, and gimbal lock
173  // cannot occur.
174  //
175 
176  //Vec3<T> r (0, 0, 0);
178  r.initZeros(3);
179  VEC_ELEM(r,i) = (_parityEven? -x: x);
180 
181  Matrix2D<double> N(4,4);
182  N.initIdentity();
183  eulerRotate(N,r);
184  N = N * M;
185 
186  //
187  // Extract the other two angles, y and z, from N.
188  //
189 
190  double sy = sqrt (dMij(N,j,i)*dMij(N,j,i) +
191  dMij(N,k,i)*dMij(N,k,i) );
192  y = atan2 (sy, dMij(N,i,i));
193  z = atan2 (dMij(N,j,k),dMij(N,j,j));
194  }
195  else
196  {
197  //
198  // Extract the first angle, x.
199  //
200  // x = Math<T>::atan2 (M[j][k], M[k][k]);
201  x = atan2 (dMij(M,j,k),dMij(M,k,k));
202  //
203  // Remove the x rotation from M, so that the remaining
204  // rotation, N, is only around two axes, and gimbal lock
205  // cannot occur.
206  //
207 
209  r.initZeros(3);
210  VEC_ELEM(r,i) = (_parityEven? -x: x);
211  //std::cerr << "DEBUG_ROB, r:" << r << std::endl;
212  Matrix2D<double> N(4,4);
213  N.initIdentity();
214  eulerRotate(N,r);
215  //std::cerr << "DEBUG_ROB, N:" << N << std::endl;
216  N = N * M;
217  //std::cerr << "DEBUG_ROB, NN:" << N << std::endl;
218 
219  //
220  // Extract the other two angles, y and z, from N.
221  //
222  // T cy = Math<T>::sqrt (N[i][i]*N[i][i] + N[i][j]*N[i][j]);
223  double cy = sqrt (dMij(N,i,i)*dMij(N,i,i) +
224  dMij(N,i,j)*dMij(N,i,j) );
225  // y = Math<T>::atan2 (-N[i][k], cy);
226  // z = Math<T>::atan2 (-N[j][i], N[j][j]);
227  y = atan2 (-dMij(N,i,k),cy);
228  z = atan2 (-dMij(N,j,i),dMij(N,j,j));
229 
230  }
231 
232  if (!_parityEven)
233  //*this *= -1;
234  {
235  vec3 *= -1;
236  x *=-1;
237  y *=-1;
238  z *=-1;
239  }
240 
241  if (!_frameStatic)
242  {
243  double t = x;
244  x = z;
245  z = t;
246  }
247 
248 }
double z
Definition: euler.h:224
#define VEC_ELEM(v, i)
Definition: matrix1d.h:245
bool _frameStatic
Definition: euler.h:231
void sqrt(Image< double > &op)
void angleOrder(int &i, int &j, int &k) const
Definition: euler.cpp:28
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
bool _parityEven
Definition: euler.h:235
#define dMij(m, i, j)
Definition: matrix2d.h:139
double x
Definition: euler.h:222
void initZeros()
Definition: matrix1d.h:592
#define j
void eulerRotate(Matrix2D< double > &M, const Matrix1D< double > &r)
Definition: euler.cpp:464
Matrix1D< double > vec3
Definition: euler.h:221
bool _initialRepeated
Definition: euler.h:233
double y
Definition: euler.h:223

◆ frameStatic()

bool Euler::frameStatic ( ) const
inline

Definition at line 204 of file euler.h.

205  {
206  return _frameStatic;
207  }
bool _frameStatic
Definition: euler.h:231

◆ init()

void Euler::init ( void  )

Definition at line 72 of file euler.cpp.

73 {
74  x=0.;
75  y=0.;
76  z=0.;
77  vec3.initZeros(3);
78 }
double z
Definition: euler.h:224
double x
Definition: euler.h:222
void initZeros()
Definition: matrix1d.h:592
Matrix1D< double > vec3
Definition: euler.h:221
double y
Definition: euler.h:223

◆ initialAxis()

Axis Euler::initialAxis ( ) const
inline

Definition at line 216 of file euler.h.

217  {
218  return _initialAxis;
219  }
Axis _initialAxis
Definition: euler.h:237

◆ initialRepeated()

bool Euler::initialRepeated ( ) const
inline

Definition at line 208 of file euler.h.

209  {
210  return _initialRepeated;
211  }
bool _initialRepeated
Definition: euler.h:233

◆ legal()

bool Euler::legal ( Euler::eulerOrder  order)
static

Definition at line 315 of file euler.cpp.

316 {
317  return (order & ~Legal) ? false : true;
318 }
eulerOrder order() const
Definition: euler.cpp:320

◆ makeNear()

void Euler::makeNear ( const Euler target)

Definition at line 450 of file euler.cpp.

451 {
452  Matrix1D<double> xyzRot ;
453  toXYZVector(xyzRot);
454  auto targetSameOrder = Euler(target, order());
455  Matrix1D<double> targetXyz;
456  targetSameOrder.toXYZVector(targetXyz);
457 
458  nearestRotation(xyzRot, targetXyz, order());
459 
460  setXYZVector(xyzRot);
461 }
Euler()
Definition: euler.cpp:80
eulerOrder order() const
Definition: euler.cpp:320
void setXYZVector(const Matrix1D< double > &)
Definition: euler.cpp:49
static void nearestRotation(Matrix1D< double > &xyzRot, const Matrix1D< double > &targetXyzRot, eulerOrder order=XYZ)
Definition: euler.cpp:419
void toXYZVector(Matrix1D< double > &v) const
Definition: euler.cpp:61

◆ nearestRotation()

void Euler::nearestRotation ( Matrix1D< double > &  xyzRot,
const Matrix1D< double > &  targetXyzRot,
eulerOrder  order = XYZ 
)
static

Definition at line 419 of file euler.cpp.

422 {
423  int i;
424  int j;
425  int k;
426  Euler e (0,0,0, order);
427  e.angleOrder(i,j,k);
428 
429  simpleXYZRotation(xyzRot, targetXyzRot);
430 
431  Matrix1D<double> otherXyzRot;
432  XX(otherXyzRot) = M_PI+XX(xyzRot);
433  YY(otherXyzRot) = M_PI-YY(xyzRot);
434  ZZ(otherXyzRot) = M_PI+ZZ(xyzRot);
435 
436  simpleXYZRotation(otherXyzRot, targetXyzRot);
437 
438  Matrix1D<double> d = xyzRot - targetXyzRot;
439  Matrix1D<double> od = otherXyzRot - targetXyzRot;
440  double dMag = d.dotProduct(d);
441  double odMag = od.dotProduct(od);
442 
443  if (odMag < dMag)
444  {
445  xyzRot = otherXyzRot;
446  }
447 }
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
doublereal * d
#define XX(v)
Definition: matrix1d.h:85
eulerOrder order() const
Definition: euler.cpp:320
double dotProduct(const Matrix1D< T > &op1) const
Definition: matrix1d.cpp:704
Definition: euler.h:39
#define j
#define YY(v)
Definition: matrix1d.h:93
static void simpleXYZRotation(Matrix1D< double > &xyzRot, const Matrix1D< double > &targetXyzRot)
Definition: euler.cpp:409
#define ZZ(v)
Definition: matrix1d.h:101

◆ operator=() [1/2]

const Euler & Euler::operator= ( const Euler euler)

Definition at line 355 of file euler.cpp.

356 {
357  x = euler.x;
358  y = euler.y;
359  z = euler.z;
360  _initialAxis = euler._initialAxis;
361  _frameStatic = euler._frameStatic;
362  _parityEven = euler._parityEven;
364  return *this;
365 }
double z
Definition: euler.h:224
bool _frameStatic
Definition: euler.h:231
Axis _initialAxis
Definition: euler.h:237
bool _parityEven
Definition: euler.h:235
double x
Definition: euler.h:222
bool _initialRepeated
Definition: euler.h:233
double y
Definition: euler.h:223

◆ operator=() [2/2]

const Euler & Euler::operator= ( const Matrix1D< double > &  v)

Definition at line 367 of file euler.cpp.

368 {
369  x = XX(v);
370  y = YY(v);
371  z = ZZ(v);
372  return *this;
373 }
double z
Definition: euler.h:224
#define XX(v)
Definition: matrix1d.h:85
double x
Definition: euler.h:222
#define YY(v)
Definition: matrix1d.h:93
#define ZZ(v)
Definition: matrix1d.h:101
double y
Definition: euler.h:223

◆ order()

Euler::eulerOrder Euler::order ( ) const

Definition at line 320 of file euler.cpp.

321 {
322  int foo = (_initialAxis == axisZ ?
323  0x2000 : (_initialAxis == axisY ? 0x1000 : 0));
324 
325  if (_parityEven)
326  foo |= 0x0100;
327  if (_initialRepeated)
328  foo |= 0x0010;
329  if (_frameStatic)
330  foo++;
331 
332  return (eulerOrder)foo;
333 }
bool _frameStatic
Definition: euler.h:231
Axis _initialAxis
Definition: euler.h:237
eulerOrder
Definition: euler.h:43
bool _parityEven
Definition: euler.h:235
bool _initialRepeated
Definition: euler.h:233

◆ parityEven()

bool Euler::parityEven ( ) const
inline

Definition at line 212 of file euler.h.

213  {
214  return _parityEven;
215  }
bool _parityEven
Definition: euler.h:235

◆ set()

void Euler::set ( Euler::Axis  axis,
bool  relative,
bool  parityEven,
bool  firstRepeats 
)

Definition at line 344 of file euler.cpp.

348 {
349  _initialAxis = axis;
350  _frameStatic = !relative;
352  _initialRepeated = firstRepeats;
353 }
bool _frameStatic
Definition: euler.h:231
Axis _initialAxis
Definition: euler.h:237
bool _parityEven
Definition: euler.h:235
char axis
bool parityEven() const
Definition: euler.h:212
bool _initialRepeated
Definition: euler.h:233

◆ setOrder()

void Euler::setOrder ( Euler::eulerOrder  p)

Definition at line 335 of file euler.cpp.

336 {
337  set( p & 0x2000 ? axisZ : (p & 0x1000 ? axisY : axisX), // initial axis
338  !(p & 0x1), // static?
339  !!(p & 0x100), // permutation even?
340  !!(p & 0x10)); // initial repeats?
341 }

◆ setXYZVector()

void Euler::setXYZVector ( const Matrix1D< double > &  v)

Definition at line 49 of file euler.cpp.

50 {
51  int i;
52  int j;
53  int k;
54  angleMapping(i,j,k);
55  vec3(i) = XX(v);
56  vec3(j) = YY(v);
57  vec3(k) = ZZ(v);
58 }
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
#define XX(v)
Definition: matrix1d.h:85
void angleMapping(int &i, int &j, int &k) const
Definition: euler.cpp:36
#define j
#define YY(v)
Definition: matrix1d.h:93
Matrix1D< double > vec3
Definition: euler.h:221
#define ZZ(v)
Definition: matrix1d.h:101

◆ simpleXYZRotation()

void Euler::simpleXYZRotation ( Matrix1D< double > &  xyzRot,
const Matrix1D< double > &  targetXyzRot 
)
static

Definition at line 409 of file euler.cpp.

411 {
412  Matrix1D<double> d = xyzRot - targetXyzRot;
413  XX(xyzRot) = XX(targetXyzRot) + angleMod(XX(d));
414  YY(xyzRot) = YY(targetXyzRot) + angleMod(YY(d));
415  ZZ(xyzRot) = ZZ(targetXyzRot) + angleMod(ZZ(d));
416 }
static double angleMod(double angle)
Definition: euler.cpp:396
doublereal * d
#define XX(v)
Definition: matrix1d.h:85
#define YY(v)
Definition: matrix1d.h:93
#define ZZ(v)
Definition: matrix1d.h:101

◆ toMatrix()

void Euler::toMatrix ( Matrix2D< double > &  M) const

Definition at line 250 of file euler.cpp.

251 {
252  int i;
253  int j;
254  int k;
255  angleOrder(i,j,k);
256 
257  Matrix1D<double> angles;
258 
259  if ( _frameStatic )
260  angles = vectorR3(x,y,z);
261  else
262  angles=vectorR3(z,y,x);
263 
264  if ( !_parityEven )
265  {
266  angles *= -1.0;
267  }
268 
269  double ci = cos(XX(angles));
270  double cj = cos(YY(angles));
271  double ch = cos(ZZ(angles));
272  double si = sin(XX(angles));
273  double sj = sin(YY(angles));
274  double sh = sin(ZZ(angles));
275 
276  double cc = ci*ch;
277  double cs = ci*sh;
278  double sc = si*ch;
279  double ss = si*sh;
280 
281  M.initIdentity(4);
282 
283  if ( _initialRepeated )
284  {
285  dMij(M,i,i) = cj;
286  dMij(M,j,i) = sj*si;
287  dMij(M,k,i) = sj*ci;
288 
289  dMij(M,i,j) = sj*sh;
290  dMij(M,j,j) = -cj*ss+cc;
291  dMij(M,k,j) = -cj*cs-sc;
292 
293  dMij(M,i,k) = -sj*ch;
294  dMij(M,j,k) = cj*sc+cs;
295  dMij(M,k,k) = cj*cc-ss;
296  }
297  else
298  {
299  dMij(M,i,i) = cj*ch;
300  dMij(M,j,i) = sj*sc-cs;
301  dMij(M,k,i) = sj*cc+ss;
302 
303  dMij(M,i,j) = cj*sh;
304  dMij(M,j,j) = sj*ss+cc;
305  dMij(M,k,j) = sj*cs-sc;
306 
307  dMij(M,i,k) = -sj;
308  dMij(M,j,k) = cj*si;
309  dMij(M,k,k) = cj*ci;
310  }
311 }
double z
Definition: euler.h:224
bool _frameStatic
Definition: euler.h:231
Matrix1D< double > vectorR3(double x, double y, double z)
Definition: matrix1d.cpp:892
void angleOrder(int &i, int &j, int &k) const
Definition: euler.cpp:28
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
bool _parityEven
Definition: euler.h:235
struct _constraint * cs
#define XX(v)
Definition: matrix1d.h:85
#define dMij(m, i, j)
Definition: matrix2d.h:139
double x
Definition: euler.h:222
#define j
#define YY(v)
Definition: matrix1d.h:93
bool _initialRepeated
Definition: euler.h:233
#define ZZ(v)
Definition: matrix1d.h:101
void initIdentity()
Definition: matrix2d.h:673
double y
Definition: euler.h:223

◆ toXYZVector()

void Euler::toXYZVector ( Matrix1D< double > &  v) const

Definition at line 61 of file euler.cpp.

62 {
63  int i;
64  int j;
65  int k;
66  angleMapping(i,j,k);
67  VEC_ELEM(v, 0) = vec3(i);
68  VEC_ELEM(v, 1) = vec3(j);
69  VEC_ELEM(v, 2) = vec3(k);
70 }
#define VEC_ELEM(v, i)
Definition: matrix1d.h:245
#define i
ql0001_ & k(htemp+1),(cvec+1),(atemp+1),(bj+1),(bl+1),(bu+1),(x+1),(clamda+1), &iout, infoqp, &zero,(w+1), &lenw,(iw+1), &leniw, &glob_grd.epsmac
void angleMapping(int &i, int &j, int &k) const
Definition: euler.cpp:36
#define j
Matrix1D< double > vec3
Definition: euler.h:221

Member Data Documentation

◆ _frameStatic

bool Euler::_frameStatic
protected

Definition at line 231 of file euler.h.

◆ _initialAxis

Axis Euler::_initialAxis
protected

Definition at line 237 of file euler.h.

◆ _initialRepeated

bool Euler::_initialRepeated
protected

Definition at line 233 of file euler.h.

◆ _parityEven

bool Euler::_parityEven
protected

Definition at line 235 of file euler.h.

◆ vec3

Matrix1D<double> Euler::vec3

Definition at line 221 of file euler.h.

◆ x

double Euler::x

Definition at line 222 of file euler.h.

◆ y

double Euler::y

Definition at line 223 of file euler.h.

◆ z

double Euler::z

Definition at line 224 of file euler.h.


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