我在JavaScript中苦苦挣扎,但这个问题也适用于许多其他语言/环境。
我想让一个物体朝另一个物体的位置旋转,我使用:
atan2(obj1.dy, obj1.dx) - obj2.getRotation()
检查第二个物体是否应在给定时间顺时针或逆时针旋转。
在我正在使用的JS / HTML5 / Canvas编程环境的KineticJS中,角度以0到2 pi的弧度指定,从正Y轴开始顺时针方向。在许多其他编程环境中也可以看到这种行为。
然而,当使用 Math.atan2(y,x)函数计算第二个物体的移动角度时,角度从-pi到pi指定,从正X轴开始,逆时针走。
澄清:
问题:
如何根据atan2()函数的结果计算正常弧度的角度?
答案 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>