2013-04-29 72 views
0

我正在寫一個程序,我必須旋轉o點。 但是在計算中的東西是不正確的。Sin,cos,弧度和旋轉

這是函數旋轉(Y軸):

point3 rotY(point3 a, float angle){ 
    float x,z; 
    z=a.z*cos(angle)-a.x*sin(angle); 
    x=a.z*sin(angle)+a.x*cos(angle); 
    a.z=z; 
    a.x=x; 
    return a; 
} 

這POINT3結構:

struct point3{ 
float x,y,z; 
point3(){ 
    x=y=z=0.0f; 
} 
point3(float a,float b,float c){ 
    x=a;y=b;z=c; 
} 
}; 

呼叫號碼:

point3 a(0.0f,l,0.0f); 
    a=rotX(a,S->angle*rad); 
    std::vector <point3> pocz(S->amount); 
    for(int i=0;i<S->amount;i++) 
     pocz[i]=rotY(a,(i*(360.0f/S->amount))*rad); 

(i*(360.0f/S->amount))*rad是旋轉作爲這個圖象enter image description here

我知道,expample時 a.x=0.0fa.y=2.36880779a.z=2.36880779,我想通過180度旋轉,它這個函數將返回 a.x=-2.07087751e-007a.y=2.36880779a.z=-2.36880779

但它應該返回a.x=0.0,a.y=2.36880779a.z=-2.36880779

這裏有什麼問題?

+0

你能不能給我們調用ROTY? – Vincent 2013-04-29 08:44:46

+3

如果你的意思是'-2.07087751e-007'和'0',那沒有什麼錯。浮點數的「sin」和「cos」不能產生精確的結果。 – kennytm 2013-04-29 08:45:28

+0

這只是浮點和雙精度數字的常規舍入誤差。 – Nomad101 2013-04-29 08:46:47

回答

3

這裏沒有錯:浮點運算是近似值(最多6位數)。 關於這個問題的更多信息:http://support.microsoft.com/kb/125056

如前所述通過juanchopanza,您可以切換到雙:http://en.wikipedia.org/wiki/Double-precision_floating-point_format

+0

如果以後會出現錯誤(當我用這個座標進行下一次轉換時)? – Antua 2013-04-29 08:48:30

+0

@Antua很好,這些小的差別會傳播並最終導致很大的錯誤。來處理這個問題,你可以先用'double'而不是'float'做所有事情 – juanchopanza 2013-04-29 08:49:57

+0

感謝你們所有的幫助 – Antua 2013-04-29 08:59:01