C++ 为什么向量旋转函数会改变向量';它的震级是多少?

C++ 为什么向量旋转函数会改变向量';它的震级是多少?,c++,vector,rotation,2d,linear-algebra,C++,Vector,Rotation,2d,Linear Algebra,我想做一个简单的函数,将向量的点b围绕点a旋转给定的度数 奇怪的是,我的代码似乎有些工作——向量是旋转的,但它的长度变化非常剧烈 如果我停止擦除屏幕上的每一帧,以便一次看到每一帧,我会看到线条围绕原点产生一种八角形 更奇怪的是,原点甚至不在八角形的中心,而是在左下角 这是我的密码: struct Point { int x, y; }; struct Line { Point a, b; void rotate(double); }; void Line::rotate

我想做一个简单的函数,将向量的点b围绕点a旋转给定的度数

奇怪的是,我的代码似乎有些工作——向量是旋转的,但它的长度变化非常剧烈

如果我停止擦除屏幕上的每一帧,以便一次看到每一帧,我会看到线条围绕原点产生一种八角形

更奇怪的是,原点甚至不在八角形的中心,而是在左下角

这是我的密码:

struct Point { int x, y; };

struct Line { 
    Point a, b; 
    void rotate(double);
};

void Line::rotate(double t)
{
    t *= 3.141592 / 180;

    double cs = cos(t);
    double sn = sin(t);

    double trans_x = (double)b.x - a.x;
    double trans_y = (double)b.y - a.y;

    double newx = trans_x * cs - trans_y * sn;
    double newy = trans_x * sn + trans_y * cs;

    newx += a.x;
    newy += a.y;

    b.x = (int)newx;
    b.y = (int)newy;
}


使用olc::PixelGameEngine进行渲染,这就是我使用ints存储坐标的原因。

不要将点存储为整数。你会失去太多的精确性。您可以在发出draw命令时将它们转换为
int
,但是您应该在内部将它们保持为
double
float
。嘿,这很有效-谢谢!类型安全问题会产生多少奇怪的影响,这太疯狂了。这不是类型安全问题,而是取整问题。基本上,你的程序在每次旋转后都会改变长度,如果你只做一次旋转可能没问题,但是如果你做了一整组,那么你就有问题了。你不应该存储旋转后的坐标,而是将原始坐标旋转得越来越远,否则你会积累舍入误差。存储旋转,以便可以增加旋转。