public static double[] matrixToEuler(DMatrixRMaj R , EulerType type , double[] euler ) {
		if( euler == null )
			euler = new double[3];

		switch(type){
			case ZYX:
				TanSinTan(-2,1,  3,  -6,9,  5,-7,4,8,  R,euler);
				break;

			case ZYZ:
				TanCosTan(8,-7,  9,   6,3,  5,-7,4,8,  R,euler);
				break;

			case ZXY:
				TanSinTan(4,5,  -6,   3,9,  1,8,-2,7,  R,euler);
				break;

			case ZXZ:
				TanCosTan(7,8,   9,  3,-6,  1,8,-2,7,  R,euler);
				break;

			case YXZ:
				TanSinTan(-7,9,  8, -2,5,  1,-6,3,4,   R,euler);
				break;

			case YXY:
				TanCosTan(4,-6,  5,  2,8,  1,-6,3,4,   R,euler);
				break;

			case YZX:
				TanSinTan(3,1,  -2,  8,5,  9,4,-7,6,   R,euler);
				break;

			case YZY:
				TanCosTan(6,4,   5,  8,-2, 9,4,-7,6,   R,euler);
				break;

			case XYZ:
				TanSinTan(8,9,  -7,  4,1,  5,3,-6,2,   R,euler);
				break;

			case XYX:
				TanCosTan(2,3,   1,  4,-7, 5,3,-6,2,   R,euler);
				break;

			case XZY:
				TanSinTan(-6,5,  4, -7,1,  9,-2,8,3,   R,euler);
				break;

			case XZX:
				TanCosTan(3,-2,  1,  7,4,  9,-2,8,3,   R,euler);
				break;

			default:
				throw new IllegalArgumentException("Unknown rotation sequence");
		}

		return euler;
	}
public static double[] matrixToEuler(DMatrixRMaj R , EulerType type , double[] euler ) {
		if( euler == null )
			euler = new double[3];

		switch(type){
			case ZYX:
				TanSinTan(-2,1,  3,  -6,9,  5,-7,4,8,  R,euler);
				break;

			case ZYZ:
				TanCosTan(8,-7,  9,   6,3,  5,-7,4,8,  R,euler);
				break;

			case ZXY:
				TanSinTan(4,5,  -6,   3,9,  1,8,-2,7,  R,euler);
				break;

			case ZXZ:
				TanCosTan(7,8,   9,  3,-6,  1,8,-2,7,  R,euler);
				break;

			case YXZ:
				TanSinTan(-7,9,  8, -2,5,  1,-6,3,4,   R,euler);
				break;

			case YXY:
				TanCosTan(4,-6,  5,  2,8,  1,-6,3,4,   R,euler);
				break;

			case YZX:
				TanSinTan(3,1,  -2,  8,5,  9,4,-7,6,   R,euler);
				break;

			case YZY:
				TanCosTan(6,4,   5,  8,-2, 9,4,-7,6,   R,euler);
				break;

			case XYZ:
				TanSinTan(8,9,  -7,  4,1,  5,3,-6,2,   R,euler);
				break;

			case XYX:
				TanCosTan(2,3,   1,  4,-7, 5,3,-6,2,   R,euler);
				break;

			case XZY:
				TanSinTan(-6,5,  4, -7,1,  9,-2,8,3,   R,euler);
				break;

			case XZX:
				TanCosTan(3,-2,  1,  7,4,  9,-2,8,3,   R,euler);
				break;

			default:
				throw new IllegalArgumentException("Unknown rotation sequence");
		}

		return euler;
	}
public static double [ ] matrixToEuler ( DMatrixRMaj R , EulerType type , double [ ] euler ) { if ( euler == null ) euler = new double [ 3 ] ; switch ( type ) { case ZYX : TanSinTan ( - 2 , 1 , 3 , - 6 , 9 , 5 , - 7 , 4 , 8 , R , euler ) ; break ; case ZYZ : TanCosTan ( 8 , - 7 , 9 , 6 , 3 , 5 , - 7 , 4 , 8 , R , euler ) ; break ; case ZXY : TanSinTan ( 4 , 5 , - 6 , 3 , 9 , 1 , 8 , - 2 , 7 , R , euler ) ; break ; case ZXZ : TanCosTan ( 7 , 8 , 9 , 3 , - 6 , 1 , 8 , - 2 , 7 , R , euler ) ; break ; case YXZ : TanSinTan ( - 7 , 9 , 8 , - 2 , 5 , 1 , - 6 , 3 , 4 , R , euler ) ; break ; case YXY : TanCosTan ( 4 , - 6 , 5 , 2 , 8 , 1 , - 6 , 3 , 4 , R , euler ) ; break ; case YZX : TanSinTan ( 3 , 1 , - 2 , 8 , 5 , 9 , 4 , - 7 , 6 , R , euler ) ; break ; case YZY : TanCosTan ( 6 , 4 , 5 , 8 , - 2 , 9 , 4 , - 7 , 6 , R , euler ) ; break ; case XYZ : TanSinTan ( 8 , 9 , - 7 , 4 , 1 , 5 , 3 , - 6 , 2 , R , euler ) ; break ; case XYX : TanCosTan ( 2 , 3 , 1 , 4 , - 7 , 5 , 3 , - 6 , 2 , R , euler ) ; break ; case XZY : TanSinTan ( - 6 , 5 , 4 , - 7 , 1 , 9 , - 2 , 8 , 3 , R , euler ) ; break ; case XZX : TanCosTan ( 3 , - 2 , 1 , 7 , 4 , 9 , - 2 , 8 , 3 , R , euler ) ; break ; default : throw new IllegalArgumentException ( "Unknown rotation sequence" ) ; } return euler ; }
<p>Converts a rotation matrix into an Euler angle of different types</p>

@param R (Input) Rotation matrix. Not modified.
@param type Type of Euler rotation
@param euler (Output) Optional storage for Euler rotation
@return The Euler rotation.
<p > Converts a rotation matrix into an Euler angle of different types< / p >