【问题标题】:How to use atan2() in combination with other Radian angle systems如何将 atan2() 与其他弧度角系统结合使用
【发布时间】:2013-07-10 15:15:20
【问题描述】:

我在 JavaScript 中遇到了这个问题,但这个问题也适用于许多其他语言/环境。

我想让一个对象向另一个对象的位置旋转,我使用:

atan2(obj1.dy, obj1.dx) - obj2.getRotation()

检查第二个对象是否应该在给定时间顺时针或逆时针旋转。

在我使用的 JS/HTML5/Canvas 编程环境 KineticJS 中,角度以弧度为单位指定,从 0 到 2 pi 从正 Y 轴开始顺时针方向。这种行为也出现在许多其他编程环境中。

但是,当使用 Math.atan2(y,x) 函数计算从第二个对象的移动角度时,角度指定为从 -pi 到 pi,从正 X 轴开始, 逆时针方向。

澄清一下:

问题:

如何根据 atan2() 函数的结果计算以正常弧度表示的角度?

【问题讨论】:

  • "在 Javascript/HTML5/Canvas(以及许多其他编程环境)中,角度以 0 到 2 pi 的弧度指定,从正 Y 轴开始,顺时针方向." 您确定这是语言指定的约定,而不是您自己的代码库指定的约定吗?上次我使用画布时,我假设弧度从正 X 轴开始并逆时针移动,一切都按我预期的方式工作。
  • 凯文,你可能是对的。事实上,我正在将 KineticJS 用于我当前的应用程序,它的行为方式与我所说的一样。我不确定如何在原始画布上下文中指定此约定。感谢您指出这一点,我会编辑它。

标签: math angle radians atan2


【解决方案1】:

这两种情况下的值是相同的,以 2*PI 为模,并针对不同的符号和偏移约定进行了调整。伪代码:

theta = 0.5*M_PI - atan2(y, x); // adjust for required sign/offset
theta = fmod(theta, 2.0*M_PI);  // make result modulo 2*PI

【讨论】:

  • 这似乎是正确的,但答案仍然是逆时针方向并旋转了 0.5pi rad
  • 错过了那部分,抱歉 - 现在已更新答案以涵盖此内容。
【解决方案2】:

如果您希望角度从 y 轴上的 0 顺时针增加,请将角度计算为 atan2(x,y)。然而,这会给出 x

【讨论】:

    【解决方案3】:

    如果您的结果介于 0 和 Pi 之间,那么结果非常简单。如果你的结果介于 -Pi 和 0 之间,则将 2*Pi 添加到你的结果中,这样你的结果就会在 0, 2*Pi 的区间内。

    当然,最好为这种类型的转换实现一个单独的函数,而不是时不时地复制代码。

    【讨论】:

      【解决方案4】:

      只要使用条件

       var radians = Math.atan2(e.y - cy, e.x - cx);
       if(radians < 0 ) {radians += 2*Math.PI;}
      

      var canvas = document.getElementById('canvas');
      var ctx = canvas.getContext("2d");
      canvas.onmousedown = function(e){
      var rect = canvas.getBoundingClientRect();
      var cx = rect.left + rect.width / 2, cy = rect.top + rect.height / 2;
      var radians = Math.atan2(e.y - cy, e.x - cx);
      if(radians < 0 ) {radians += 2*Math.PI;}
      ctx.moveTo(cx,cy);
      ctx.lineTo(cx + 100 * Math.cos(radians), cy + 100* Math.sin(radians));
      ctx.stroke();
      };
      &lt;canvas id="canvas" width="200px" height="200px" style="background-color: gold;"&gt;&lt;/canvas&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-01
        • 2018-10-01
        相关资源
        最近更新 更多