void Legendre::SolveSytem(DMatrix &dMatrix, DArray &dArray) { double det; DArray dATmp = dArray; det = GetDeterminant(dMatrix); //cerr << "Determinant: " << det << endl; for(int i = 0; i < nn; ++i) { DMatrix dMTmp = dMatrix; for(int j = 0; j < nn; ++j) { dMTmp[j][i] = dATmp[j]; } dArray[i] = GetDeterminant(dMTmp) / det; //cerr << "Root " << i << ": " << dArray[i] << endl; } }
mat3 mat3::InvertMatrix() { const JFloat determinant = GetDeterminant(); mat3 inverse; if (determinant != JFloat(0.0)) { const JFloat inverseDeterminant = 1.0f / determinant; inverse.column0.x = inverseDeterminant * (column1.y * column2.z - column2.y * column1.z); inverse.column0.y = inverseDeterminant *-(column0.y * column2.z - column2.y * column0.z); inverse.column0.z = inverseDeterminant * (column0.y * column1.z - column0.z * column1.y); inverse.column1.x = inverseDeterminant *-(column1.x * column2.z - column1.z * column2.x); inverse.column1.y = inverseDeterminant * (column0.x * column2.z - column0.z * column2.x); inverse.column1.z = inverseDeterminant *-(column0.x * column1.z - column0.z * column1.x); inverse.column2.x = inverseDeterminant * (column1.x * column2.y - column1.y * column2.x); inverse.column2.y = inverseDeterminant *-(column0.x * column2.y - column0.y * column2.x); inverse.column2.z = inverseDeterminant * (column0.x * column1.y - column1.x * column0.y); return inverse; } else { return CreateIdentity(); } }
GfMatrix2f GfMatrix2f::GetInverse(double *detPtr, double eps) const { double det = GetDeterminant(); if (detPtr) { // CODE_COVERAGE_OFF_NO_REPORT This is inaccessible from script and not // worth writing a whole C++ test for. *detPtr = det; // CODE_COVERAGE_ON_NO_REPORT } GfMatrix2f inverse; if (GfAbs(det) > eps) { double rcp = 1.0 / det; inverse._mtx[0][0] = static_cast<float>(_mtx[1][1]*rcp); inverse._mtx[0][1] = static_cast<float>(_mtx[0][1]*-rcp); inverse._mtx[1][0] = static_cast<float>(_mtx[1][0]*-rcp); inverse._mtx[1][1] = static_cast<float>(_mtx[0][0]*rcp); } else { inverse.SetDiagonal(FLT_MAX); } return inverse; }
double GfMatrix3d::GetHandedness() const { // Note: This can be computed with fewer arithmetic operations using a // cross and dot product, but it is more important that the result // is consistent with the way the determinant is computed. return GfSgn(GetDeterminant()); }
Matrix Matrix::Inverse() { //transpose matrix Matrix Tran = Transpose(); //cofactors float *A = GetMatrix(); Matrix Cofactors((A[4]*A[8] - A[5]*A[7]), -(A[3]*A[8] - A[5]*A[6]), (A[3]*A[7] - A[4]*A[6]), -(A[1]*A[8] - A[2]*A[7]), (A[0]*A[8] - A[2]*A[6]), -(A[0]*A[7] - A[1]*A[6]), (A[1]*A[5] - A[2]*A[4]), -(A[0]*A[5] - A[2]*A[3]), (A[0]*A[4] - A[1]*A[3])); //find determinant float det1 = GetDeterminant(); //Scale by determinant to find inverse return Cofactors/det1; }
// // Invert // bool Mat2::Invert() { float Det = GetDeterminant(); if (Abs( Det ) < EPSILON) return false; std::swap( m[ 0 ][ 0 ], m[ 1 ][ 1 ] ); m[ 0 ][ 1 ] = -m[ 0 ][ 1 ]; m[ 1 ][ 0 ] = -m[ 1 ][ 0 ]; if (Abs( 1.0f - Det ) > EPSILON) { m[ 0 ] /= Det; m[ 1 ] /= Det; } return true; }
hsMatrix44* hsMatrix44::GetInverse(hsMatrix44* inverse) const { float det = GetDeterminant(); int i,j; if (det == 0.0f) { inverse->Reset(); return inverse; } det = hsInvert(det); GetAdjoint(inverse); for (i=0; i<4; i++) for (j=0; j<4; j++) inverse->fMap[i][j] *= det; return inverse; }
double Laplacian::GetDeterminant(int row /* = 0*/, BArray arr /* = BArray()*/) { int size = input_.size(); double sum = 0., mult = 1.; int new_row = row + 1; if(arr.empty()) { arr = empty_; } for(int i = 0; i < size; ++i) { if(!arr[i]) { if(new_row < size) { if(input_[row][i] != 0.) { BArray new_arr = arr; new_arr[i] = true; sum += (mult * input_[row][i] * GetDeterminant(new_row, new_arr)); } mult *= -1.; } else { return input_[row][i]; } } } return sum; }
float tmatrix::Inverse(bool affine) { float det = 0; if(affine) { det = GetDeterminant(); float s = 1 / det; float v00 = (m[1][1]*m[2][2] - m[1][2]*m[2][1]) * s; float v01 = (m[2][1]*m[0][2] - m[2][2]*m[0][1]) * s; float v02 = (m[0][1]*m[1][2] - m[0][2]*m[1][1]) * s; float v10 = (m[1][2]*m[2][0] - m[1][0]*m[2][2]) * s; float v11 = (m[2][2]*m[0][0] - m[2][0]*m[0][2]) * s; float v12 = (m[0][2]*m[1][0] - m[0][0]*m[1][2]) * s; float v20 = (m[1][0]*m[2][1] - m[1][1]*m[2][0]) * s; float v21 = (m[2][0]*m[0][1] - m[2][1]*m[0][0]) * s; float v22 = (m[0][0]*m[1][1] - m[0][1]*m[1][0]) * s; float v30 = -(v00*m[3][0] + v10*m[3][1] + v20*m[3][2]); float v31 = -(v01*m[3][0] + v11*m[3][1] + v21*m[3][2]); float v32 = -(v02*m[3][0] + v12*m[3][1] + v22*m[3][2]); m[0][0] = v00; m[0][1] = v01; m[0][2] = v02; m[1][0] = v10; m[1][1] = v11; m[1][2] = v12; m[2][0] = v20; m[2][1] = v21; m[2][2] = v22; m[3][0] = v30; m[3][1] = v31; m[3][2] = v32; } else { // transpose matrix float src[16]; for ( int i=0; i<4; ++i ) { src[i] = m16[i*4]; src[i + 4] = m16[i*4 + 1]; src[i + 8] = m16[i*4 + 2]; src[i + 12] = m16[i*4 + 3]; } // calculate pairs for first 8 elements (cofactors) float tmp[12]; // temp array for pairs tmp[0] = src[10] * src[15]; tmp[1] = src[11] * src[14]; tmp[2] = src[9] * src[15]; tmp[3] = src[11] * src[13]; tmp[4] = src[9] * src[14]; tmp[5] = src[10] * src[13]; tmp[6] = src[8] * src[15]; tmp[7] = src[11] * src[12]; tmp[8] = src[8] * src[14]; tmp[9] = src[10] * src[12]; tmp[10] = src[8] * src[13]; tmp[11] = src[9] * src[12]; // calculate first 8 elements (cofactors) m16[0] = (tmp[0] * src[5] + tmp[3] * src[6] + tmp[4] * src[7]) - (tmp[1] * src[5] + tmp[2] * src[6] + tmp[5] * src[7]); m16[1] = (tmp[1] * src[4] + tmp[6] * src[6] + tmp[9] * src[7]) - (tmp[0] * src[4] + tmp[7] * src[6] + tmp[8] * src[7]); m16[2] = (tmp[2] * src[4] + tmp[7] * src[5] + tmp[10] * src[7]) - (tmp[3] * src[4] + tmp[6] * src[5] + tmp[11] * src[7]); m16[3] = (tmp[5] * src[4] + tmp[8] * src[5] + tmp[11] * src[6]) - (tmp[4] * src[4] + tmp[9] * src[5] + tmp[10] * src[6]); m16[4] = (tmp[1] * src[1] + tmp[2] * src[2] + tmp[5] * src[3]) - (tmp[0] * src[1] + tmp[3] * src[2] + tmp[4] * src[3]); m16[5] = (tmp[0] * src[0] + tmp[7] * src[2] + tmp[8] * src[3]) - (tmp[1] * src[0] + tmp[6] * src[2] + tmp[9] * src[3]); m16[6] = (tmp[3] * src[0] + tmp[6] * src[1] + tmp[11] * src[3]) - (tmp[2] * src[0] + tmp[7] * src[1] + tmp[10] * src[3]); m16[7] = (tmp[4] * src[0] + tmp[9] * src[1] + tmp[10] * src[2]) - (tmp[5] * src[0] + tmp[8] * src[1] + tmp[11] * src[2]); // calculate pairs for second 8 elements (cofactors) tmp[0] = src[2] * src[7]; tmp[1] = src[3] * src[6]; tmp[2] = src[1] * src[7]; tmp[3] = src[3] * src[5]; tmp[4] = src[1] * src[6]; tmp[5] = src[2] * src[5]; tmp[6] = src[0] * src[7]; tmp[7] = src[3] * src[4]; tmp[8] = src[0] * src[6]; tmp[9] = src[2] * src[4]; tmp[10] = src[0] * src[5]; tmp[11] = src[1] * src[4]; // calculate second 8 elements (cofactors) m16[8] = (tmp[0] * src[13] + tmp[3] * src[14] + tmp[4] * src[15]) - (tmp[1] * src[13] + tmp[2] * src[14] + tmp[5] * src[15]); m16[9] = (tmp[1] * src[12] + tmp[6] * src[14] + tmp[9] * src[15]) - (tmp[0] * src[12] + tmp[7] * src[14] + tmp[8] * src[15]); m16[10] = (tmp[2] * src[12] + tmp[7] * src[13] + tmp[10] * src[15]) - (tmp[3] * src[12] + tmp[6] * src[13] + tmp[11] * src[15]); m16[11] = (tmp[5] * src[12] + tmp[8] * src[13] + tmp[11] * src[14]) - (tmp[4] * src[12] + tmp[9] * src[13] + tmp[10] * src[14]); m16[12] = (tmp[2] * src[10] + tmp[5] * src[11] + tmp[1] * src[9]) - (tmp[4] * src[11] + tmp[0] * src[9] + tmp[3] * src[10]); m16[13] = (tmp[8] * src[11] + tmp[0] * src[8] + tmp[7] * src[10]) - (tmp[6] * src[10] + tmp[9] * src[11] + tmp[1] * src[8]); m16[14] = (tmp[6] * src[9] + tmp[11] * src[11] + tmp[3] * src[8]) - (tmp[10] * src[11] + tmp[2] * src[8] + tmp[7] * src[9]); m16[15] = (tmp[10] * src[10] + tmp[4] * src[8] + tmp[9] * src[9]) - (tmp[8] * src[9] + tmp[11] * src[10] + tmp[5] * src[8]); // calculate determinant float det = src[0]*m16[0]+src[1]*m16[1]+src[2]*m16[2]+src[3]*m16[3]; // calculate matrix inverse float invdet = 1 / det; for ( int j=0; j<16; ++j ) { m16[j] *= invdet; } } return det; }
float tmatrix::Inverse(const tmatrix &srcMatrix, bool affine ) { float det = 0; if(affine) { det = GetDeterminant(); float s = 1 / det; m[0][0] = (srcMatrix.m[1][1]*srcMatrix.m[2][2] - srcMatrix.m[1][2]*srcMatrix.m[2][1]) * s; m[0][1] = (srcMatrix.m[2][1]*srcMatrix.m[0][2] - srcMatrix.m[2][2]*srcMatrix.m[0][1]) * s; m[0][2] = (srcMatrix.m[0][1]*srcMatrix.m[1][2] - srcMatrix.m[0][2]*srcMatrix.m[1][1]) * s; m[1][0] = (srcMatrix.m[1][2]*srcMatrix.m[2][0] - srcMatrix.m[1][0]*srcMatrix.m[2][2]) * s; m[1][1] = (srcMatrix.m[2][2]*srcMatrix.m[0][0] - srcMatrix.m[2][0]*srcMatrix.m[0][2]) * s; m[1][2] = (srcMatrix.m[0][2]*srcMatrix.m[1][0] - srcMatrix.m[0][0]*srcMatrix.m[1][2]) * s; m[2][0] = (srcMatrix.m[1][0]*srcMatrix.m[2][1] - srcMatrix.m[1][1]*srcMatrix.m[2][0]) * s; m[2][1] = (srcMatrix.m[2][0]*srcMatrix.m[0][1] - srcMatrix.m[2][1]*srcMatrix.m[0][0]) * s; m[2][2] = (srcMatrix.m[0][0]*srcMatrix.m[1][1] - srcMatrix.m[0][1]*srcMatrix.m[1][0]) * s; m[3][0] = -(m[0][0]*srcMatrix.m[3][0] + m[1][0]*srcMatrix.m[3][1] + m[2][0]*srcMatrix.m[3][2]); m[3][1] = -(m[0][1]*srcMatrix.m[3][0] + m[1][1]*srcMatrix.m[3][1] + m[2][1]*srcMatrix.m[3][2]); m[3][2] = -(m[0][2]*srcMatrix.m[3][0] + m[1][2]*srcMatrix.m[3][1] + m[2][2]*srcMatrix.m[3][2]); } else { // transpose matrix float src[16]; for ( int i=0; i<4; ++i ) { src[i] = srcMatrix.m16[i*4]; src[i + 4] = srcMatrix.m16[i*4 + 1]; src[i + 8] = srcMatrix.m16[i*4 + 2]; src[i + 12] = srcMatrix.m16[i*4 + 3]; } // calculate pairs for first 8 elements (cofactors) float tmp[12]; // temp array for pairs tmp[0] = src[10] * src[15]; tmp[1] = src[11] * src[14]; tmp[2] = src[9] * src[15]; tmp[3] = src[11] * src[13]; tmp[4] = src[9] * src[14]; tmp[5] = src[10] * src[13]; tmp[6] = src[8] * src[15]; tmp[7] = src[11] * src[12]; tmp[8] = src[8] * src[14]; tmp[9] = src[10] * src[12]; tmp[10] = src[8] * src[13]; tmp[11] = src[9] * src[12]; // calculate first 8 elements (cofactors) m16[0] = (tmp[0] * src[5] + tmp[3] * src[6] + tmp[4] * src[7]) - (tmp[1] * src[5] + tmp[2] * src[6] + tmp[5] * src[7]); m16[1] = (tmp[1] * src[4] + tmp[6] * src[6] + tmp[9] * src[7]) - (tmp[0] * src[4] + tmp[7] * src[6] + tmp[8] * src[7]); m16[2] = (tmp[2] * src[4] + tmp[7] * src[5] + tmp[10] * src[7]) - (tmp[3] * src[4] + tmp[6] * src[5] + tmp[11] * src[7]); m16[3] = (tmp[5] * src[4] + tmp[8] * src[5] + tmp[11] * src[6]) - (tmp[4] * src[4] + tmp[9] * src[5] + tmp[10] * src[6]); m16[4] = (tmp[1] * src[1] + tmp[2] * src[2] + tmp[5] * src[3]) - (tmp[0] * src[1] + tmp[3] * src[2] + tmp[4] * src[3]); m16[5] = (tmp[0] * src[0] + tmp[7] * src[2] + tmp[8] * src[3]) - (tmp[1] * src[0] + tmp[6] * src[2] + tmp[9] * src[3]); m16[6] = (tmp[3] * src[0] + tmp[6] * src[1] + tmp[11] * src[3]) - (tmp[2] * src[0] + tmp[7] * src[1] + tmp[10] * src[3]); m16[7] = (tmp[4] * src[0] + tmp[9] * src[1] + tmp[10] * src[2]) - (tmp[5] * src[0] + tmp[8] * src[1] + tmp[11] * src[2]); // calculate pairs for second 8 elements (cofactors) tmp[0] = src[2] * src[7]; tmp[1] = src[3] * src[6]; tmp[2] = src[1] * src[7]; tmp[3] = src[3] * src[5]; tmp[4] = src[1] * src[6]; tmp[5] = src[2] * src[5]; tmp[6] = src[0] * src[7]; tmp[7] = src[3] * src[4]; tmp[8] = src[0] * src[6]; tmp[9] = src[2] * src[4]; tmp[10] = src[0] * src[5]; tmp[11] = src[1] * src[4]; // calculate second 8 elements (cofactors) m16[8] = (tmp[0] * src[13] + tmp[3] * src[14] + tmp[4] * src[15]) - (tmp[1] * src[13] + tmp[2] * src[14] + tmp[5] * src[15]); m16[9] = (tmp[1] * src[12] + tmp[6] * src[14] + tmp[9] * src[15]) - (tmp[0] * src[12] + tmp[7] * src[14] + tmp[8] * src[15]); m16[10] = (tmp[2] * src[12] + tmp[7] * src[13] + tmp[10] * src[15]) - (tmp[3] * src[12] + tmp[6] * src[13] + tmp[11] * src[15]); m16[11] = (tmp[5] * src[12] + tmp[8] * src[13] + tmp[11] * src[14]) - (tmp[4] * src[12] + tmp[9] * src[13] + tmp[10] * src[14]); m16[12] = (tmp[2] * src[10] + tmp[5] * src[11] + tmp[1] * src[9]) - (tmp[4] * src[11] + tmp[0] * src[9] + tmp[3] * src[10]); m16[13] = (tmp[8] * src[11] + tmp[0] * src[8] + tmp[7] * src[10]) - (tmp[6] * src[10] + tmp[9] * src[11] + tmp[1] * src[8]); m16[14] = (tmp[6] * src[9] + tmp[11] * src[11] + tmp[3] * src[8]) - (tmp[10] * src[11] + tmp[2] * src[8] + tmp[7] * src[9]); m16[15] = (tmp[10] * src[10] + tmp[4] * src[8] + tmp[9] * src[9]) - (tmp[8] * src[9] + tmp[11] * src[10] + tmp[5] * src[8]); // calculate determinant float det = src[0]*m16[0]+src[1]*m16[1]+src[2]*m16[2]+src[3]*m16[3]; // calculate matrix inverse float invdet = 1 / det; for ( int j=0; j<16; ++j ) { m16[j] *= invdet; } } return det; }
JMatrix JMatrix::GetInverse() { /* 역행렬(Inverse Matrix) 어떤 행렬 A에 대하여 다음과 같은 성질을 만족하는 행렬 B를 일컫는다. AB = BA = I 성질 **역행렬을 가지는 행렬을 A라 하자. A는 가역행렬이다. AB = I 를 만족하는 정사각행렬 B가 존재함. Ax = 0의 해는 오직 x = 0일 뿐이다. Ax = b의 해가 임의의 b에 대해 유일하게 단 하나 존재한다. A^T * A의 행렬이 가역행렬이다.(A^T = A의 전치행렬, GetTranspose 함수 구현에서 자세히 설명한다) A의 행렬식은 0이 될 수 없다. A의 역행렬에 다시 역행렬을 취하면 자기자신이 됨. (kA)^-1 = k^-1 * A^-1 (k는 임의의 스칼라) 두 가역행렬의 곱 A * B는 가역행렬이다. (AB)^-1 = B^-1 * A^-1 역행렬 구하기 여기선 크래머의 법칙을 이용한다. 참고 : Streaming SIMD Extensions - Inverse of 4x4 Matrix (Intel.com) (http://download.intel.com/design/PentiumIII/sml/24504301.pdf) 우선 C로 구현후 나중에 SIMD 버전으로 구현해보자. **여인자 전개? 정사각행렬 A에서 i행과 j열을 제거하여 만든 부분행렬을 A(i | j) 라 하고 det A(i | j) = | A(i | j) |를 A(i,j)의 소행렬식이라 한다. 이 때 A'(i,j) = (-1)^(i+j) * | A(i | j) | 를 A(i,j)의 여인자라 한다. 구현 방법 1. 주어진 행렬의 전치행렬을 구한다. 2. 모든 행렬의 원소들의 여인자(cofactor)를 구한다. 이 여인자들로 이루어진 새로운 행렬로 연산을 계속 진행한다. 3. 2.에서 구한 행렬의 행렬식(determinant)을 구한다. 4. 2.에서 구한 행렬과 3.에서 구한 행렬식 값을 곱한다. */ JMatrix matCopy = *this; //행렬식이 0이면 역행렬은 정의되지 않는다. if (GetDeterminant() == 0.f) { matCopy.SetZero(); return matCopy; } //주어진 행렬의 전치행렬 구하기. matCopy = this->GetTranspose(); //주어진 행렬의 모든 원소들에 대한 여인자(cofactor)구하기 JMatrix result(false); float tmp[12]; //처음 두 행(m11 ~ m24)에 대한 여인자 구하기 tmp[0] = matCopy.item_arr[10] * matCopy.item_arr[15]; tmp[1] = matCopy.item_arr[11] * matCopy.item_arr[14]; tmp[2] = matCopy.item_arr[9] * matCopy.item_arr[15]; tmp[3] = matCopy.item_arr[11] * matCopy.item_arr[13]; tmp[4] = matCopy.item_arr[9] * matCopy.item_arr[14]; tmp[5] = matCopy.item_arr[10] * matCopy.item_arr[13]; tmp[6] = matCopy.item_arr[8] * matCopy.item_arr[15]; tmp[7] = matCopy.item_arr[11] * matCopy.item_arr[12]; tmp[8] = matCopy.item_arr[8] * matCopy.item_arr[14]; tmp[9] = matCopy.item_arr[10] * matCopy.item_arr[12]; tmp[10] = matCopy.item_arr[8] * matCopy.item_arr[13]; tmp[11] = matCopy.item_arr[9] * matCopy.item_arr[12]; result.item_arr[0] = tmp[0] * matCopy.item_arr[5] + tmp[3] * matCopy.item_arr[6] + tmp[4] * matCopy.item_arr[7]; result.item_arr[0] -= tmp[1] * matCopy.item_arr[5] + tmp[2] * matCopy.item_arr[6] + tmp[5] * matCopy.item_arr[7]; result.item_arr[1] = tmp[1] * matCopy.item_arr[4] + tmp[6] * matCopy.item_arr[6] + tmp[9] * matCopy.item_arr[7]; result.item_arr[1] -= tmp[0] * matCopy.item_arr[4] + tmp[7] * matCopy.item_arr[6] + tmp[8] * matCopy.item_arr[7]; result.item_arr[2] = tmp[2] * matCopy.item_arr[4] + tmp[7] * matCopy.item_arr[5] + tmp[10] * matCopy.item_arr[7]; result.item_arr[2] -= tmp[3] * matCopy.item_arr[4] + tmp[6] * matCopy.item_arr[5] + tmp[11] * matCopy.item_arr[7]; result.item_arr[3] = tmp[5] * matCopy.item_arr[4] + tmp[8] * matCopy.item_arr[5] + tmp[11] * matCopy.item_arr[6]; result.item_arr[3] -= tmp[4] * matCopy.item_arr[4] + tmp[9] * matCopy.item_arr[5] + tmp[10] * matCopy.item_arr[6]; result.item_arr[4] = tmp[1] * matCopy.item_arr[1] + tmp[2] * matCopy.item_arr[2] + tmp[5] * matCopy.item_arr[3]; result.item_arr[4] -= tmp[0] * matCopy.item_arr[1] + tmp[3] * matCopy.item_arr[2] + tmp[4] * matCopy.item_arr[3]; result.item_arr[5] = tmp[0] * matCopy.item_arr[0] + tmp[7] * matCopy.item_arr[2] + tmp[8] * matCopy.item_arr[3]; result.item_arr[5] -= tmp[1] * matCopy.item_arr[0] + tmp[6] * matCopy.item_arr[2] + tmp[9] * matCopy.item_arr[3]; result.item_arr[6] = tmp[3] * matCopy.item_arr[0] + tmp[6] * matCopy.item_arr[1] + tmp[11] * matCopy.item_arr[3]; result.item_arr[6] -= tmp[2] * matCopy.item_arr[0] + tmp[7] * matCopy.item_arr[1] + tmp[10] * matCopy.item_arr[3]; result.item_arr[7] = tmp[4] * matCopy.item_arr[0] + tmp[9] * matCopy.item_arr[1] + tmp[10] * matCopy.item_arr[2]; result.item_arr[7] -= tmp[5] * matCopy.item_arr[0] + tmp[8] * matCopy.item_arr[1] + tmp[11] * matCopy.item_arr[2]; //다음 두 행(m31 ~ m44)에 대한 여인자 구하기 tmp[0] = matCopy.item_arr[2] * matCopy.item_arr[7]; tmp[1] = matCopy.item_arr[3] * matCopy.item_arr[6]; tmp[2] = matCopy.item_arr[1] * matCopy.item_arr[7]; tmp[3] = matCopy.item_arr[3] * matCopy.item_arr[5]; tmp[4] = matCopy.item_arr[1] * matCopy.item_arr[6]; tmp[5] = matCopy.item_arr[2] * matCopy.item_arr[5]; tmp[6] = matCopy.item_arr[0] * matCopy.item_arr[7]; tmp[7] = matCopy.item_arr[3] * matCopy.item_arr[4]; tmp[8] = matCopy.item_arr[0] * matCopy.item_arr[6]; tmp[9] = matCopy.item_arr[2] * matCopy.item_arr[4]; tmp[10] = matCopy.item_arr[0] * matCopy.item_arr[5]; tmp[11] = matCopy.item_arr[1] * matCopy.item_arr[4]; result.item_arr[8] = tmp[0] * matCopy.item_arr[13] + tmp[3] * matCopy.item_arr[14] + tmp[4] * matCopy.item_arr[15]; result.item_arr[8] -= tmp[1] * matCopy.item_arr[13] + tmp[2] * matCopy.item_arr[14] + tmp[5] * matCopy.item_arr[15]; result.item_arr[9] = tmp[1] * matCopy.item_arr[12] + tmp[6] * matCopy.item_arr[14] + tmp[9] * matCopy.item_arr[15]; result.item_arr[9] -= tmp[0] * matCopy.item_arr[12] + tmp[7] * matCopy.item_arr[14] + tmp[8] * matCopy.item_arr[15]; result.item_arr[10] = tmp[2] * matCopy.item_arr[12] + tmp[7] * matCopy.item_arr[13] + tmp[10] * matCopy.item_arr[15]; result.item_arr[10] -= tmp[3] * matCopy.item_arr[12] + tmp[6] * matCopy.item_arr[13] + tmp[11] * matCopy.item_arr[15]; result.item_arr[11] = tmp[5] * matCopy.item_arr[12] + tmp[8] * matCopy.item_arr[13] + tmp[11] * matCopy.item_arr[14]; result.item_arr[11] -= tmp[4] * matCopy.item_arr[12] + tmp[9] * matCopy.item_arr[13] + tmp[10] * matCopy.item_arr[14]; result.item_arr[12] = tmp[2] * matCopy.item_arr[10] + tmp[5] * matCopy.item_arr[11] + tmp[1] * matCopy.item_arr[9]; result.item_arr[12] -= tmp[4] * matCopy.item_arr[11] + tmp[0] * matCopy.item_arr[9] + tmp[3] * matCopy.item_arr[10]; result.item_arr[13] = tmp[8] * matCopy.item_arr[11] + tmp[0] * matCopy.item_arr[8] + tmp[7] * matCopy.item_arr[10]; result.item_arr[13] -= tmp[6] * matCopy.item_arr[10] + tmp[9] * matCopy.item_arr[11] + tmp[1] * matCopy.item_arr[8]; result.item_arr[14] = tmp[6] * matCopy.item_arr[9] + tmp[11] * matCopy.item_arr[11] + tmp[3] * matCopy.item_arr[8]; result.item_arr[14] -= tmp[10] * matCopy.item_arr[11] + tmp[2] * matCopy.item_arr[8] + tmp[7] * matCopy.item_arr[9]; result.item_arr[15] = tmp[10] * matCopy.item_arr[10] + tmp[4] * matCopy.item_arr[8] + tmp[9] * matCopy.item_arr[9]; result.item_arr[15] -= tmp[8] * matCopy.item_arr[9] + tmp[11] * matCopy.item_arr[10] + tmp[5] * matCopy.item_arr[8]; //새로 만든 행렬의 행렬식 구하기 float det = matCopy.item_arr[0] * result.item_arr[0] + matCopy.item_arr[1] * result.item_arr[1] + matCopy.item_arr[2] * result.item_arr[2] + matCopy.item_arr[3] * result.item_arr[3]; //곱한다!! if (det == 0.0f) { result.SetZero(); return result; } det = 1.f / det; for (int k = 0; k < 16; ++k) result.item_arr[k] *= det; return result; }