如何使用atan2在线计算第三点?

时间:2011-05-09 20:47:39

标签: actionscript-3 atan2

我正在尝试将一些位图设置为与中心点相关的动画。它们并非都是从那个中心点开始,但是我希望它们飞出来,好像来自该中心点的力猛击它们并将它们径向向外推,这样它们就会完全飞离舞台。

所以:我知道中心点,以及围绕它排列的每个位图的x和y位置。对于每一个,我可以从中心到x,y点画一条线。然后我应该能够将该线形成的角度设置为水平,然后在该线上设置更远的目标点。位图将被补发到那一点。我相信这就是Math.atan2的用途。

这是我在迭代位图数组时得到的东西(我是一个对象):

var angle:Number = Math.atan2(i.bitmap.y - centerY, i.bitmap.x - centerX) * 180 / Math.PI;
var dist:Number = 200;              //arbitrary number, just to test
 destX = centerX  + dist * Math.cos(angle);  //destination x
 destY = centerY  + dist * Math.sin(angle);  //destination y

这些东西不是径向滑出,而是跳来跳去。

我无法理解atan2以及我做错了什么。

谢谢,

大卫

4 个答案:

答案 0 :(得分:1)

只使用矢量运算,您可以在没有三角函数的情况下实现相同的效果:

var dist:Number = 200;              //arbitrary number, just to test
var dx:Number = i.bitmap.x - centerX;
var dy:Number = i.bitmap.y - centerY;
var length:Number = Math.sqrt( dx*dx + dy*dy );
var normalizeddx:Number = dx / length;
var normalizeddy:Number = dy / length;
 destX = centerX  + dist * normalizeddx;  //destination x
 destY = centerY  + dist * normalizeddy;  //destination y

这应该比使用三角函数快得多。我不知道actionscript的语言细节,所以可能会更多地优化它。

答案 1 :(得分:0)

atan2可以在这种情况下工作,我想但我只会使用atan:

var angle:Number = Math.atan((i.bitmap.y - centerY)/(i.bitmap.x - centerX));

此外:

我刚刚在另一个看起来像你想要的论坛上看到的代码(与你最初写的东西只有一点点差异)

var angle:Number = Math.atan2(mouseX,mouseY-180)-Math.PI/2;
var xNew:Number = 20*Math.cos(angle);
var yNew:Number = -20*Math.sin(angle);

答案 2 :(得分:0)

尝试移除* 180 / PI以保持角度为弧度。

var angle:Number = Math.atan2(i.bitmap.y-centerY, i.bitmap.x - centerX);

然后将destX和destY更改为

destX = i.bitmap.x  + dist * Math.cos(angle);
destY = i.bitmap.y  + dist * Math.sin(angle);

答案 3 :(得分:0)

你必须摆脱* 180 / Math.PI部分。角度必须是弧度。所以第一行看起来像是 var angle:Number = Math.atan2(i.bitmap.y - centerY, i.bitmap.x - centerX); 其余的应该没问题。