//gamma is useless but I keep it for simmetry //with Euler_direction void Euler_direction2angles(Matrix1D<DOUBLE> &v0, DOUBLE &alpha, DOUBLE &beta) { DOUBLE abs_ca, sb, cb; DOUBLE aux_alpha; DOUBLE aux_beta; DOUBLE error, newerror; Matrix1D<DOUBLE> v_aux; Matrix1D<DOUBLE> v; //if not normalized do it so v.resize(3); v = v0; v.selfNormalize(); v_aux.resize(3); cb = v(2); if (fabs((cb)) > 0.999847695)/*one degree */ { std::cerr << "\nWARNING: Routine Euler_direction2angles is not reliable\n" "for small tilt angles. Up to 0.001 deg it should be OK\n" "for most applications but you never know"; } if (fabs((cb - 1.)) < FLT_EPSILON) { alpha = 0.; beta = 0.; } else {/*1*/ aux_beta = acos(cb); /* beta between 0 and PI */ sb = sin(aux_beta); abs_ca = fabs(v(0)) / sb; if (fabs((abs_ca - 1.)) < FLT_EPSILON) aux_alpha = 0.; else aux_alpha = acos(abs_ca); v_aux(0) = sin(aux_beta) * cos(aux_alpha); v_aux(1) = sin(aux_beta) * sin(aux_alpha); v_aux(2) = cos(aux_beta); error = fabs(dotProduct(v, v_aux) - 1.); alpha = aux_alpha; beta = aux_beta; v_aux(0) = sin(aux_beta) * cos(-1. * aux_alpha); v_aux(1) = sin(aux_beta) * sin(-1. * aux_alpha); v_aux(2) = cos(aux_beta); newerror = fabs(dotProduct(v, v_aux) - 1.); if (error > newerror) { alpha = -1. * aux_alpha; beta = aux_beta; error = newerror; } v_aux(0) = sin(-aux_beta) * cos(-1. * aux_alpha); v_aux(1) = sin(-aux_beta) * sin(-1. * aux_alpha); v_aux(2) = cos(-aux_beta); newerror = fabs(dotProduct(v, v_aux) - 1.); if (error > newerror) { alpha = -1. * aux_alpha; beta = -1. * aux_beta; error = newerror; } v_aux(0) = sin(-aux_beta) * cos(aux_alpha); v_aux(1) = sin(-aux_beta) * sin(aux_alpha); v_aux(2) = cos(-aux_beta); newerror = fabs(dotProduct(v, v_aux) - 1.); if (error > newerror) { alpha = aux_alpha; beta = -1. * aux_beta; error = newerror; } }/*else 1 end*/ beta = RAD2DEG(beta); alpha = RAD2DEG(alpha); }/*Eulerdirection2angles end*/