void OpMatrixMatrix (TomVM& vm) { // Matrix * Matrix // Left matrix at reg2, right matrix at reg1 if (!ReadMatrix (vm, vm.Reg2 ().IntVal (), m1) || !ReadMatrix (vm, vm.Reg ().IntVal (), m2)) return; // Multiply them out vmReal result [16]; MatrixTimesMatrix (m1, m2, result); // Return as temporary matrix vm.Reg ().IntVal () = FillTempRealArray2D (vm.Data (), vm.DataTypes (), 4, 4, result); }
/*------------------------------------------------------------------------------------- * this function is rotation: vector v1 rotate to vector v0 needs the matrix * * [v1x,v1y,v1z]^T = M * [v0x,v0y,v0z]^T v0 is the target vector, v1 is the vector to be rotated. * ----------------------------------------------------------------------------------*/ void VectorRotation (double v0[3], double v1[3], double matrix[9]) { int i, j; double matrix0[3][3], matrix1[3][3], tmp0[9], tmp1[9], tmp[9]; RotateMatrix_z (v0[0], v0[1], v0[2], matrix0); RotateMatrix_z (v1[0], v1[1], v1[2], matrix1); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { tmp0[i * 3 + j] = matrix0[i][j]; tmp1[i * 3 + j] = matrix1[i][j]; } } i = 0; GaussInverse3 (tmp1, 10e-14, &i); /* if (i==0) { printf("the matrix is singular\n"); exit(0); } */ MatrixTimesMatrix (tmp0, tmp1, tmp, 3, 3, 3); for (i = 0; i < 3; i++) { for (j = 0; j < 3; j++) { matrix[i * 3 + j] = tmp[j * 3 + i]; } } }