2016-09-19 39 views
1

我目前正在尝试一些简单的线旋转sdl,我发现一个功能,围绕另一点旋转一个点。在这里(改为使用sdl)。C++旋转线变短

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; 
} 

现在即时通讯有一个问题,其中行越来越短,直到它停在中心点im旋转它周围。我不知道为什么。

下面是一个使用IM功能的方式:

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

只是一个不相关的提示:它工作后清理是我总是告诉自己要做但我从来没有做过。事实上,如果你从头开始保持清洁,它会更容易工作 – user463035818

+0

什么是cx和cy?旋转中心坐标? – SingerOfTheFall

+0

Jeah。 cx =镜头的Centerx。) – MoustacheSpy

回答

3

请勿重新转移。

从初始点开始。现在应用一个旋转。

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

一般来说,浮点运算会导致错误远离理论结果。四舍五入到整数更多的错误(不知道你的代码是否这样)。级联大量浮点操作有时会导致垃圾。

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

+0

你能深入解释一下吗?你的意思是,而不是(angle1-oldangle)我应该将point1设置为其基本值,并应用angle1? – MoustacheSpy

+0

谢谢我的男人。我改变了它,就像你建议的那样,问题已经(大部分)消失了。它仍然有点不准确,但我可以忍受。 – MoustacheSpy