AS3 - Y Velocity 6.123031769111886E-17

时间:2011-09-15 06:42:41

标签: actionscript-3 math

当给定0,0到0.5时,y速度变为该数字并且破坏了我的代码。我知道我一定做错了,因为我只是复制和粘贴代码(因为我在数学上很可怕)..

这是我计算数字的方式:

var radian = Math.atan2(listOfNodes[j].y - listOfNodes[i].y,listOfNodes[j].x - listOfNodes[i].x);
var vy = Math.cos(radian);
var vx = Math.sin(radian);

由于

1 个答案:

答案 0 :(得分:5)

我假设速度矢量从0,0到0,5。 0,0是i,0,5是j。

在这种情况下,速度向量仅沿y而y分量应为5且x分量为0.它正好相反,因为,

cos(radian)应该是x速度分量,而sin(radian)是y compunent。

实际上返回的数字是6.123031769111886E-17而不是0。

请看下图:
enter image description here

从图中可以看出,根本不需要三角计算 您可以按如下方式获取x和y组件:

// y2 - y1
var vy = listOfNodes[j].y - listOfNodes[i].y;
// x2 - x1
var vx = listOfNodes[j].x - listOfNodes[i].x;

这样可以避免由于您看到的触发器而导致的浮点不准确6.123031769111886E-17而不是0。 如果您的代码中确实需要角度θ,则只需使用atan2

<强>更新 好吧,如果你只需要单位(标准化)向量的组件,你可以将vx和vy除以原始向量的长度。像这样:

// y2 - y1
var vy = listOfNodes[j].y - listOfNodes[i].y;
// x2 - x1
var vx = listOfNodes[j].x - listOfNodes[i].x;
// vector magnitude
var mag = Math.sqrt(vx * vx + vy * vy);

// get unit vector components
vy /= mag;
vx /= mag;

使用上述内容,您将获得与从trig sincos函数获得的结果完全相同的结果。

但是如果您仍然需要使用原始代码并想要使6.12 ... E-17与0比较,您可以使用epsilon技术来比较浮点数。所以你可以使用flllowing code:

比较epsilon范围内的任何值,从0开始
function floatCompare(a:Number, b:Number, epsilon:Number):Boolean{
    return (a >= (b - epsilon) && a <= (b + epsilon));
}
// To check for zero use this code, here i'm using 0.0001 as epsilon
if(floatCompare(vx, 0, 0.0001)){
    // code here
}

因此[b-epsilon, b+epsilon]范围内的任何偏差都会与b成功比较。这在浮点运算的情况下是必不可少的。