Пример #1
0
	//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*/