00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifndef _Quaternion_h
00011 #define _Quaternion_h
00012
00013 #include "mitkVis2Matrix4x4.h"
00014
00015 class MITK_VISUALIZATION2_API mitkVis2Quaternion
00016 {
00017 public:
00018
00019 mitkVis2Quaternion();
00020 mitkVis2Quaternion(float ax, float ay, float az, float angle);
00021 mitkVis2Quaternion& operator=(const mitkVis2Quaternion &q)
00022 {
00023 x = q.x;
00024 y = q.y;
00025 z = q.z;
00026 w = q.w;
00027 return(*this);
00028 }
00029 mitkVis2Quaternion(const mitkVis2Quaternion &q)
00030 {
00031 x = q.x;
00032 y = q.y;
00033 z = q.z;
00034 w = q.w;
00035 }
00036
00037 void Identity()
00038 {
00039 x = 0.0f;
00040 y = 0.0f;
00041 z = 0.0f;
00042 w = 1.0f;
00043 }
00044 void Normalize()
00045 {
00046 float normInv = 1.0f/sqrtf(x*x+y*y+z*z+w*w);
00047 x *= normInv;
00048 y *= normInv;
00049 z *= normInv;
00050 w *= normInv;
00051 return;
00052 }
00053
00054 mitkVis2Quaternion& operator *= (const mitkVis2Quaternion&);
00055 mitkVis2Matrix4x4 ToMatrix () const
00056 {
00057 mitkVis2Matrix4x4 mat;
00058 float *m = mat;
00059 m[0] = 1.0f - 2.0f * (y*y + z*z);
00060 m[1] = 2.0f * (x*y + z*w);
00061 m[2] = 2.0f * (z*x - y*w);
00062 m[3] = 0.0f;
00063
00064 m[4] = 2.0f * (x*y - z*w);
00065 m[5] = 1.0f - 2.0f * (z*z + x*x);
00066 m[6] = 2.0f * (y*z + x*w);
00067 m[7] = 0.0f;
00068
00069 m[8] = 2.0f * (z*x + y*w);
00070 m[9] = 2.0f * (y*z - x*w);
00071 m[10] = 1.0f - 2.0f * (x*x + y*y);
00072 m[11] = 0.0f;
00073
00074 m[12] = 0.0f;
00075 m[13] = 0.0f;
00076 m[14] = 0.0f;
00077 m[15] = 1.0f;
00078 return mat;
00079 }
00080
00081 float x,y,z,w;
00082
00083 };
00084
00085 inline mitkVis2Quaternion operator * (const mitkVis2Quaternion &p, const mitkVis2Quaternion &q)
00086 {
00087 mitkVis2Quaternion res;
00088
00089 res.w = p.w*q.w - p.x*q.x - p.y*q.y - p.z*q.z;
00090 res.x = p.w*q.x + p.x*q.w + p.y*q.z - p.z*q.y;
00091 res.y = p.w*q.y + p.y*q.w + p.z*q.x - p.x*q.z;
00092 res.z = p.w*q.z + p.z*q.w + p.x*q.y - p.y*q.x;
00093
00094 return res;
00095 }
00096 inline mitkVis2Quaternion& mitkVis2Quaternion::operator *= (const mitkVis2Quaternion& q)
00097 {
00098 *this=*this*q;
00099 return (*this);
00100 }
00101
00102
00103 #endif
00104