MATR MatrInverse( MATR M ) { MATR r; DBL det = MatrDeterm(M); INT i, j; INT perm[4][3] = { {1, 2, 3}, {0, 2, 3}, {0, 1, 3}, {0, 1, 2} }; if (det == 0) return AS4_UnitMatrix; for (i = 0; i < 4; i++) for (j = 0; j < 4; j++) r.A[j][i] = MatrDeterm3x3( M.A[perm[i][0]][perm[j][0]], M.A[perm[i][0]][perm[j][1]], M.A[perm[i][0]][perm[j][2]], M.A[perm[i][1]][perm[j][0]], M.A[perm[i][1]][perm[j][1]], M.A[perm[i][1]][perm[j][2]], M.A[perm[i][2]][perm[j][0]], M.A[perm[i][2]][perm[j][1]], M.A[perm[i][2]][perm[j][2]]) / det; return r; }
/* Begin of 'WinMain' function */ INT WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, CHAR *CmdLine, INT ShowCmd ) { MATR m = {{ {2, 0, 0, 0}, {1, 2, 0, 0}, {1, 1, 2, 0}, {1, 1, 1, 2} }}; DBL g; m = MatrIdentity(); m = MatrTranslate(VecSet(1, 2, 3)); m = MatrScale(VecSet(1, 2, 3)); m = MatrRotateX(30); m = MatrRotateY(30); m = MatrRotateZ(30); m = MatrRotate(30, VecSet(1, 2, 3)); m = MatrMulMatr(MatrRotateX(90), MatrScale(VecSet(2, 2, 2))); m = MatrInverse(m); g = MatrDeterm(m); m = MatrTranspose(m); return 0; }/* Begin of 'WinMain' function */