shape_doc 0.1
/Users/mourrain/Devel/mmx/shape/include/shape/ssi_math.hpp
Go to the documentation of this file.
00001 #ifndef MATH_MATH_H
00002 #define MATH_MATH_H
00003 #include <algorithm>
00004 #include <math.h>
00005 
00006 template<class K> inline
00007 K abs( const K& k ) { return std::abs(k); };
00008 
00009 template<class K> inline
00010 K det22( const K& a, const K& b, 
00011          const K& c, const K& d )
00012 { return a*d - b*c; };
00013 
00014 template<class K>
00015 void tcoff33( K& r00, K& r01, K& r02, 
00016               K& r10, K& r11, K& r12,
00017               K& r20, K& r21, K& r22,
00018               const K& a00, const K& a01, const K& a02,
00019               const K& a10, const K& a11, const K& a12,
00020               const K& a20, const K& a21, const K& a22 )
00021 {
00022         r00 = a11*a22-a12*a21;
00023         r01 = -a01*a22+a02*a21;
00024         r02 = a01*a12-a02*a11;
00025         r10 = -a10*a22+a12*a20;
00026         r11 = a00*a22-a02*a20;
00027         r12 = -a00*a12+a02*a10;
00028         r20 = a10*a21-a11*a20;
00029         r21 = -a00*a21+a01*a20;
00030         r22 = a00*a11-a01*a10;
00031       };
00032 
00033       template<class K>
00034       void inv33( K& r00, K& r01, K& r02, 
00035                   K& r10, K& r11, K& r12,
00036                   K& r20, K& r21, K& r22,
00037                   const K& a00, const K& a01, const K& a02,
00038                   const K& a10, const K& a11, const K& a12,
00039                   const K& a20, const K& a21, const K& a22 )
00040 
00041       {
00042         tcoff33( r00, r01, r02, 
00043                  r10, r11, r12,
00044                  r20, r21, r22,
00045                  a00, a01, a02,
00046                  a10, a11, a12,
00047                  a20, a21, a22 );
00048         K idet = 1.0/(a00*r00+a10*r01+a20*r02);
00049         r00 *= idet;
00050         r01 *= idet;
00051         r02 *= idet;
00052         r10 *= idet;
00053         r11 *= idet;
00054         r12 *= idet;
00055         r20 *= idet;
00056         r21 *= idet;
00057         r22 *= idet;
00058       };
00059 
00060       template<class K>
00061       K det33( const K& a00, const K& a01, const K& a02,
00062                const K& a10, const K& a11, const K& a12,
00063                const K& a20, const K& a21, const K& a22 )
00064       {
00065         K tmp[9];
00066         tcoff33( tmp[0], tmp[1], tmp[2],
00067                  tmp[3], tmp[4], tmp[5],
00068                  tmp[6], tmp[7], tmp[8],
00069                  a00,    a01,    a02, 
00070                  a10,    a11,    a12,
00071                  a20,    a21,    a22 );
00072         return   a00 * tmp[0] + a10 * tmp[1] + a20 * tmp[2];
00073       };
00074 
00075       template<class K> inline
00076       K Sqrt( const K& x , const K& prec = 1e-19)
00077       {
00078         
00079         K r  = x/2;
00080         do 
00081           {
00082             r  = (r+(x/r))/2;
00083           }
00084         while( abs(r*r-x) > prec );
00085         return r;
00086       };
00087       
00088       template<> inline
00089       double Sqrt( const double& x, const double& prec ) { return sqrt(x); };
00090       template<> inline
00091       float  Sqrt( const float&  x, const float& prec  ) { return sqrt(x); };
00092 
00093 #endif