00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __mitkQuaternion_h
00012 #define __mitkQuaternion_h
00013
00014 #include "mitkMatrix.h"
00015
00019 class MITK_COMMON_API mitkQuaternion
00020 {
00021 public:
00022
00026 mitkQuaternion();
00027
00032 mitkQuaternion(const float x, const float y, const float z, const float w);
00033
00040 mitkQuaternion(const float x, const float y, const float z);
00041
00045 mitkQuaternion& operator=(const mitkQuaternion &q)
00046 {
00047 x = q.x;
00048 y = q.y;
00049 z = q.z;
00050 w = q.w;
00051 return(*this);
00052 }
00053
00057 mitkQuaternion(const mitkQuaternion &q)
00058 {
00059 x = q.x;
00060 y = q.y;
00061 z = q.z;
00062 w = q.w;
00063 }
00064
00068 void Identity(void);
00069
00073 void Normalize(void);
00074
00078 void GetValues(float &x, float &y, float &z, float &w) const;
00079
00087 void AxisRadToQuat(const float ax, const float ay, const float az, const float angle);
00088
00096 void AxisDegToQuat(const float ax, const float ay, const float az, const float angle);
00097
00098
00106 void GetAxisRad(float &ax, float &ay, float &az, float &angle) const;
00107
00115 void GetAxisDeg(float &ax, float &ay, float &az, float &angle) const;
00116
00123 void EulerRadToQuat(const float xr, const float yr, const float zr);
00124
00131 void EulerDegToQuat(const float xd, const float yd, const float zd);
00132
00139 void GetEulerRad(float &xr, float &yr, float &zr) const;
00140
00147 void GetEulerDeg(float &xd, float &yd, float &zd) const;
00148
00153 void BuildMatrix(mitkMatrix &mat) const;
00154
00158 friend mitkQuaternion operator * (const mitkQuaternion &p, const mitkQuaternion &q);
00159
00160 private:
00161
00162 inline double _norm(void);
00163
00164
00165 float x,y,z,w;
00166
00167
00168
00169 };
00170
00171 inline mitkQuaternion operator * (const mitkQuaternion &p, const mitkQuaternion &q)
00172 {
00173 mitkQuaternion res;
00174
00175 res.w = p.w*q.w - p.x*q.x - p.y*q.y - p.z*q.z;
00176
00177 res.x = p.w*q.x + p.x*q.w + p.y*q.z - p.z*q.y;
00178 res.y = p.w*q.y + p.y*q.w + p.z*q.x - p.x*q.z;
00179 res.z = p.w*q.z + p.z*q.w + p.x*q.y - p.y*q.x;
00180
00181 return res;
00182 }
00183
00184
00185 #endif
00186
00187