C++ C++;:围绕原点旋转点,但输出点在一定程度上不正确
第一次问。 我想在XY平面中用C++在3D中旋转一个点,并使用以下函数来完成任务。C++ C++;:围绕原点旋转点,但输出点在一定程度上不正确,c++,3d,rotation,C++,3d,Rotation,第一次问。 我想在XY平面中用C++在3D中旋转一个点,并使用以下函数来完成任务。 void rotateXY(双角度){ //将x、y和z坐标保存在单独的变量中 双x=此->位置[0];//值1 双y=此->位置[1];//值0 双z=此->位置[2];//值为0,但在xy旋转中它并不重要 双弧度=角度*M_PI/180; 此->位置[0]=cos(弧度)*x-正弦(弧度)*y; 这个->位置[1]=sin(弧度)*x+cos(弧度)*y; 此->位置[2]=1*z; }; 我从你那里得到了
void rotateXY(双角度){
//将x、y和z坐标保存在单独的变量中
双x=此->位置[0];//值1
双y=此->位置[1];//值0
双z=此->位置[2];//值为0,但在xy旋转中它并不重要
双弧度=角度*M_PI/180;
此->位置[0]=cos(弧度)*x-正弦(弧度)*y;
这个->位置[1]=sin(弧度)*x+cos(弧度)*y;
此->位置[2]=1*z;
};
我从你那里得到了矩阵
在这里,我直接操作点的坐标,因此使用this->pos[0]
如果我调用另一个名为rotateXYP的函数,首先从旋转点减去一个数学向量,然后在旋转后向其添加相同的数学向量,我会得到想要的结果
void rotateXYP(双角度,英语::点原点旋转){
这->子向量(旋转原点);
此->旋转(角度);
此->添加向量(旋转原点);
};
空心旋转(双角度){
//将x、y和z保存在单独的变量中以进行操作
双x=此->位置[0];//值1
双y=此->位置[1];//值0
双z=此->位置[2];//值为0,但在xy旋转中它并不重要
//从度转换为弧度,因为cmath需要它
双弧度=角度*M_PI/180;
//根据互联网上的旋转矩阵应用这些值
此->位置[0]=cos(弧度)*x-正弦(弧度)*y;
这个->位置[1]=sin(弧度)*x+cos(弧度)*y;
此->位置[2]=1*z;
};
我的问题
为什么我要用点(1 | 0 | 0)作为函数rotateXY(90)的输入,而后面的作为输出
(6.12323e-17|1|0)
而不是
(0|1|0)
如果我调用函数rotateXYP(90,某个点),我得到了正确的点,没有x坐标上的微小数字。
我怀疑这与以下代码行中的cos和sin有关:
this->pos[0] = cos(radian)*x - sin(radian)*y;
因为我对C++缺乏经验,所以我寻求答案,希望这不是一个坏问题。 < P>你的实现是正确的。这就是浮点运算的本质。所有数字都表示为近似值。平移点时,您可以获得更好的数值条件
我可以补充一点,这种效果将独立于所使用的编程语言和硬件而发生。我通过添加一个名为“精度”的变量来解决我的问题,该变量控制允许双精度小数位数
void rotateXY(double angle){
//Accuracy: a is the number of decimal places
int a = 2;
int acc = pow(10,a);
//save x,y and z in seperate variables for manipulation
double x = this->pos[0]; // value 1
double y = this->pos[1]; // value 0
double z = this->pos[2]; // value 0, but in the xy rotation it is not important
//convert from degrees to radians because cmath requires it
double radian = angle*M_PI/180;
//apply the values according to a rotation matrix found on the internet
this->pos[0] = round((cos(radian)*x - sin(radian)*y)*acc)/acc;
this->pos[1] = round((sin(radian)*x + cos(radian)*y)*acc)/acc;
this->pos[2] = round((1*z)*acc)/acc;
};
为什么我要用点(1 | 0 | 0)作为函数rotateXY(90)的输入,而后面的作为输出。sin()和cos()自然地与Pi(甚至不是有理数)相关,并在数学库中用。impl。这必然是浮点数的弱点。()实际上,
6.12323e-17
是一个非常小的数字(接近0)。恐怕你不得不接受它。(我也是。6.12323e-17
看起来有些眼熟。);-)最后一句话很重要-这不是一个可以消除的错误(在一般情况下)。当然,错误的大小可能会因实现和可变位深度的不同而有所不同。