00001 #include "mmatrix.h" 00002 00003 MMatrix::MMatrix (int m, int n) { 00004 if ((dimN > 4) || (dimM > 4)) { 00005 dimN = 0; 00006 dimM = 0; 00007 } else { 00008 dimN = n; 00009 dimM = m; 00010 }; 00011 00012 for (int x = 1; x <= MAX_MMATRIX_M; x++) { 00013 for (int y = 1; y <= MAX_MMATRIX_N; y++) { 00014 mat[x][y] = 0; 00015 }; 00016 }; 00017 00018 return; 00019 }; 00020 00021 MMatrix::~MMatrix () { 00022 }; 00023 00024 int MMatrix::getM () { 00025 return dimM; 00026 }; 00027 00028 int MMatrix::getN () { 00029 return dimN; 00030 }; 00031 00032 void MMatrix::set (int m, int n, float val) { 00033 if ((m < 1) || (m > MAX_MMATRIX_M) || (n < 1) || (y > MAX_MMATRIX_N)) return; 00034 00035 mat[m][n] = val; 00036 }; 00037 00038 float MMatrix::get (int m, int n) { 00039 if ((m < 1) || (m > MAX_MMATRIX_M) || (n < 1) || (y > MAX_MMATRIX_N)) return 0.0; 00040 00041 return mat[m][n]; 00042 }; 00043 00044 MMatrix MMatrix::trans () { 00045 MMatrix tmp(dimN, dimM); 00046 00047 for (int x = 1; x <= dimN; x++) { 00048 for (int y = 1; y <= dimM; y++) { 00049 tmp.set (x, y, mat[y][x]); 00050 }; 00051 }; 00052 00053 return tmp; 00054 }; 00055 00056 MMatrix MMatrix::operator+ (MMatrix m) { 00057 MMatrix tmp(dimM, dimN); 00058 00059 if ((m.getN () != dimN) || (m.getM () != dimM)) return tmp; 00060 00061 for (int x = 1; x <= dimM; x ++) { 00062 for (int y = 1; y <= dimN; y++) { 00063 tmp.set (x, y, (mat[x][y] + m.get (x, y))); 00064 }; 00065 }; 00066 00067 return tmp; 00068 }; 00069 00070 MMatrix MMatrix::operator- (MMatrix m) { 00071 MMatrix tmp(dimM, dimN); 00072 00073 if ((m.getN () != dimN) || (m.getM () != dimM)) return tmp; 00074 00075 for (int x = 1; x <= dimM; x ++) { 00076 for (int y = 1; y <= dimN; y++) { 00077 tmp.set (x, y, (mat[x][y] - m.get (x, y))); 00078 }; 00079 }; 00080 00081 return tmp; 00082 }; 00083 00084 MMatrix MMatrix::operator* (MMatrix m) { 00085 MMatrix tmp(m.getN (), dimM); 00086 float f; 00087 00088 if (dimN != m.getM ()) return tmp; 00089 00090 for (int x = 1; x <= m.getM (); x ++) { 00091 for (int y = 1; y <= dimN; y++) { 00092 f = 0; 00093 for (int z = 1; z <= dimM; z++) { 00094 f += mat[z][y] * m.get (x, z); 00095 }; 00096 00097 tmp.set (x, y, f); 00098 }; 00099 }; 00100 00101 return tmp; 00102 }; 00103 00104 MMatrix MMatrix::operator* (float f) { 00105 MMatrix tmp(dimM, dimN); 00106 00107 for (int x = 1; x <= dimM; x ++) { 00108 for (int y = 1; y <= dimN; y++) { 00109 tmp.set (x, y, (mat[x][y] * f)); 00110 }; 00111 }; 00112 00113 return tmp; 00114 }; 00115 00116 void MMatrix::operator= (Vector v) { 00117 dimM = 1; 00118 dimN = 3; 00119 00120 mat[1][1] = v.x; 00121 mat[2][1] = v.y; 00122 mat[3][1] = v.z; 00123 }; 00124 00125 MMatrix MMatrix::homogen () { 00126 if ((dimN < MAX_MMATRIX_N) && (dimM < MAX_MMATRIX_M)) { 00127 MMatrix tmp (dimM + 1, dimN + 1); 00128 00129 for (int x = 1; x <= dimM; x++) { 00130 for (int y = 1; y <= dimN; y++) { 00131 tmp.set (x, y, mat[x][y]); 00132 }; 00133 }; 00134 00135 tmp.set (dimM +1, dimN +1, 1); 00136 return tmp; 00137 } else { 00138 MMatrix tmp; 00139 return tmp; 00140 }; 00141 }; 00142 00143 MMatrix MMatrix::reduce () { 00144 if ((dimM > 1) && (dimN > 1)) { 00145 MMatrix tmp (dimM - 1, dimN - 1); 00146 00147 for (int x = 1; x < dimM; x++) { 00148 for (int y = 1; y < dimN; y++) { 00149 tmp.set (x, y, mat[x][y]); 00150 }; 00151 }; 00152 00153 return tmp; 00154 } else { 00155 MMatrix tmp; 00156 return tmp; 00157 }; 00158 };