AngleConstants.cs 5.32 KB
namespace Rcs.Domain.ValueObjects
{
    /// <summary>
    /// 角度常量与工具方法 - 使用弧度(以 π 为单位)表示角度
    /// </summary>
    public static class AngleConstants
    {
        /// <summary>
        /// 0 度(0 弧度)
        /// </summary>
        public const double Zero = 0.0;

        /// <summary>
        /// 15 度(π/12 弧度)- VDA5050 默认角度偏移
        /// </summary>
        public const double Degrees15 = Math.PI / 12;
        /// <summary>
        /// 允许的最大角度偏差(弧度)
        /// </summary>
        public const double AllowedDeviationTheta = Math.PI / 12;

        /// <summary>
        /// 取放货点位偏差弧度
        /// </summary>
        public const double EndDeviationTheta = Math.PI / 36;

        /// <summary>
        /// 30 度(π/6 弧度)
        /// </summary>
        public const double Degrees30 = Math.PI / 6;

        /// <summary>
        /// 45 度(π/4 弧度)
        /// </summary>
        public const double Degrees45 = Math.PI / 4;

        /// <summary>
        /// 60 度(π/3 弧度)
        /// </summary>
        public const double Degrees60 = Math.PI / 3;

        /// <summary>
        /// 90 度(π/2 弧度)
        /// </summary>
        public const double Degrees90 = Math.PI / 2;

        /// <summary>
        /// 120 度(2π/3 弧度)
        /// </summary>
        public const double Degrees120 = 2 * Math.PI / 3;

        /// <summary>
        /// 135 度(3π/4 弧度)
        /// </summary>
        public const double Degrees135 = 3 * Math.PI / 4;

        /// <summary>
        /// 150 度(5π/6 弧度)
        /// </summary>
        public const double Degrees150 = 5 * Math.PI / 6;

        /// <summary>
        /// 180 度(π 弧度)
        /// </summary>
        public const double Degrees180 = Math.PI;

        /// <summary>
        /// 360 度(2π 弧度)
        /// </summary>
        public const double Degrees360 = 2 * Math.PI;

        /// <summary>
        /// 整圆(2π 弧度)
        /// </summary>
        public const double FullCircle = 2 * Math.PI;

        /// <summary>
        /// 15 度(π/12 弧度)的常量(可用于组合负角)
        /// </summary>
        public const double MDegrees15 = Math.PI / 12;

        /// <summary>
        /// 30 度(π/6 弧度)的常量(可用于组合负角)
        /// </summary>
        public const double MDegrees30 = Math.PI / 6;

        /// <summary>
        /// 45 度(π/4 弧度)的常量(可用于组合负角)
        /// </summary>
        public const double MDegrees45 = Math.PI / 4;

        /// <summary>
        /// 60 度(π/3 弧度)的常量(可用于组合负角)
        /// </summary>
        public const double MDegrees60 = Math.PI / 3;

        /// <summary>
        /// 90 度(π/2 弧度)的常量(可用于组合负角)
        /// </summary>
        public const double MDegrees90 = Math.PI / 2;

        /// <summary>
        /// 120 度(2π/3 弧度)的常量(可用于组合负角)
        /// </summary>
        public const double MDegrees120 = 2 * Math.PI / 3;

        /// <summary>
        /// 135 度(3π/4 弧度)的常量(可用于组合负角)
        /// </summary>
        public const double MDegrees135 = 3 * Math.PI / 4;

        /// <summary>
        /// 150 度(5π/6 弧度)的常量(可用于组合负角)
        /// </summary>
        public const double MDegrees150 = 5 * Math.PI / 6;
        public static double ToRadians(double degrees)
        {
            var radians = degrees * Math.PI / 180.0;
            return NormalizeAngleSymmetric(radians);
        }

        /// <summary>
        /// 将弧度转换为角度
        /// </summary>
        /// <param name="radians">弧度值</param>
        /// <returns>角度</returns>
        public static double ToDegrees(double radians)
        {
            return radians * 180.0 / Math.PI;
        }

        /// <summary>
        /// 将角度标准化到 [0, 2π) 范围
        /// </summary>
        /// <param name="angle">角度(弧度)</param>
        /// <returns>标准化后的角度</returns>
        public static double NormalizeAngle(double angle)
        {
            while (angle < 0)
                angle += FullCircle;
            while (angle >= FullCircle)
                angle -= FullCircle;
            return angle;
        }

        /// <summary>
        /// 将角度标准化到 [-π, π] 范围
        /// </summary>
        /// <param name="angle">角度(弧度)</param>
        /// <returns>标准化后的角度</returns>
        public static double NormalizeAngleSymmetric(double angle)
        {
            angle = NormalizeAngle(angle);
            if (angle > Math.PI)
                angle -= FullCircle;
            return angle;
        }

        /// <summary>
        /// 计算两个角度之间的最小差值(绝对值)
        /// </summary>
        /// <param name="angle1">第一个角度(弧度)</param>
        /// <param name="angle2">第二个角度(弧度)</param>
        /// <returns>最小角度差(弧度)</returns>
        public static double AngleDifference(double angle1, double angle2)
        {
            double diff = NormalizeAngleSymmetric(angle2 - angle1);
            return Math.Abs(diff);
        }
    }
}