Quat.cpp

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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerator Defines