Sin,cos,弧度和旋转

Sin,cos,弧度和旋转

问题描述:

我正在写一个程序,我必须旋转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

这里没有错:浮点运算是近似值(最多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