18#ifndef _vctEulerRotation3_h
19#define _vctEulerRotation3_h
67#define VCT_DECLARE_EULER_CONVERSIONS(ORDER) \
68 template <class _matrixType> \
70 vctEulerFromMatrixRotation3(vctEulerRotation3<ORDER> & eulerRot, \
71 const vctMatrixRotation3Base<_matrixType> & matrixRot); \
72 template <class _matrixType> \
74 vctEulerToMatrixRotation3(const vctEulerRotation3<ORDER> & eulerRot, \
75 vctMatrixRotation3Base<_matrixType> & matrixRot);
100 cmnThrow(std::runtime_error(
"vctEulerRotation3Base: This rotation is not normalized"));
108 template <
class _inputType>
110 if (! input.IsNormalized()) {
111 cmnThrow(std::runtime_error(
"vctEulerRotation3Base: Input is not normalized"));
153template <vctEulerRotation3Order::OrderType _order>
171 template <
class __containerType>
175 From(matrixRotation);
179 template <
class __containerType>
183 if (normalizeInput) {
193 template <
class _matrixType>
200 template <
class _matrixType>
206 template <
class _matrixType>
208 vctEulerFromMatrixRotation3(*
this, matrixRotation);
222 *
this = otherRotation;
262 return (this->Angles == other.
Angles);
266 return this->
Equal(other);
282 const vct3 angleDiff(this->Angles - other.
Angles);
302 std::stringstream outputStream;
304 return outputStream.str();
313 void ToStreamRaw(std::ostream & outputStream,
const char delimiter =
' ',
314 bool headerOnly =
false,
const std::string & headerPrefix =
"")
const {
315 this->Angles.
ToStreamRaw(outputStream, delimiter, headerOnly, headerPrefix +
"angle-");
345#ifdef CISST_COMPILER_IS_MSVC
347#define VCT_DECLARE_EULER_CONVERSION_TEMPLATES(ORDER) \
348 template CISST_EXPORT void \
349 vctEulerFromMatrixRotation3(vctEulerRotation3<ORDER> & eulerRot, \
350 const vctMatrixRotation3Base<vctFixedSizeMatrix<double, 3, 3, VCT_ROW_MAJOR> > & matrixRot); \
351 template CISST_EXPORT void \
352 vctEulerFromMatrixRotation3(vctEulerRotation3<ORDER> & eulerRot, \
353 const vctMatrixRotation3Base<vctFixedSizeMatrix<double, 3, 3, VCT_COL_MAJOR> > & matrixRot); \
354 template CISST_EXPORT void \
355 vctEulerFromMatrixRotation3(vctEulerRotation3<ORDER> & eulerRot, \
356 const vctMatrixRotation3Base<vctFixedSizeMatrix<float, 3, 3, VCT_ROW_MAJOR> > & matrixRot); \
357 template CISST_EXPORT void \
358 vctEulerFromMatrixRotation3(vctEulerRotation3<ORDER> & eulerRot, \
359 const vctMatrixRotation3Base<vctFixedSizeMatrix<float, 3, 3, VCT_COL_MAJOR> > & matrixRot); \
360 template CISST_EXPORT void \
361 vctEulerFromMatrixRotation3(vctEulerRotation3<ORDER> & eulerRot, \
362 const vctMatrixRotation3Base<vctFixedSizeMatrixRef<double, 3, 3, 4, 1> > & matrixRot); \
363 template CISST_EXPORT void \
364 vctEulerFromMatrixRotation3(vctEulerRotation3<ORDER> & eulerRot, \
365 const vctMatrixRotation3Base<vctFixedSizeMatrixRef<double, 3, 3, 1, 4> > & matrixRot); \
366 template CISST_EXPORT void \
367 vctEulerFromMatrixRotation3(vctEulerRotation3<ORDER> & eulerRot, \
368 const vctMatrixRotation3Base<vctFixedSizeMatrixRef<float, 3, 3, 4, 1> > & matrixRot); \
369 template CISST_EXPORT void \
370 vctEulerFromMatrixRotation3(vctEulerRotation3<ORDER> & eulerRot, \
371 const vctMatrixRotation3Base<vctFixedSizeMatrixRef<float, 3, 3, 1, 4> > & matrixRot); \
372 template CISST_EXPORT void \
373 vctEulerToMatrixRotation3(const vctEulerRotation3<ORDER> & eulerRot, \
374 vctMatrixRotation3Base<vctFixedSizeMatrix<double, 3, 3, VCT_ROW_MAJOR> > & matrixRot); \
375 template CISST_EXPORT void \
376 vctEulerToMatrixRotation3(const vctEulerRotation3<ORDER> & eulerRot, \
377 vctMatrixRotation3Base<vctFixedSizeMatrix<double, 3, 3, VCT_COL_MAJOR> > & matrixRot); \
378 template CISST_EXPORT void \
379 vctEulerToMatrixRotation3(const vctEulerRotation3<ORDER> & eulerRot, \
380 vctMatrixRotation3Base<vctFixedSizeMatrix<float, 3, 3, VCT_ROW_MAJOR> > & matrixRot); \
381 template CISST_EXPORT void \
382 vctEulerToMatrixRotation3(const vctEulerRotation3<ORDER> & eulerRot, \
383 vctMatrixRotation3Base<vctFixedSizeMatrix<float, 3, 3, VCT_COL_MAJOR> > & matrixRot); \
384 template CISST_EXPORT void \
385 vctEulerToMatrixRotation3(const vctEulerRotation3<ORDER> & eulerRot, \
386 vctMatrixRotation3Base<vctFixedSizeMatrixRef<double, 3, 3, 4, 1> > & matrixRot); \
387 template CISST_EXPORT void \
388 vctEulerToMatrixRotation3(const vctEulerRotation3<ORDER> & eulerRot, \
389 vctMatrixRotation3Base<vctFixedSizeMatrixRef<double, 3, 3, 1, 4> > & matrixRot); \
390 template CISST_EXPORT void \
391 vctEulerToMatrixRotation3(const vctEulerRotation3<ORDER> & eulerRot, \
392 vctMatrixRotation3Base<vctFixedSizeMatrixRef<float, 3, 3, 4, 1> > & matrixRot); \
393 template CISST_EXPORT void \
394 vctEulerToMatrixRotation3(const vctEulerRotation3<ORDER> & eulerRot, \
395 vctMatrixRotation3Base<vctFixedSizeMatrixRef<float, 3, 3, 1, 4> > & matrixRot);
A collection of useful information about the C++ basic types, represented in a generic programming wa...
Definition cmnTypeTraits.h:155
static Type Tolerance(void)
Definition cmnTypeTraits.h:170
vctEulerRotation3Base(double phi, double theta, double psi)
Definition vctEulerRotation3.h:119
vct3 Angles
Definition vctEulerRotation3.h:95
vctEulerRotation3Base(double *angles)
Definition vctEulerRotation3.h:120
vctEulerRotation3Base(const vct3 &angles)
Definition vctEulerRotation3.h:121
double psi(void) const
Definition vctEulerRotation3.h:127
void ThrowUnlessIsNormalized(const _inputType &input) const CISST_THROW(std
Definition vctEulerRotation3.h:109
void Assign(double phi, double theta, double psi)
double gamma(void) const
Definition vctEulerRotation3.h:131
double beta(void) const
Definition vctEulerRotation3.h:130
double phi(void) const
Definition vctEulerRotation3.h:125
double theta(void) const
Definition vctEulerRotation3.h:126
bool IsNormalized(double tolerance=TypeTraits::Tolerance()) const
void ThrowUnlessIsNormalized(void) const CISST_THROW(std
Definition vctEulerRotation3.h:98
vctEulerRotation3Base(const vctEulerRotation3Base &other)
Definition vctEulerRotation3.h:118
double alpha(void) const
Definition vctEulerRotation3.h:129
~vctEulerRotation3Base()
Definition vctEulerRotation3.h:123
vctEulerRotation3Base(void)
Definition vctEulerRotation3.h:117
vctEulerRotation3Base & InverseSelf(void)
cmnTypeTraits< double > TypeTraits
Definition vctEulerRotation3.h:93
vctEulerRotation3Base & NormalizedSelf(void)
Definition vctEulerRotation3.h:154
ThisType & FromNormalized(const vctMatrixRotation3Base< _matrixType > &matrixRot)
Definition vctEulerRotation3.h:201
ThisType & From(const vctMatrixRotation3Base< _matrixType > &matrixRot) CISST_THROW(std
Definition vctEulerRotation3.h:194
void ToStream(std::ostream &outputStream) const
Definition vctEulerRotation3.h:308
const vct3 & GetAngles(void) const
Definition vctEulerRotation3.h:213
~vctEulerRotation3()
Definition vctEulerRotation3.h:190
ThisType Inverse(void) const
Definition vctEulerRotation3.h:228
bool AlmostEquivalent(const ThisType &other, double tolerance=TypeTraits::Tolerance()) const
Definition vctEulerRotation3.h:295
vctEulerRotation3< _order > ThisType
Definition vctEulerRotation3.h:156
ThisType & FromRaw(const vctMatrixRotation3Base< _matrixType > &matrixRotation)
Definition vctEulerRotation3.h:207
ThisType Normalized(void) const
Definition vctEulerRotation3.h:248
vctEulerRotation3(double *angles)
Definition vctEulerRotation3.h:162
ThisType & operator=(const ThisType &other)
Definition vctEulerRotation3.h:165
std::string ToString(void) const
Definition vctEulerRotation3.h:301
vctEulerRotation3Base BaseType
Definition vctEulerRotation3.h:157
ThisType & InverseOf(const ThisType &otherRotation)
Definition vctEulerRotation3.h:221
void DeSerializeRaw(std::istream &inputStream)
Definition vctEulerRotation3.h:325
vctEulerRotation3()
Definition vctEulerRotation3.h:159
bool Equal(const ThisType &other) const
Definition vctEulerRotation3.h:261
vct3 GetAnglesInDegrees(void) const
Definition vctEulerRotation3.h:217
vctEulerRotation3(const vctMatrixRotation3Base< __containerType > &matrixRotation) CISST_THROW(std
Definition vctEulerRotation3.h:172
vctEulerRotation3(const vct3 &angles)
Definition vctEulerRotation3.h:163
vct3 & GetAngles(void)
Definition vctEulerRotation3.h:214
ThisType & NormalizedOf(const ThisType &otherRotation)
Definition vctEulerRotation3.h:239
vctEulerRotation3(const ThisType &other)
Definition vctEulerRotation3.h:160
vctEulerRotation3(double phi, double theta, double psi)
Definition vctEulerRotation3.h:161
void ToStreamRaw(std::ostream &outputStream, const char delimiter=' ', bool headerOnly=false, const std::string &headerPrefix="") const
Definition vctEulerRotation3.h:313
bool operator==(const ThisType &other) const
Definition vctEulerRotation3.h:265
vctEulerRotation3(const vctMatrixRotation3Base< __containerType > &matrixRotation, bool normalizeInput)
Definition vctEulerRotation3.h:180
bool AlmostEqual(const ThisType &other, double tolerance=TypeTraits::Tolerance()) const
Definition vctEulerRotation3.h:280
void SerializeRaw(std::ostream &outputStream) const
Definition vctEulerRotation3.h:319
void ToStreamRaw(std::ostream &outputStream, const char delimiter=' ', bool headerOnly=false, const std::string &headerPrefix="") const
Definition vctFixedSizeConstVectorBase.h:1118
void SerializeRaw(std::ostream &outputStream) const
Definition vctFixedSizeConstVectorBase.h:1141
value_type MaxAbsElement(void) const
Definition vctFixedSizeConstVectorBase.h:514
ThisType & Assign(const vctFixedSizeConstVectorBase< _size, __stride, __elementType, __dataPtrType > &other)
Definition vctFixedSizeVectorBase.h:274
void DeSerializeRaw(std::istream &inputStream)
Definition vctFixedSizeVector.h:301
Define a rotation matrix for a space of dimension 3.
Definition vctMatrixRotation3Base.h:71
RotationValueType Normalized(void) const
Definition vctMatrixRotation3.h:394
Declaration of various constants.
const double cmnPI
Definition cmnConstants.h:38
#define CISST_EXPORT
Definition cmnExportMacros.h:50
#define CISST_THROW(exceptionParameter)
Somewhat portable compilation warning message. This works with very recent versions of gcc (4....
Definition cmnPortability.h:559
void cmnThrow(const _exceptionType &except, cmnLogLevel lod=CMN_LOG_LEVEL_INIT_ERROR)
Definition cmnThrow.h:76
Definition vctEulerRotation3.h:84
std::string CISST_EXPORT ToString(vctEulerRotation3Order::OrderType order)
OrderType
Definition vctForwardDeclarations.h:218
@ ZXZ
Definition vctForwardDeclarations.h:218
@ ZYX
Definition vctForwardDeclarations.h:218
@ YZX
Definition vctForwardDeclarations.h:218
@ ZYZ
Definition vctForwardDeclarations.h:218
vctEulerRotation3< vctEulerRotation3Order::ZXZ > vctEulerZXZRotation3
Definition vctEulerRotation3.h:339
vctEulerRotation3< vctEulerRotation3Order::ZYX > vctEulerZYXRotation3
Definition vctEulerRotation3.h:336
vctEulerRotation3< vctEulerRotation3Order::ZYZ > vctEulerZYZRotation3
Definition vctEulerRotation3.h:333
#define VCT_DECLARE_EULER_CONVERSIONS(ORDER)
Define an Euler angle rotation for a space of dimension 3.
Definition vctEulerRotation3.h:67
vctEulerRotation3< vctEulerRotation3Order::YZX > vctEulerYZXRotation3
Definition vctEulerRotation3.h:342
Macros to export the symbols of cisstVector (in a Dll).
Typedef for fixed size vectors.
vctFixedSizeVector< double, 3 > vct3
Definition vctFixedSizeVectorTypes.h:46
Forward declarations and #define for cisstVector.