如何将atan2()与其他Radian角度系统结合使用

时间:2013-07-10 15:15:20

标签: math angle radians atan2

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

我想让一个物体朝另一个物体的位置旋转,我使用:

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

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

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

然而,当使用 Math.atan2(y,x)函数计算第二个物体的移动角度时,角度从-pi到pi指定,从正X轴开始,逆时针走。

澄清:

Difference between normal radians and atan2()

问题:

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

4 个答案:

答案 0 :(得分:3)

如果希望角度从y轴上的0顺时针增加,请将角度计算为atan2(x,y)。然而,这给出x <0的负角度,因此在这种情况下你应该加2 * pi。

答案 1 :(得分:2)

两种情况下的值相同,模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

答案 2 :(得分:1)

如果你的结果介于0和Pi之间,那么结果非常简单。如果你的结果在-Pi和0之间,那么在你的结果中添加2 * Pi,这样你就可以得到0,2 * Pi的结果。

当然,如果你要为这种类型的转换实现一个单独的函数,不要偶尔复制你的代码,那就太好了。

答案 3 :(得分:0)

只需使用条件

 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();
};
<canvas id="canvas" width="200px" height="200px" style="background-color: gold;"></canvas>