【问题标题】:Reflecting Angles in the Y AxisY 轴上的反射角
【发布时间】:2010-12-30 19:20:20
【问题描述】:

我目前正在使用“Pi - 角度”在 Y 轴上反映一个角度。我使用的角度系统是弧度,0 是东,-Pi/2 是北,Pi/2 是南,+/- Pi 是西,当我尝试使用上述方法来反映一个角度时,它经常返回高于 Pi 的值,超出范围。我怎样才能防止这种情况发生?

谢谢,

DLiKS

【问题讨论】:

    标签: math trigonometry angle


    【解决方案1】:

    关于 x 轴的反射:只需使用 -angle

    关于 y 轴的反射:使用

       if (angle >= 0)
          return pi - angle
       else
          return -pi - angle
    

    这会在 0 处创建一个分支切割:3° 映射到 177°,而 -3° 映射到 -177°。 0 映射到 pi。 (如果您需要不包括 +pi 的 [-pi,pi) 区间中的角度,请将 ">=" 更改为 ">"。

    这也假设输入角度在 [-pi,pi] 范围内,正如您的问题陈述所暗示的那样。如果不是,您需要先使用对称模 2*pi(其中smod(x,M) = mod(x+M/2,M) - M/2)进行归一化。

    【讨论】:

    • 在你们投票之前,请检查我的数学;-) 之前的编辑不正确
    • 如果输入和输出角度归一化到 -pi 和 +pi 之间,则技术上是正确的。否则你是正确的。
    【解决方案2】:

    首先将初始角度除以 Pi。所以,在 C 语言中:

    angle = fmod(angle, 2*Pi);
    if (angle < -Pi)
        angle = angle + 2*Pi;
    
    float inverted = Pi - angle;
    

    问题是在进一步处理之前始终规范化您的输入。

    【讨论】:

    • 不正确。您需要考虑角度模 2*pi,而不是模 pi。
    • 我做了,但您可能想删除“C 语言”位,因为“%”是整数模运算符,而不是浮点运算符;改用 fmod()。
    【解决方案3】:

    因为整圆是 2*pi,所以你总是可以减去 2*pi 并让角度回到范围内。

    【讨论】:

      【解决方案4】:

      你到底为什么选择北方作为-Pi/2。它打破了所有默认的东西,比如单位圆上的 sin(angle) = y 坐标。

      但要回答您的问题,您可以将 k*2Pi 添加到所有角度(其中 k 是任何整数),角度将保持不变。

      【讨论】:

      • North 是 -Pi/2,因为我使用的坐标系统位于左上角 (0,0),并且角度是相对于 x 轴测量的。这是atan2返回的默认角度系统。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2020-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多