AngleConverter.cs 2.04 KB
namespace Rcs.Shared.Utils
{
    /// <summary>
    /// 角度弧度转换工具类,支持多圈角度处理
    /// @author zzy
    /// </summary>
    public static class AngleConverter
    {
        /// <summary>
        /// 弧度转角度(支持多圈,保留完整圈数信息,四舍五入到整数)
        /// </summary>
        /// <param name="radians">弧度值</param>
        /// <returns>角度值(整数)</returns>
        public static double ToDegrees(double radians) => Math.Round(radians * (180.0 / Math.PI));

        /// <summary>
        /// 角度转弧度(支持多圈,保留完整圈数信息,精确到6位小数)
        /// </summary>
        /// <param name="degrees">角度值</param>
        /// <returns>弧度值(6位小数)</returns>
        public static double ToRadians(double degrees) => Math.Round(degrees * (Math.PI / 180.0), 6);

        /// <summary>
        /// 弧度转角度(可空类型)
        /// </summary>
        public static double? ToCycleDegrees(double? radians) => radians.HasValue ? NormalizeDegrees(ToDegrees(radians.Value)) : null;

        /// <summary>
        /// 角度转弧度(可空类型)
        /// </summary>
        public static double? ToCycleRadians(double? degrees) => degrees.HasValue ? NormalizeRadians(ToRadians(degrees.Value)) : null;

        /// <summary>
        /// 将弧度标准化到 [-π, π] 范围
        /// </summary>
        public static double NormalizeRadians(double radians)
        {
            var result = radians % (2 * Math.PI);
            if (result > Math.PI) result -= 2 * Math.PI;
            else if (result < -Math.PI) result += 2 * Math.PI;
            return result;
        }

        /// <summary>
        /// 将角度标准化到 [-180, 180] 范围
        /// </summary>
        public static double NormalizeDegrees(double degrees)
        {
            var result = degrees % 360.0;
            if (result > 180.0) result -= 360.0;
            else if (result < -180.0) result += 360.0;
            return result;
        }
    }
}