1

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

所以:我知道中心点,以及围绕它排列的每个位图的 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

4 回答 4

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 的语言细节,所以可能这可以进一步优化。

于 2011-05-09T21:19:42.923 回答
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);
于 2011-05-09T21:10:23.967 回答
0

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

var 角度:数字 = 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);
于 2011-05-09T21:06:22.603 回答
0

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

于 2014-01-02T06:11:43.297 回答