创建驾驶模拟器:如何绕原点旋转电路?

Creation of a driving simulator : how to rotate the circuit around the origin?

我在 cpp 中的驾驶模拟器中有一个电路,我想知道如何围绕原点旋转电路,我试图深入研究一些三角函数,因为我知道这对我有帮助,但我在我卡住了。

供您参考,电路存储在向量对 (std::vector roads) 中。

这是我的示例电路的样子(红色),我想做的是另外两个迭代(黄色和绿色)。

三步电路:

这是存储在 roads

中的示例
x : 170, y : 0
x : -170, y : 0`
x : 170, y : 0
x : -170, y : 0
x : 170, y : -0.69632
x : -170, y : -0.69632
x : 170, y : -5.57056
x : -170, y : -5.57056
x : 170, y : -18.8006
x : -170, y : -18.8006
x : 170, y : -44.5645
x : -170, y : -44.5645
x : 170, y : -0.69632
x : -170, y : -0.69632
x : 170, y : -5.57056
x : -170, y : -5.57056
x : 170, y : -18.8006
x : -170, y : -18.8006
x : 170, y : -44.5645
x : -170, y : -44.5645
...

对于前进,后退,向左或向右移动,这很容易,因为我只需要减少/增加所有 x/y 当我朝一个方向前进时,但是当我想要的时候问题就来了旋转。 我知道,理论上我需要制作 sqrt(x²+y²) 来找到与原点(又名驱动程序)的距离并根据该距离应用旋转(作为比率,距离越小它越小需要旋转)。

但是现在,我被卡住了,我不知道该怎么做,任何人都可以提供一些关于如何做到这一点的解释吗?

我为“绕原点旋转点的数学”做了一个 google。这是我得到的第一个点击:

https://academo.org/demos/rotation-about-point/

它很好地解释了数学。你没有显示你的代码,但如果你只是围绕原点旋转一定的度数(或弧度),那么每个点的数学计算都非常简单。

您只需应用二维旋转矩阵 (https://en.wikipedia.org/wiki/Rotation_matrix)。这应该可行,您只需在每个点进行迭代:

#include <math.h>   

void rotate(float &x,float &y,float teta)
{
    float newX = x*cos(teta)+y*sin(teta);
    float newY = x*sin(teta)-y*cos(teta);
    x = newX;
    y = newY;
}

请记住,这个 teta 角的测量单位是弧度而不是度数。