Пример #1
0
        public static double Atan2d(double y, double x)
        {
            // In order to minimize round-off errors, this function rearranges the
            // arguments so that result of atan2 is in the range [-pi/4, pi/4] before
            // converting it to degrees and mapping the result to the correct
            // quadrant.
            int q = 0;

            if (Math.Abs(y) > Math.Abs(x))
            {
                double t; t = x; x = y; y = t; q = 2;
            }
            if (x < 0)
            {
                x = -x; ++q;
            }
            // here x >= 0 and x >= abs(y), so angle is in [-pi/4, pi/4]
            double ang = GeoMath.ToDegrees(Math.Atan2(y, x));

            switch (q)
            {
            // Note that atan2d(-0.0, 1.0) will return -0.  However, we expect that
            // atan2d will not be called with y = -0.  If need be, include
            //
            //   case 0: ang = 0 + ang; break;
            //
            // and handle mpfr as in AngRound.
            case 1: ang = (y >= 0 ? 180 : -180) - ang; break;

            case 2: ang = 90 - ang; break;

            case 3: ang = -90 + ang; break;
            }
            return(ang);
        }