gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:05:43 25 4
gpt4 key购买 nike

第一次问。
我想在XY平面中的c++中的3d中旋转一个点,并且正在使用以下函数来完成任务。

void rotateXY(double angle){
//save the x and y and z coordinates in seperate variables
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
double radian = angle*M_PI/180;

this->pos[0] = cos(radian)*x - sin(radian)*y;
this->pos[1] = sin(radian)*x + cos(radian)*y;
this->pos[2] = 1*z;
};

我从 https://gamedevelopment.tutsplus.com/tutorials/lets-build-a-3d-graphics-engine-linear-transformations--gamedev-7716得到矩阵

在这里,我直接操纵点的坐标,因此this-> pos [0]

如果调用另一个名为rotateXYP的函数,该函数首先从旋转点中减去一个数学 vector ,然后在旋转后向其添加相同的数学 vector ,则得到所需的结果。

void rotateXYP(double angle, eng::point originOfRotation){
this->subVec(originOfRotation);
this->rotateXY(angle);
this->addVec(originOfRotation);
};

void rotateXY(double angle){
//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] = cos(radian)*x - sin(radian)*y;
this->pos[1] = sin(radian)*x + cos(radian)*y;
this->pos[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++经验不足,因此我寻求答案并希望这不是一个坏问题。

最佳答案

您的实现是正确的。这只是浮点运算的本质。所有数字均表示为近似值。平移点时,您会得到更好的数值条件。

我可能会补充说,这种影响将独立于所使用的编程语言和硬件而发生。

关于c++ - C++:围绕原点旋转点,但输出点在一定程度上不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60279807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com