Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

Matrix.cpp

00001 /*
00002  *  Copyright (C) 2005 L2TI Universite Paris-13
00003  *
00004  * This program is free software; you can redistribute it and/or modify
00005  * it under the terms of the GNU General Public License as published by
00006  * the Free Software Foundation; either version 2 of the License, or
00007  * (at your option) any later version.
00008  *
00009  * This program is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012  * GNU General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU General Public License
00015  * along with this program; if not, write to the Free Software
00016  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00017  *
00018  */
00019 
00020 #include<ImLib3D/Matrix.hpp>
00021 
00022 Matrix::Matrix(float m00,float m01,float m02,
00023                float m10,float m11,float m12,
00024                float m20,float m21,float m22)
00025 {
00026     data[0][0]=m00;data[0][1]=m01;data[0][2]=m02;
00027     data[1][0]=m10;data[1][1]=m11;data[1][2]=m12;
00028     data[2][0]=m20;data[2][1]=m21;data[2][2]=m22;
00029 }
00030 
00031 Matrix::Matrix(const float *initArray)
00032 {
00033     for(int i=0;i<3;i++)
00034     for(int j=0;j<3;j++)
00035     {
00036         data[i][j]=*(initArray++);
00037     }
00038 }
00039 Matrix::Matrix(const Matrix &other)
00040 {
00041     for(int i=0;i<3;i++)
00042     for(int j=0;j<3;j++)
00043     {
00044         data[i][j]=other.data[i][j];
00045     }
00046 }
00047 
00048 float
00049 Matrix::MaxElement()
00050 {
00051     float result=data[0][0];
00052     for(int i=0;i<3;i++)
00053     for(int j=0;j<3;j++)
00054     {
00055         result=max(result,data[i][j]);
00056     }
00057     return result;
00058 }
00059 
00060 void
00061 Matrix::SetToZero()
00062 {
00063     for(int i=0;i<3;i++)
00064     for(int j=0;j<3;j++)
00065     {
00066         data[i][j]=0;
00067     }
00068 }
00069 
00070 void
00071 Matrix::Transpose()
00072 {
00073     Matrix result;
00074     for(int i=0;i<3;i++)
00075     for(int j=0;j<3;j++)
00076     {
00077         result.data[i][j]=data[j][i];
00078     }
00079     *this=result;
00080 }
00081 
00082 void
00083 Matrix::Inverse() 
00084 {
00085     Matrix result;
00086     float det=0;
00087     for(int i=0;i<3;i++)
00088     {
00089         det+=data[i][0]*Cofactor(i,0);
00090     }
00091     for(int i=0;i<3;i++)
00092     for(int j=0;j<3;j++)
00093     {
00094         result.data[i][j]=Cofactor(i,j)/det;
00095     }
00096     result.Transpose();
00097     *this=result;
00098 }
00099 
00100 
00101 Matrix
00102 Matrix::operator-(const Matrix &other) const
00103 {
00104     Matrix result;
00105     for(int i=0;i<3;i++)
00106     for(int j=0;j<3;j++)
00107     {
00108         result.data[i][j]=data[i][j]-other.data[i][j];
00109     }   
00110     return result;
00111 }
00112 Matrix
00113 Matrix::operator+(const Matrix &other) const
00114 {
00115     Matrix result;
00116     for(int i=0;i<3;i++)
00117     for(int j=0;j<3;j++)
00118     {
00119         result.data[i][j]=data[i][j]+other.data[i][j];
00120     }   
00121     return result;
00122 }
00123 Matrix
00124 Matrix::operator*(const Matrix &other) const
00125 {
00126     Matrix result;
00127     for(int i=0;i<3;i++)
00128     for(int j=0;j<3;j++)
00129     {
00130         float s=0;
00131         for(int k=0;k<3;k++)
00132         {
00133             s+=data[i][k]*other.data[k][j];
00134         }   
00135         result.data[i][j]=s;
00136     }
00137     return result;
00138 }
00139 
00140 Vect3Df
00141 Matrix::operator*(const Vect3Df &v) const
00142 {
00143     Vect3Df result;
00144     for(int i=0;i<3;i++)
00145     {
00146         float s=0;
00147         for(int k=0;k<3;k++)
00148         {
00149             s+=data[i][k]*v(k);
00150         }   
00151         result(i)=s;
00152     }
00153     return result;
00154 }
00155 
00156 
00157 
00158 void 
00159 Matrix::operator=(const Matrix &other)
00160 {
00161     for(int i=0;i<3;i++)
00162     for(int j=0;j<3;j++)
00163     {
00164         data[i][j]=other(i,j);
00165     }   
00166 }
00167 bool
00168 Matrix::operator==(const Matrix &other)
00169 {
00170     for(int i=0;i<3;i++)
00171     for(int j=0;j<3;j++)
00172     {
00173         if(data[i][j]!=other(i,j)){return false;}
00174     }
00175     return true;
00176 }
00177 
00178 #include<iomanip>
00179 ostream& operator<< (ostream& s, const Matrix& matrix)
00180 {
00181     for(int i=0;i<3;i++)
00182     {
00183         for(int j=0;j<3;j++)
00184         {
00185             s << setw(10) << matrix(i,j);
00186             if(j<2){s << " ";}
00187         }
00188         s << endl;      
00189     }
00190     return s;
00191 }
00192 
00193 Matrix operator*(float s,const Matrix &matrix)
00194 {
00195     Matrix result;
00196     for(int i=0;i<3;i++)
00197     for(int j=0;j<3;j++)
00198     {
00199         result(i,j)=s*matrix(i,j);
00200     }   
00201     return result;
00202 }

Generated on Fri Jun 17 13:36:05 2005 for ImLib3D by  doxygen 1.4.2