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
是旋转作为这个图象
我知道,expample时 a.x=0.0f
,a.y=2.36880779
和a.z=2.36880779
,我想通过180度旋转,它这个函数将返回 a.x=-2.07087751e-007
,a.y=2.36880779
和a.z=-2.36880779
。
但它应该返回a.x=0.0
,a.y=2.36880779
和a.z=-2.36880779
。
这里有什么问题?
这里没有错:浮点运算是近似值(最多6位数)。 关于这个问题的更多信息:http://support.microsoft.com/kb/125056
如前所述通过juanchopanza,您可以切换到双:http://en.wikipedia.org/wiki/Double-precision_floating-point_format
如果以后会出现错误(当我用这个坐标进行下一次转换时)? – Antua 2013-04-29 08:48:30
@Antua很好,这些小的差别会传播并最终导致很大的错误。来处理这个问题,你可以先用'double'而不是'float'做所有事情 – juanchopanza 2013-04-29 08:49:57
感谢你们所有的帮助 – Antua 2013-04-29 08:59:01
你能不能给我们调用ROTY? – Vincent 2013-04-29 08:44:46
如果你的意思是'-2.07087751e-007'和'0',那没有什么错。浮点数的“sin”和“cos”不能产生精确的结果。 – kennytm 2013-04-29 08:45:28
这只是浮点和双精度数字的常规舍入误差。 – Nomad101 2013-04-29 08:46:47