C ++旋转线缩短

时间:2016-09-19 11:32:09

标签: c++ rotation trigonometry sdl-2

我正在尝试在sdl中进行一些简单的线旋转,我找到了一个围绕另一个点旋转点的函数。这是(改为与sdl一起使用)。

    SDL_Point rotate_point(double cx, double cy, double angle, SDL_Point p)
{
    double pi = acos(-1);
    double rotation_angle = (double)angle / 180.0 * pi;
    double s = sin(rotation_angle);
    double c = cos(rotation_angle);

    // translate point back to origin:
    p.x -= cx;
    p.y -= cy;

    // rotate point
    double xnew = p.x * c - p.y * s;
    double ynew = p.x * s + p.y * c;

    // translate point back:
    p.x = xnew + cx;
    p.y = ynew + cy;

    return p;
}

现在我遇到了一个问题,即线条越来越短,直到它停在中心点,我将它旋转。我不知道为什么。

以下是使用该功能的方式:

double angle1=0.1, angle2=0,oldangle1=0,oldangle2=0;
    SDL_Point line11 = { 10,0 }, line12 = { 110,0 }, line21 = { 110,0 }, line22 = { 210,0 };
    SDL_Event event;
    int mousex = 0, mousey = 0;
    while (SDL_PollEvent(NULL)) {
        SDL_GetMouseState(&mousex, &mousey);
        if (GetAsyncKeyState('W'))
            angle1 += 0.1;
        SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
        SDL_RenderClear(renderer);
        if (angle1 < oldangle1-0.1||angle1 > oldangle1 + 0.1) {
            line12 = rotate_point(0, 0, (angle1-oldangle1), line12);
            line21 = rotate_point(0, 0, (angle1 - oldangle1), line21);
            oldangle1 = angle1;
        }
        if (angle2 < oldangle2 - 0.1 || angle2 > oldangle2 + 0.1) {
            line22 = rotate_point(line21.x,line21.y, (angle2 - oldangle2), line22);
            oldangle2 = angle2;
        }
        if (angle2 == 0)
            angle2 = angle1;
        printf("%f ", angle2);
        SDL_SetRenderDrawColor(renderer, 0, 255, 0, 0);
        SDL_RenderDrawLine(renderer, line11.x, line11.y, line12.x, line12.y);
        SDL_RenderDrawLine(renderer, line21.x, line21.y, line22.x, line22.y);
        //solveIK(&angle1, &angle2, false, 100, 100, mousex, mousey);
        //angle1 = get_degrees(angle1);
        //angle2 = get_degrees(angle2);
        SDL_RenderPresent(renderer);
        SDL_Delay(16);

    }

我知道它非常混乱,但我刚刚开始使用sdl和c ++。在我开始工作之后,我会尝试修复它。

我已经尝试过:

旋转的不同功能。在线路缩短方面,它们似乎都更糟糕。它很可能不是旋转功能的问题。

重写代码。这是版本3,它工作得最好,但也是最糟糕的。

1 个答案:

答案 0 :(得分:3)

不要重新旋转。

从初始点开始。现在应用轮换。

如果您有新的旋转,请从初始点开始并应用新的旋转。不要旋转第一次旋转的结果。

通常,浮点运算会导致误差远离理论结果。舍入到整数甚至更多错误(不确定您的代码是否这样做)。级联大量的浮点操作有时会导致垃圾。

现在,添加角度也会产生舍入误差,但不会以明显的方式:它将旋转更多/更少,而不是拉伸/收缩线。在这里,你可以用固定数量的乘法代替重复加法,以减少这种情况,如果你愿意的话。