Advertisement
phosphoer

Matrix Inverse

Jul 5th, 2011
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.03 KB | None | 0 0
  1. void Matrix4::Inverse( void )
  2. {
  3.   double det;
  4.   Matrix4 ret;
  5.   int i;
  6.   ret.m_elements[0] =   m_elements[5]*m_elements[10]*m_elements[15] - m_elements[5]*m_elements[11]*m_elements[14] - m_elements[9]*m_elements[6]*m_elements[15]
  7.   + m_elements[9]*m_elements[7]*m_elements[14] + m_elements[13]*m_elements[6]*m_elements[11] - m_elements[13]*m_elements[7]*m_elements[10];
  8.  
  9.   ret.m_elements[4] =  -m_elements[4]*m_elements[10]*m_elements[15] + m_elements[4]*m_elements[11]*m_elements[14] + m_elements[8]*m_elements[6]*m_elements[15]
  10.   - m_elements[8]*m_elements[7]*m_elements[14] - m_elements[12]*m_elements[6]*m_elements[11] + m_elements[12]*m_elements[7]*m_elements[10];
  11.  
  12.   ret.m_elements[8] =   m_elements[4]*m_elements[9]*m_elements[15] - m_elements[4]*m_elements[11]*m_elements[13] - m_elements[8]*m_elements[5]*m_elements[15]
  13.   + m_elements[8]*m_elements[7]*m_elements[13] + m_elements[12]*m_elements[5]*m_elements[11] - m_elements[12]*m_elements[7]*m_elements[9];
  14.  
  15.   ret.m_elements[12] = -m_elements[4]*m_elements[9]*m_elements[14] + m_elements[4]*m_elements[10]*m_elements[13] + m_elements[8]*m_elements[5]*m_elements[14]
  16.   - m_elements[8]*m_elements[6]*m_elements[13] - m_elements[12]*m_elements[5]*m_elements[10] + m_elements[12]*m_elements[6]*m_elements[9];
  17.  
  18.   ret.m_elements[1] =  -m_elements[1]*m_elements[10]*m_elements[15] + m_elements[1]*m_elements[11]*m_elements[14] + m_elements[9]*m_elements[2]*m_elements[15]
  19.   - m_elements[9]*m_elements[3]*m_elements[14] - m_elements[13]*m_elements[2]*m_elements[11] + m_elements[13]*m_elements[3]*m_elements[10];
  20.  
  21.   ret.m_elements[5] =   m_elements[0]*m_elements[10]*m_elements[15] - m_elements[0]*m_elements[11]*m_elements[14] - m_elements[8]*m_elements[2]*m_elements[15]
  22.   + m_elements[8]*m_elements[3]*m_elements[14] + m_elements[12]*m_elements[2]*m_elements[11] - m_elements[12]*m_elements[3]*m_elements[10];
  23.  
  24.   ret.m_elements[9] =  -m_elements[0]*m_elements[9]*m_elements[15] + m_elements[0]*m_elements[11]*m_elements[13] + m_elements[8]*m_elements[1]*m_elements[15]
  25.   - m_elements[8]*m_elements[3]*m_elements[13] - m_elements[12]*m_elements[1]*m_elements[11] + m_elements[12]*m_elements[3]*m_elements[9];
  26.  
  27.   ret.m_elements[13] =  m_elements[0]*m_elements[9]*m_elements[14] - m_elements[0]*m_elements[10]*m_elements[13] - m_elements[8]*m_elements[1]*m_elements[14]
  28.   + m_elements[8]*m_elements[2]*m_elements[13] + m_elements[12]*m_elements[1]*m_elements[10] - m_elements[12]*m_elements[2]*m_elements[9];
  29.  
  30.   ret.m_elements[2] =   m_elements[1]*m_elements[6]*m_elements[15] - m_elements[1]*m_elements[7]*m_elements[14] - m_elements[5]*m_elements[2]*m_elements[15]
  31.   + m_elements[5]*m_elements[3]*m_elements[14] + m_elements[13]*m_elements[2]*m_elements[7] - m_elements[13]*m_elements[3]*m_elements[6];
  32.  
  33.   ret.m_elements[6] =  -m_elements[0]*m_elements[6]*m_elements[15] + m_elements[0]*m_elements[7]*m_elements[14] + m_elements[4]*m_elements[2]*m_elements[15]
  34.   - m_elements[4]*m_elements[3]*m_elements[14] - m_elements[12]*m_elements[2]*m_elements[7] + m_elements[12]*m_elements[3]*m_elements[6];
  35.  
  36.   ret.m_elements[10] =  m_elements[0]*m_elements[5]*m_elements[15] - m_elements[0]*m_elements[7]*m_elements[13] - m_elements[4]*m_elements[1]*m_elements[15]
  37.   + m_elements[4]*m_elements[3]*m_elements[13] + m_elements[12]*m_elements[1]*m_elements[7] - m_elements[12]*m_elements[3]*m_elements[5];
  38.  
  39.   ret.m_elements[14] = -m_elements[0]*m_elements[5]*m_elements[14] + m_elements[0]*m_elements[6]*m_elements[13] + m_elements[4]*m_elements[1]*m_elements[14]
  40.   - m_elements[4]*m_elements[2]*m_elements[13] - m_elements[12]*m_elements[1]*m_elements[6] + m_elements[12]*m_elements[2]*m_elements[5];
  41.  
  42.   ret.m_elements[3] =  -m_elements[1]*m_elements[6]*m_elements[11] + m_elements[1]*m_elements[7]*m_elements[10] + m_elements[5]*m_elements[2]*m_elements[11]
  43.   - m_elements[5]*m_elements[3]*m_elements[10] - m_elements[9]*m_elements[2]*m_elements[7] + m_elements[9]*m_elements[3]*m_elements[6];
  44.  
  45.   ret.m_elements[7] =   m_elements[0]*m_elements[6]*m_elements[11] - m_elements[0]*m_elements[7]*m_elements[10] - m_elements[4]*m_elements[2]*m_elements[11]
  46.   + m_elements[4]*m_elements[3]*m_elements[10] + m_elements[8]*m_elements[2]*m_elements[7] - m_elements[8]*m_elements[3]*m_elements[6];
  47.  
  48.   ret.m_elements[11] = -m_elements[0]*m_elements[5]*m_elements[11] + m_elements[0]*m_elements[7]*m_elements[9] + m_elements[4]*m_elements[1]*m_elements[11]
  49.   - m_elements[4]*m_elements[3]*m_elements[9] - m_elements[8]*m_elements[1]*m_elements[7] + m_elements[8]*m_elements[3]*m_elements[5];
  50.  
  51.   ret.m_elements[15] =  m_elements[0]*m_elements[5]*m_elements[10] - m_elements[0]*m_elements[6]*m_elements[9] - m_elements[4]*m_elements[1]*m_elements[10]
  52.   + m_elements[4]*m_elements[2]*m_elements[9] + m_elements[8]*m_elements[1]*m_elements[6] - m_elements[8]*m_elements[2]*m_elements[5];
  53.  
  54.   det = m_elements[0]*ret.m_elements[0] + m_elements[1]*ret.m_elements[4] + m_elements[2]*ret.m_elements[8] + m_elements[3]*ret.m_elements[12];
  55.   if (det == 0)
  56.     return;
  57.  
  58.   det = 1.0 / det;
  59.  
  60.   for (i = 0; i < 16; i++)
  61.     m_elements[i] = float(ret.m_elements[i] * det);
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement