有我假設速度矢量是從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.1
看在如下圖所返回的數字:
而且這可以從你不需要三角圖中可以看出計算。
你可以簡單地得到x和y分量如下:
// y2 - y1
var vy = listOfNodes[j].y - listOfNodes[i].y;
// x2 - x1
var vx = listOfNodes[j].x - listOfNodes[i].x;
這將避免因到期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;
使用上面你會得到完全相同的結果,當您從trig的sin
和cos
功能得到。
但是,如果您仍然需要使用原始代碼並且想要使6.12 ... E-17與0相比較,那麼您可以使用epsilon技術來比較浮點數。所以,你可以從0比較小量的範圍內的任何值,使用flllowing代碼:
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。這在浮點運算的情況下非常重要。
你能解釋一下這個數字如何破壞你的代碼嗎? –