public GtkGL.EulerRotation ToEulerRotation()
{
double heading;
double attitude;
double bank;
double magnitude = GetMagnitude(); // 1.0 if normalised, otherwise is correction factor
double test = x*y + z*w;
if (test > 0.499 * magnitude) { // singularity at north pole
heading = 2 * Math.Atan2(x,w);
attitude = Math.PI/2;
bank = 0;
Console.WriteLine("Eep! Singularity at north pole!");
return new GtkGL.EulerRotation(heading, attitude, bank);
}
if (test < -0.499 * magnitude) { // singularity at south pole
heading = -2 * Math.Atan2(x,w);
attitude = - Math.PI/2;
bank = 0;
Console.WriteLine("Eep! Singularity at south pole!");
return new GtkGL.EulerRotation(heading, attitude, bank);
}
heading = Math.Atan2(2*y*w-2*x*z , 1 - 2*y*y - 2*z*z);
attitude = Math.Asin(2*test/magnitude);
bank = Math.Atan2(2*x*w-2*y*z , 1 - 2*x*x - 2*z*z);
return new GtkGL.EulerRotation(heading, attitude, bank);
}