aps*_*nce 1 math actionscript-3
当给定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);
Run Code Online (Sandbox Code Playgroud)
谢谢
我假设速度矢量是从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.
请看下图:

从图中可以看出,根本不需要三角计算.
您可以简单地获取x和y组件,如下所示:
// y2 - y1
var vy = listOfNodes[j].y - listOfNodes[i].y;
// x2 - x1
var vx = listOfNodes[j].x - listOfNodes[i].x;
Run Code Online (Sandbox Code Playgroud)
这将避免因TRIG finctions浮点不精确,由于您所看到的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;
Run Code Online (Sandbox Code Playgroud)
使用上面的内容,您将获得与从trig sin和cos函数获得的结果完全相同的结果.
但是如果您仍然需要使用原始代码并想要将6.12 ... E-17与0进行比较,则可以使用epsilon技术来比较浮点数.所以你可以使用flllowing代码比较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
}
Run Code Online (Sandbox Code Playgroud)
因此,范围内的任何偏差[b-epsilon, b+epsilon]都会成功地与b进行比较.这在浮点运算的情况下是必不可少的.