Go to the documentation of this file.00001
00009 #include "Quat.h"
00010
00011 using namespace MeshLib;
00012
00015 void CQrot::normalize()
00016 {
00017 double l = m_w * m_w + m_x * m_x + m_y * m_y + m_z * m_z;
00018 if( l < 1e-20 ) {
00019 m_x = 0; m_y = 0; m_z = 0; m_w = 1;
00020 return;
00021 }
00022
00023 l = sqrt(l);
00024
00025 m_w /= l;
00026 m_x /= l;
00027 m_y /= l;
00028 m_z /= l;
00029 }
00030
00035 CQrot & CQrot::operator^(double p)
00036 {
00037 normalize();
00038 double theta = 2 * acos( m_w );
00039 if( theta < 1e-10 ) return (*this);
00040
00041 CPoint axis( m_x,m_y,m_z );
00042 axis /= axis.norm();
00043
00044 theta *= p;
00045 m_w = cos( theta * 0.5 );
00046 axis *= sin( theta * 0.5 );
00047
00048 m_x = axis[0];
00049 m_y = axis[1];
00050 m_z = axis[2];
00051
00052 return (*this);
00053 }
00058 CPoint CQrot::operator*( const CPoint & p )
00059 {
00060 CQrot q(m_w,m_x,m_y,m_z);
00061 CQrot pq( 0, p[0],p[1], p[2]);
00062 CQrot iq = q^(-1);
00063 CQrot r = q * pq * iq ;
00064 return CPoint(r.m_x,r.m_y, r.m_z);
00065 }
00066
00073 CQrot operator^(const CQrot & r, double p)
00074 {
00075 CQrot q = r;
00076 q.normalize();
00077 double theta = 2 * acos( q.m_w );
00078 if( theta < 1e-10 ) return q;
00079
00080 CPoint axis( q.m_x, q.m_y, q.m_z );
00081 axis /= axis.norm();
00082 theta *= p;
00083 q.m_w = cos( theta * 0.5 );
00084 axis *= sin( theta * 0.5 );
00085
00086 q.m_x = axis[0];
00087 q.m_y = axis[1];
00088 q.m_z = axis[2];
00089
00090 return q;
00091 }
00092
00097 void CQrot::convert( double * m)
00098 {
00099 CQrot q = *this;
00100 double l = q^q;
00101 double s = 2.0 / l;
00102 double xs = q.m_x*s;
00103 double ys = q.m_y*s;
00104 double zs = q.m_z*s;
00105
00106 double wx = q.m_w*xs;
00107 double wy = q.m_w*ys;
00108 double wz = q.m_w*zs;
00109
00110 double xx = q.m_x*xs;
00111 double xy = q.m_x*ys;
00112 double xz = q.m_x*zs;
00113
00114 double yy = q.m_y*ys;
00115 double yz = q.m_y*zs;
00116 double zz = q.m_z*zs;
00117
00118
00119 m[0*4+0] = 1.0 - (yy + zz);
00120 m[1*4+0] = xy - wz;
00121 m[2*4+0] = xz + wy;
00122 m[0*4+1] = xy + wz;
00123 m[1*4+1] = 1.0 - (xx + zz);
00124 m[2*4+1] = yz - wx;
00125 m[0*4+2] = xz - wy;
00126 m[1*4+2] = yz + wx;
00127 m[2*4+2] = 1.0 - (xx + yy);
00128
00129
00130 m[0*4+3] = 0.0;
00131 m[1*4+3] = 0.0;
00132 m[2*4+3] = 0.0;
00133 m[3*4+0] = m[3*4+1] = m[3*4+2] = 0.0;
00134 m[3*4+3] = 1.0;
00135 }
00136
00144 CQrot CQrot::operator*( const CQrot & q ) const
00145 {
00146
00147 double sp = m_w;
00148 CPoint vp( m_x, m_y, m_z );
00149
00150 double sq = q.m_w;
00151 CPoint vq( q.m_x, q.m_y, q.m_z );
00152
00153 double sr = sp * sq - vp * vq;
00154
00155 CPoint vr;
00156 CPoint dp;
00157 dp = vp^vq;
00158 vp = vp * sq;
00159 vq = vq * sp;
00160 vr = vp + vq + dp;
00161
00162 return CQrot( sr, vr[0], vr[1], vr[2]);
00163 }
00164
00171 double CQrot::operator^( const CQrot & q ) const
00172 {
00173 return ( m_w * q.m_w + m_x * q.m_x + m_y * q.m_y + m_z * q.m_z);
00174 };
00175