2014-10-01 196 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在文本屏幕上用可在别处使用的例程绘制圆圈。