【问题标题】:How to calculate third point on line using atan2?如何使用atan2在线计算第三点?
【发布时间】:2011-05-09 20:47:38
【问题描述】:

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

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

这是我在遍历位图数组时得到的结果(i 是一个对象):

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 以及我做错了什么。

谢谢,

大卫

【问题讨论】:

标签: actionscript-3 atan2


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

【讨论】:

    【解决方案2】:

    尝试删除 *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);
    

    【讨论】:

    • 我不知道我是否应该添加一个新问题或什么,但是......当我使用这个时,我意识到将 dist 硬编码为负数是不好的.关键是这些东西应该从中心点动画出来。如果我们将中心点视为原点,那么如果位图的 x > centerX 那么它应该向右移动;如果 centerY 它应该向下移动,如果 y
    【解决方案3】:

    我想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);
    

    【讨论】:

    • 我认为你的意思是 Math.atan(... 我试过了,但还是有问题。他们在晃来晃去。如果你想让行为在所有四个象限(负和正,x 和 y)。
    • 另外我认为 atan2 的参数是 y,x 而不是 x,y
    【解决方案4】:

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

    【讨论】:

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