2016-09-19 24 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