#include #ifndef USE_SSE2 // Matrix class without SIMD instructions class DMatrix4x4{ public: DMatrix4x4(){ for (unsigned int i=0;i<4;i++){ for (unsigned int j=0;j<4;j++){ mA[i][j]=0.; } } } DMatrix4x4(double c11, double c12, double c13, double c14, double c21, double c22, double c23, double c24, double c31, double c32, double c33, double c34, double c41, double c42, double c43, double c44 ){ mA[0][0]=c11; mA[0][1]=c12; mA[0][2]=c13; mA[0][3]=c14; mA[1][0]=c21; mA[1][1]=c22; mA[1][2]=c23; mA[1][3]=c24; mA[2][0]=c31; mA[2][1]=c32; mA[2][2]=c33; mA[2][3]=c34; mA[3][0]=c41; mA[3][1]=c42; mA[3][2]=c43; mA[3][3]=c44; } DMatrix4x4(const DMatrix2x2 &m1,const DMatrix2x2 &m2, const DMatrix2x2 &m3,const DMatrix2x2 &m4){ mA[0][0]=m1(0,0); mA[0][1]=m1(0,1); mA[1][0]=m1(1,0); mA[1][1]=m1(1,1); mA[0][2]=m2(0,0); mA[0][3]=m2(0,1); mA[1][2]=m2(1,0); mA[1][3]=m2(1,1); mA[2][0]=m3(0,0); mA[2][1]=m3(0,1); mA[3][0]=m3(1,0); mA[3][1]=m3(1,1); mA[2][2]=m4(0,0); mA[2][3]=m4(0,1); mA[3][2]=m4(1,0); mA[3][3]=m4(1,1); } ~DMatrix4x4(){}; double &operator() (int row, int col){ return mA[row][col]; } double operator() (int row, int col) const{ return mA[row][col]; } // Assignment DMatrix4x4 &operator=(const DMatrix4x4 &m1){ for (unsigned int i=0;i<4;i++){ for (unsigned int j=0;j<4;j++){ mA[i][j]=m1(i,j); } } return *this; } // unary minus DMatrix4x4 operator-(){ return DMatrix4x4(-mA[0][0],-mA[0][1],-mA[0][2],-mA[0][3], -mA[1][0],-mA[1][1],-mA[1][2],-mA[1][3], -mA[2][0],-mA[2][1],-mA[2][2],-mA[2][3], -mA[3][0],-mA[3][1],-mA[3][2],-mA[3][3] ); } // Matrix Addition DMatrix4x4 operator+(const DMatrix4x4 &m2){ return DMatrix4x4(mA[0][0]+m2(0,0),mA[0][1]+m2(0,1),mA[0][2]+m2(0,2),mA[0][3]+m2(0,3), mA[1][0]+m2(1,0),mA[1][1]+m2(1,1),mA[1][2]+m2(1,2),mA[1][3]+m2(1,3), mA[2][0]+m2(2,0),mA[2][1]+m2(2,1),mA[2][2]+m2(2,2),mA[2][3]+m2(2,3), mA[3][0]+m2(3,0),mA[3][1]+m2(3,1),mA[3][2]+m2(3,2),mA[3][3]+m2(3,3) ); } // Matrix subtraction DMatrix4x4 operator-(const DMatrix4x4 &m2){ return DMatrix4x4(mA[0][0]-m2(0,0),mA[0][1]-m2(0,1),mA[0][2]-m2(0,2),mA[0][3]-m2(0,3), mA[1][0]-m2(1,0),mA[1][1]-m2(1,1),mA[1][2]-m2(1,2),mA[1][3]-m2(1,3), mA[2][0]-m2(2,0),mA[2][1]-m2(2,1),mA[2][2]-m2(2,2),mA[2][3]-m2(2,3), mA[3][0]-m2(3,0),mA[3][1]-m2(3,1),mA[3][2]-m2(3,2),mA[3][3]-m2(3,3) ); } // Matrix multiplication: (4x4) x (4x4) DMatrix4x4 operator*(const DMatrix4x4 &m2){ return DMatrix4x4(mA[0][0]*m2(0,0)+mA[0][1]*m2(1,0)+mA[0][2]*m2(2,0)+mA[0][3]*m2(3,0), mA[0][0]*m2(0,1)+mA[0][1]*m2(1,1)+mA[0][2]*m2(2,1)+mA[0][3]*m2(3,1), mA[0][0]*m2(0,2)+mA[0][1]*m2(1,2)+mA[0][2]*m2(2,2)+mA[0][3]*m2(3,2), mA[0][0]*m2(0,3)+mA[0][1]*m2(1,3)+mA[0][2]*m2(2,3)+mA[0][3]*m2(3,3), mA[1][0]*m2(0,0)+mA[1][1]*m2(1,0)+mA[1][2]*m2(2,0)+mA[1][3]*m2(3,0), mA[1][0]*m2(0,1)+mA[1][1]*m2(1,1)+mA[1][2]*m2(2,1)+mA[1][3]*m2(3,1), mA[1][0]*m2(0,2)+mA[1][1]*m2(1,2)+mA[1][2]*m2(2,2)+mA[1][3]*m2(3,2), mA[1][0]*m2(0,3)+mA[1][1]*m2(1,3)+mA[1][2]*m2(2,3)+mA[1][3]*m2(3,3), mA[2][0]*m2(0,0)+mA[2][1]*m2(1,0)+mA[2][2]*m2(2,0)+mA[2][3]*m2(3,0), mA[2][0]*m2(0,1)+mA[2][1]*m2(1,1)+mA[2][2]*m2(2,1)+mA[2][3]*m2(3,1), mA[2][0]*m2(0,2)+mA[2][1]*m2(1,2)+mA[2][2]*m2(2,2)+mA[2][3]*m2(3,2), mA[2][0]*m2(0,3)+mA[2][1]*m2(1,3)+mA[2][2]*m2(2,3)+mA[2][3]*m2(3,3), mA[3][0]*m2(0,0)+mA[3][1]*m2(1,0)+mA[3][2]*m2(2,0)+mA[3][3]*m2(3,0), mA[3][0]*m2(0,1)+mA[3][1]*m2(1,1)+mA[3][2]*m2(2,1)+mA[3][3]*m2(3,1), mA[3][0]*m2(0,2)+mA[3][1]*m2(1,2)+mA[3][2]*m2(2,2)+mA[3][3]*m2(3,2), mA[3][0]*m2(0,3)+mA[3][1]*m2(1,3)+mA[3][2]*m2(2,3)+mA[3][3]*m2(3,3) ); } // Matrix multiplication: (4x4) x (4x2) DMatrix4x2 operator*(const DMatrix4x2 &m2){ return DMatrix4x2(mA[0][0]*m2(0,0)+mA[0][1]*m2(1,0)+mA[0][2]*m2(2,0)+mA[0][3]*m2(3,0), mA[0][0]*m2(0,1)+mA[0][1]*m2(1,1)+mA[0][2]*m2(2,1)+mA[0][3]*m2(3,1), mA[1][0]*m2(0,0)+mA[1][1]*m2(1,0)+mA[1][2]*m2(2,0)+mA[1][3]*m2(3,0), mA[1][0]*m2(0,1)+mA[1][1]*m2(1,1)+mA[1][2]*m2(2,1)+mA[1][3]*m2(3,1), mA[2][0]*m2(0,0)+mA[2][1]*m2(1,0)+mA[2][2]*m2(2,0)+mA[2][3]*m2(3,0), mA[2][0]*m2(0,1)+mA[2][1]*m2(1,1)+mA[2][2]*m2(2,1)+mA[2][3]*m2(3,1), mA[3][0]*m2(0,0)+mA[3][1]*m2(1,0)+mA[3][2]*m2(2,0)+mA[3][3]*m2(3,0), mA[3][0]*m2(0,1)+mA[3][1]*m2(1,1)+mA[3][2]*m2(2,1)+mA[3][3]*m2(3,1) ); } // Matrix multiplication: (4x4) x (4x1) DMatrix4x1 operator*(const DMatrix4x1 &m2){ return DMatrix4x1(mA[0][0]*m2(0)+mA[0][1]*m2(1)+mA[0][2]*m2(2)+mA[0][3]*m2(3), mA[1][0]*m2(0)+mA[1][1]*m2(1)+mA[1][2]*m2(2)+mA[1][3]*m2(3), mA[2][0]*m2(0)+mA[2][1]*m2(1)+mA[2][2]*m2(2)+mA[2][3]*m2(3), mA[3][0]*m2(0)+mA[3][1]*m2(1)+mA[3][2]*m2(2)+mA[3][3]*m2(3) ); } DMatrix4x4 Invert(){ DMatrix2x2 F(mA[0][0],mA[0][1],mA[1][0],mA[1][1]); DMatrix2x2 Finv=F.Invert(); DMatrix2x2 G(mA[0][2],mA[0][3],mA[1][2],mA[1][3]); DMatrix2x2 H(mA[2][0],mA[2][1],mA[3][0],mA[3][1]); DMatrix2x2 J(mA[2][2],mA[2][3],mA[3][2],mA[3][3]); DMatrix2x2 Jinv=J.Invert(); DMatrix2x2 FF=(F-G*Jinv*H).Invert(); DMatrix2x2 JJ=(J-H*Finv*G).Invert(); return DMatrix4x4(FF,-FF*G*Jinv,-JJ*H*Finv,JJ); } // Find the transpose of this matrix DMatrix4x4 Transpose(){ DMatrix4x4 temp; for (unsigned int i=0;i<4;i++){ for (unsigned int j=0;j<4;j++){ temp(i,j)=mA[j][i]; } } return temp; } void Print(){ cout << "DMatrix4x4:" <