1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- #pragma once
- #include <Mathematics/Math.h>
- #include <algorithm>
- #include <array>
- namespace WwiseGTE
- {
- template <typename Real>
- class SymmetricEigensolver2x2
- {
- public:
-
-
-
-
-
-
-
- void operator()(Real a00, Real a01, Real a11, int sortType,
- std::array<Real, 2>& eval, std::array<std::array<Real, 2>, 2>& evec) const
- {
-
-
- Real const zero = (Real)0, one = (Real)1, half = (Real)0.5;
- Real c2 = half * (a00 - a11), s2 = a01;
- Real maxAbsComp = std::max(std::fabs(c2), std::fabs(s2));
- if (maxAbsComp > zero)
- {
- c2 /= maxAbsComp;
- s2 /= maxAbsComp;
- Real length = std::sqrt(c2 * c2 + s2 * s2);
- c2 /= length;
- s2 /= length;
- if (c2 > zero)
- {
- c2 = -c2;
- s2 = -s2;
- }
- }
- else
- {
- c2 = -one;
- s2 = zero;
- }
- Real s = std::sqrt(half * (one - c2));
- Real c = half * s2 / s;
- Real diagonal[2];
- Real csqr = c * c, ssqr = s * s, mid = s2 * a01;
- diagonal[0] = csqr * a00 + mid + ssqr * a11;
- diagonal[1] = csqr * a11 - mid + ssqr * a00;
- if (sortType == 0 || sortType * diagonal[0] <= sortType * diagonal[1])
- {
- eval[0] = diagonal[0];
- eval[1] = diagonal[1];
- evec[0][0] = c;
- evec[0][1] = s;
- evec[1][0] = -s;
- evec[1][1] = c;
- }
- else
- {
- eval[0] = diagonal[1];
- eval[1] = diagonal[0];
- evec[0][0] = s;
- evec[0][1] = -c;
- evec[1][0] = c;
- evec[1][1] = s;
- }
- }
- };
- }
|