【问题标题】:Convert standard 360-degree to atan2将标准 360 度转换为 atan2
【发布时间】:2016-09-12 06:54:36
【问题描述】:

我需要将标准 360 角的计算反向到 atan2。

这是我的标准角度计算

Standard angle =  (int) Math.toDegrees(Math.atan2(y,x));

if(angle < 0)
  angle += 360;

我需要从角度如何实现 Math.atan2 值。

【问题讨论】:

  • 你想要什么结果?范围内的两个坐标或角度 -Pi..Pi?
  • 需要范围内的角度。
  • "need angle in range":这句话就是。
  • 这是什么编程语言?这是Java吗?请用使用的语言标记您的问题。要更新您的问题,请单击帖子下方的“edit”链接。谢谢。

标签: math angle degrees radians atan2


【解决方案1】:

将度数范围0..360转换为弧度范围-Pi..Pi:

if(angle > 180)
   angle -= 360;
angle_radians = Math.toRadians(angle);

如果您的角度可能超出标准范围(您没有提到这一点),请使用整数模而不是循环

angle = angle % 360 

(检查模运算符如何处理您的语言中的负数)

【讨论】:

    【解决方案2】:

    虽然你的问题不是很清楚,但好像是要检索语句前的角度

    if (angle < 0)
      angle += 360;
    

    由于atan2 返回范围[-π,π) 中的值,即[-180°,180°),子范围[-180°,0°) 映射到[180°,360°)。然后你倒置

    if (angle >= 180°)
      angle-= 360;
    

    您还需要转换回弧度。

    【讨论】:

      【解决方案3】:

      O(1) 性能的一般解决方案:

      double generalModulus(double value, double modulus, double offset) {
          return value - Math.floor((value-offset)/modulus) * modulus + offset;
      }
      
      double normalizeAngleDegrees(double angleInDegrees, double offset) {
          return generalModulus(angleInDegrees, 360.0, offset);
      }
      
      double normalizeAngleRadians(double angleInRadians, double offset) {
          return generalModulus(angleInRadians, 2.0*Math.PI, offset);
      }
      

      使用方法:

      double normDeg = normalizeAngleDegrees(angle, -180); // produces angle in range [-180, 180)
      double normRad = normalizeAngleRadians(angle, 0); // produces angle in range [0, 2*Pi)
      

      【讨论】:

        【解决方案4】:

        我自己的答案

        int normalizeAngle(int angle)
        {
            int newAngle = angle;
            while (newAngle <= -180) newAngle += 360;
            while (newAngle > 180) newAngle -= 360;
            return newAngle;
        }
        

        【讨论】:

        • 看看我的加法
        猜你喜欢
        • 2010-11-21
        • 1970-01-01
        • 1970-01-01
        • 2011-07-30
        • 2022-11-16
        • 2021-04-19
        • 1970-01-01
        • 2019-01-22
        • 2014-09-14
        相关资源
        最近更新 更多