public static RAE XYZToRAE(XYZ xyz)
        {
            var r = xyz.Magnitude();
            var a = Atan2(xyz.Y, xyz.X);
            var e = Asin(-xyz.Z / r);

            var rae = new RAE()
            {
                R = r,
                A = a,
                E = e
            };

            return(rae);
        }
        public static RAE NEDToRAE(NED ned)
        {
            var r = ned.Magnitude();
            var a = Atan2(ned.E, ned.N);
            var e = Asin(-ned.D / r);

            var rae = new RAE()
            {
                R = r,
                A = a,
                E = e
            };

            return(rae);
        }
        public static XYZ RAEToXYZ(RAE rae)
        {
            var x = rae.R * Cos(rae.A) * Cos(rae.E);
            var y = rae.R * Sin(rae.A) * Cos(rae.E);
            var z = -rae.R * Sin(rae.E);

            var xyz = new XYZ()
            {
                X = x,
                Y = y,
                Z = z
            };

            return(xyz);
        }
        public static NED RAEToNED(RAE rae)
        {
            var x = rae.R * Cos(rae.A) * Cos(rae.E);
            var y = rae.R * Sin(rae.A) * Cos(rae.E);
            var z = -rae.R * Sin(rae.E);

            var ned = new NED()
            {
                N = x,
                E = y,
                D = z
            };

            return(ned);
        }