00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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 }