2014-10-01 28 views
0

我使用SDL_RenderDrawPoint()進行了實驗,通過在圓上繪製圓來繪製圓。爲此,我使用正弦函數和餘弦函數(cos(v),sin(v))和for循環每次繪製每個點一次來表達它們的位置(x,y)。有1080個迭代和幾個if語句,我做了三個圓圈。使用三角函數繪製點的圓。 SDL2

功能:

void DotCircle::DrawCircle() 
    { 

     if (draw) 
     { 
      Position = { 500.f, 500.f }; 
      SDL_Point start; 
      start.x = Position.m_x; 
      start.y = Position.m_y; 
      SDL_SetRenderDrawColor(drawmgr->getRenderer(), 0xFF, 0x00, 0xFF, 0xFF); 

      for (size_t i = 0; i < 1080; i++) 
      { 
       if (i < 360) 
       { 
        SDL_RenderDrawPoint(drawmgr->getRenderer(), start.x + 300 * cos(i), start.y  + 300 * sin(i)); 
       } 

       if (i > 360) 
       { 
        SDL_RenderDrawPoint(drawmgr->getRenderer(), start.x + 200 * cos(i), start.y + 200 * sin(i)); 
       } 
       if (i > 720) 
       { 
        SDL_RenderDrawPoint(drawmgr->getRenderer(), start.x + 100 * cos(i), start.y + 100 * sin(i)); 
       } 
      } 
     } 
    } 

的問題當然是爲圓半徑變大它們之間的較大的房間,但我的問題是:我可以讓各界更流暢使用這種技術,如果是這樣,我該怎麼做?

圖片:

link

回答

1

你應該把它傳遞給sin()cos()之前轉換i爲弧度開始。

之後,您可能需要考慮使用小於1度的增量,此時 您在角度上循環。

如果效率是一個問題,您可以通過迭代90度弧加速4倍,並利用對稱來繪製其他三個象限(並在同一迭代中完成所有三個圓,而不是3次左右)。

除此之外,還有繪製圓的方法don't rely on trigonometry

+0

這改善了很多圈子。現在我使用一個浮點數並在循環中向我添加0.1 * PI/180(PI = 3.141592653)。 if語句也被轉換爲弧度。但是,可以做些什麼來提高效率?我正在考慮將點推入容器並從另一個地方抽取它們,或者以某種方式控制幀速率。 我有一個正方形在繪製圓圈時移動時會滯後很多 – Orrexon 2014-10-01 21:47:07

+0

我已經給我的答案添加了一些建議。 – 2014-10-01 22:25:39

0

看看bresenham算法,繪製一個像素的像素圓的方法繪製一個圓圈,或對我的回答這個問題的副本here。我不是SDL專家,但是我在那裏發佈了一個程序,讓ASCII在文本屏幕上用可在別處使用的例程繪製圓圈。