Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:围绕原点旋转点,但输出点在一定程度上不正确_C++_3d_Rotation - Fatal编程技术网

C++ C++;:围绕原点旋转点,但输出点在一定程度上不正确

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; }; 我从你那里得到了

第一次问。 我想在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;
};
我从你那里得到了矩阵

在这里,我直接操作点的坐标,因此使用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
看起来有些眼熟。);-)最后一句话很重要-这不是一个可以消除的错误(在一般情况下)。当然,错误的大小可能会因实现和可变位深度的不同而有所不同。