00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 #include "matrix3x3.h"
00032 #include "log.h"
00033 #include <stdio.h>
00034 
00035 inline Matrix3x3::Matrix3x3(void){
00036   e11=1; e12=0; e13=0;
00037   e21=0; e22=1; e23=0;
00038   e31=0; e32=0; e33=1;
00039 }
00040 
00041 inline Matrix3x3::Matrix3x3(double aa, double ab, double ac,
00042              double ba, double bb, double bc,
00043              double ca, double cb, double cc){
00044   e11=aa;  e12=ab;  e13=ac;
00045   e21=ba;  e22=bb;  e23=bc;
00046   e31=ca;  e32=cb;  e33=cc;
00047 }
00048 
00049 inline string Matrix3x3::toString(){
00050   char str[256];
00051   sprintf(str, "((%g,%g,%g)(%g,%g,%g)(%g,%g,%g))",
00052       e11,e12,e13,
00053       e21,e22,e23,
00054       e31,e32,e33);
00055   return string(str);
00056 }
00057 
00058 inline double Matrix3x3::Determinant(){
00059   return 
00060     e11*e22*e33 -
00061     e11*e32*e23 +
00062     e21*e32*e13 -
00063     e21*e12*e33 +
00064     e31*e12*e23 -
00065     e31*e22*e13;
00066 }
00067 
00068 inline Matrix3x3 Matrix3x3::Transpose(){
00069   return Matrix3x3(e11,e21,e31,e12,e22,e32,e13,e23,e33);
00070 }
00071 
00072 inline Matrix3x3 Matrix3x3::Inverse(){
00073   double d=Determinant();
00074   
00075   d=(d==0) ? 1 : d;
00076   
00077   return Matrix3x3( (e22*e33-e23*e32)/d,
00078            -(e12*e33-e13*e32)/d,
00079            -(e12*e33-e13*e22)/d,
00080            -(e21*e33-e23*e31)/d,
00081             (e11*e33-e13*e31)/d,
00082            -(e11*e23-e13*e21)/d,
00083             (e21*e32-e22*e31)/d,
00084            -(e11*e32-e12*e31)/d,
00085             (e11*e22-e12*e21)/d);
00086 }
00087 
00088 inline Matrix3x3 &Matrix3x3::operator+=(const Matrix3x3 &m){
00089   e11+=m.e11;  e12+=m.e12;  e13+=m.e13;
00090   e21+=m.e21;  e22+=m.e22;  e23+=m.e23;
00091   e31+=m.e31;  e32+=m.e32;  e33+=m.e33;
00092   return *this;
00093 }
00094 
00095 inline Matrix3x3 &Matrix3x3::operator-=(const Matrix3x3 &m){
00096   e11-=m.e11;  e12-=m.e12;  e13-=m.e13;
00097   e21-=m.e21;  e22-=m.e22;  e23-=m.e23;
00098   e31-=m.e31;  e32-=m.e32;  e33-=m.e33;
00099   return *this;
00100 }
00101 
00102 inline Matrix3x3 operator*(const Matrix3x3 &A, const Matrix3x3 &B){
00103   log <<"This method need check!"<<endl; 
00104   return Matrix3x3(A.e11*B.e11 + A.e12*B.e21 + A.e13*B.e31,
00105            A.e21*B.e11 + A.e22*B.e21 + A.e23*B.e31,
00106            A.e31*B.e11 + A.e32*B.e21 + A.e33*B.e31,
00107 
00108            A.e11*B.e12 + A.e12*B.e22 + A.e13*B.e32,
00109            A.e21*B.e12 + A.e22*B.e22 + A.e23*B.e32,
00110            A.e31*B.e12 + A.e32*B.e22 + A.e33*B.e32,
00111 
00112            A.e11*B.e13 + A.e12*B.e23 + A.e13*B.e33,
00113            A.e21*B.e13 + A.e22*B.e23 + A.e23*B.e33,
00114            A.e31*B.e13 + A.e32*B.e23 + A.e33*B.e33);
00115 
00116   
00117 
00118 
00119 
00120 
00121 
00122 
00123 
00124 
00125 
00126 
00127 
00128 
00129 }
00130 
00131 inline Vector3d operator*(const Matrix3x3 &M, const Vector3d &v){
00132   return Vector3d ( M.e11*v.x + M.e12*v.y + M.e13*v.z,
00133             M.e21*v.x + M.e22*v.y + M.e23*v.z,
00134             M.e31*v.x + M.e32*v.y + M.e33*v.z);
00135 }
00136 
00137 inline Vector3d operator*(const Vector3d &v, const Matrix3x3 &M){
00138   return Vector3d ( M.e11*v.x + M.e21*v.y + M.e31*v.z,
00139             M.e12*v.x + M.e22*v.y + M.e32*v.z,
00140             M.e13*v.x + M.e23*v.y + M.e33*v.z);
00141 }