public float3 EigenValues()
{
// We compute det(M-lambda.I)=0
// With:
//
// | A B C |
// M= | D E F |
// | G H I |
//
// det(M-lambda.I) = det(M)
// + (GC+HF+DB - AI-EI-AE).lambda
// + (A + E + I).lambda^2
// + lambda^3
//
// That we solve for lambda...
//
float3x3 M = this;
double a = Determinant();
double b = M[COEFFS.G]*M[COEFFS.C] + M[COEFFS.H]*M[COEFFS.F] + M[COEFFS.D]*M[COEFFS.B] - M[COEFFS.A]*M[COEFFS.I] - M[COEFFS.E]*M[COEFFS.I] - M[COEFFS.A]*M[COEFFS.E];
double c = M[COEFFS.A] + M[COEFFS.E] + M[COEFFS.I];
double[] Roots = Functions.SolveCubic( a, b, c, 1 );
double Check0 = a + (Roots[0] * (b + Roots[0] * (c + Roots[0])));
double Check1 = a + (Roots[1] * (b + Roots[1] * (c + Roots[1])));
double Check2 = a + (Roots[2] * (b + Roots[2] * (c + Roots[2])));
return new float3( (float) Roots[0], (float) Roots[1], (float) Roots[2] );
}