- float Inverse(CLAYMATRIX& mOut, const CLAYMATRIX& rhs)
- {
- CLAYMATRIX m(rhs);
- DWORD is[4];
- DWORD js[4];
- float fDet = 1.0f;
- int f = 1;
- for (int k = 0; k < 4; k ++)
- { float fMax = 0.0f;
- for (DWORD i = k; i < 4; i ++)
- {
- for (DWORD j = k; j < 4; j ++)
- {
- const float f = Abs(m(i, j));
- if (f > fMax)
- {
- fMax = f;
- is[k] = i;
- js[k] = j;
- }
- }
- }
- if (Abs(fMax) < 0.0001f)
- return 0;
- if (is[k] != k)
- {
- f = -f;
- swap(m(k, 0), m(is[k], 0));
- swap(m(k, 1), m(is[k], 1));
- swap(m(k, 2), m(is[k], 2));
- swap(m(k, 3), m(is[k], 3));
- }
- if (js[k] != k)
- {
- f = -f;
- swap(m(0, k), m(0, js[k]));
- swap(m(1, k), m(1, js[k]));
- swap(m(2, k), m(2, js[k]));
- swap(m(3, k), m(3, js[k]));
- }
- fDet *= m(k, k);
- m(k, k) = 1.0f / m(k, k);
- for (DWORD j = 0; j < 4; j ++)
- {
- if (j != k)
- m(k, j) *= m(k, k);
- }
- for (DWORD i = 0; i < 4; i ++)
- {
- if (i != k)
- {
- for (j = 0; j < 4; j ++)
- {
- if (j != k)
- m(i, j) = m(i, j) - m(i, k) * m(k, j);
- }
- }
- }
- for (i = 0; i < 4; i ++)
- {
- if (i != k)
- m(i, k) *= -m(k, k);
- }
- }
- }
- for (k = 3; k >= 0; k --)
- {
- if (js[k] != k)
- {
- swap(m(k, 0), m(js[k], 0));
- swap(m(k, 1), m(js[k], 1));
- swap(m(k, 2), m(js[k], 2));
- swap(m(k, 3), m(js[k], 3));
- }
- if (is[k] != k)
- {
- swap(m(0, k), m(0, is[k]));
- swap(m(1, k), m(1, is[k]));
- swap(m(2, k), m(2, is[k]));
- swap(m(3, k), m(3, is[k]));
- }
- }
- mOut = m;
- return fDet * f;
- }
复制代码 |