Go to the documentation of this file.00001
00002
00003
00004
00005
00006 #ifndef _GMTL_EULERANGLE_H_
00007 #define _GMTL_EULERANGLE_H_
00008
00009 #include <gmtl/Math.h>
00010
00011 namespace gmtl
00012 {
00013
00037 template <typename DATA_TYPE, typename ROTATION_ORDER>
00038 class EulerAngle
00039 {
00040 public:
00042 typedef DATA_TYPE DataType;
00043
00044 enum Params { Size = 3, Order = ROTATION_ORDER::ID };
00045
00047 EulerAngle()
00048 {
00049 gmtlASSERT( ROTATION_ORDER::IS_ROTORDER == 1 &&
00050 "you must specify a RotationOrder derived type for the rotationorder in euler angle." );
00051 mData[0] = DATA_TYPE( 0 );
00052 mData[1] = DATA_TYPE( 0 );
00053 mData[2] = DATA_TYPE( 0 );
00054 }
00055
00057 EulerAngle( const EulerAngle& e )
00058 {
00059 mData[0] = e.mData[0];
00060 mData[1] = e.mData[1];
00061 mData[2] = e.mData[2];
00062 }
00063
00065 EulerAngle( DATA_TYPE p0, DATA_TYPE p1, DATA_TYPE p2 )
00066 {
00067 mData[0] = p0;
00068 mData[1] = p1;
00069 mData[2] = p2;
00070 }
00071
00073 void set( const DATA_TYPE& p0, const DATA_TYPE& p1,
00074 const DATA_TYPE& p2 )
00075 {
00076 mData[0] = p0;
00077 mData[1] = p1;
00078 mData[2] = p2;
00079 }
00080
00082
00087 inline DATA_TYPE& operator[]( const unsigned i )
00088 {
00089 gmtlASSERT( i < Size );
00090 return mData[i];
00091 }
00092 inline const DATA_TYPE& operator[]( const unsigned i ) const
00093 {
00094 gmtlASSERT( i < Size );
00095 return mData[i];
00096 }
00098
00100
00103 DATA_TYPE* getData() { return mData; }
00104
00108 const DATA_TYPE* getData() const { return mData; }
00110
00111 private:
00112 DATA_TYPE mData[Size];
00113 };
00114
00115 const EulerAngle<float, XYZ> EULERANGLE_IDENTITY_XYZF( 0.0f, 0.0f, 0.0f );
00116 const EulerAngle<double, XYZ> EULERANGLE_IDENTITY_XYZD( 0.0, 0.0, 0.0 );
00117 const EulerAngle<float, ZYX> EULERANGLE_IDENTITY_ZYXF( 0.0f, 0.0f, 0.0f );
00118 const EulerAngle<double, ZYX> EULERANGLE_IDENTITY_ZYXD( 0.0, 0.0, 0.0 );
00119 const EulerAngle<float, ZXY> EULERANGLE_IDENTITY_ZXYF( 0.0f, 0.0f, 0.0f );
00120 const EulerAngle<double, ZXY> EULERANGLE_IDENTITY_ZXYD( 0.0, 0.0, 0.0 );
00121
00122 typedef EulerAngle<float, XYZ> EulerAngleXYZf;
00123 typedef EulerAngle<double, XYZ> EulerAngleXYZd;
00124 typedef EulerAngle<float, ZYX> EulerAngleZYXf;
00125 typedef EulerAngle<double, ZYX> EulerAngleZYXd;
00126 typedef EulerAngle<float, ZXY> EulerAngleZXYf;
00127 typedef EulerAngle<double, ZXY> EulerAngleZXYd;
00128
00129 }
00130
00131 #endif