2011-09-15 20 views
1

當給定0,0到0,5時,y速度就成爲該數字並且破壞我的代碼。我知道我必須和做錯了什麼事,我只是複製粘貼代碼(因爲我在數學可怕)..AS3 - Y速度6.123031769111886E-17

我這是怎麼計算數字:

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

感謝

+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.1

看在如下圖所返回的數字:
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; 

這將避免因到期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的sincos功能得到。

但是,如果您仍然需要使用原始代碼並且想要使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。這在浮點運算的情況下非常重要。

+0

謝謝,但那不適用於我的情況,因爲我需要每一步都進行測試,以便我知道該行不會與另一個對象相交。有沒有辦法讓我得到0而不是那個數字? – apscience