我如何使用中点圆算法消除SDL中绘制的圆中的这些间隙?

问题描述 投票:0回答:1

我正在尝试创建一个相当简单的游戏,该游戏主要涉及使用SDL2绘制圆。我发现了SDL缺乏和内置方法来向SDL_Renderer绘制圆,但是我发现了this有用的答案,该答案使用中点圆算法来实现。因为我想要一个实心圆,所以我写了一个相当简单的函数,它只绘制了一些稍微小的圆,以给出实心圆的外观。不幸的是,这导致绘制带有间隙的圆,这些圆在圆上形成一种“ X”样式,如下所示:Image of red circle on black background with some gaps that form an 'X' shape这是我的draw_hollow_circle函数:

void draw_hollow_circle(SDL_Renderer *renderer, int centerx, int centery, int radius)
{
  // Draws a hollow circle with the given position and radius

  const int diameter = (radius * 2);

  int x = radius - 1;
  int y = 0;
  int tx = 1;
  int ty = 1;
  int error = tx - diameter;

  while (x >= y)
  {
    // Each renders an octant of the circle
    SDL_RenderDrawPoint(renderer, centerx + x, centery + y);
    SDL_RenderDrawPoint(renderer, centerx + x, centery - y);
    SDL_RenderDrawPoint(renderer, centerx - x, centery + y);
    SDL_RenderDrawPoint(renderer, centerx - x, centery - y);
    SDL_RenderDrawPoint(renderer, centerx + y, centery - x);
    SDL_RenderDrawPoint(renderer, centerx + y, centery + x);
    SDL_RenderDrawPoint(renderer, centerx - y, centery - x);
    SDL_RenderDrawPoint(renderer, centerx - y, centery + x);

    if (error <= 0)
    {
      ++y;
      error += ty;
      ty += 2;
    }

    if (error > 0)
    {
      --x;
      tx += 2;
      error += (tx - diameter);
    }
  }
}

这是我的draw_circle函数:

void draw_circle(SDL_Renderer *renderer, int x, int y, int radius, int r, int g, int b)
{
  // Draws a filled circle with the given position, radius, and color

  SDL_SetRenderDrawColor(renderer, r, g, b, SDL_ALPHA_OPAQUE);

  // Draw a lot of slightly smaller hollow circles to give the impression of a filled circle
  while (radius >= 0)
  {
    draw_hollow_circle(renderer, x, y, radius);
    --radius;
  }
}

现在,这很烦人,我想要一种避免这种差距并获得纯红色圆圈的方法,但是很遗憾,我找不到任何方法。我尝试了一种不同的方法,该方法涉及绘制从圆心到边缘的许多半径,但这会导致类似的问题,尽管间隙的位置略有不同。任何类型的答案都可以,因为它是一种更适合填充圆的算法,我的代码的数学错误等。

c++ graphics geometry sdl sdl-2
1个回答
0
投票

这些孔是舍入误差的伪像。每个点的精确定位将使用实数(请考虑浮点数),但是像素坐标必须是整数,因此是四舍五入。是的,由于相似的原因绘制对角线时,也会得到类似的工件。在不进行某种四舍五入的情况下,唯一可以绘制的线是水平,垂直,斜率为+1且斜率为-1的线。]

填充圆的一种简单方法是绘制矩形而不是点。 draw_hollow_circle中循环的每次迭代都绘制八个点。前四个是一个矩形的角,而后四个则形成另一个矩形。尝试绘制两个矩形而不是八个点。 (您不再需要遍历半径。)

(为此粘贴为完全不透明的颜色,因为许多点将被绘制多次。这会干扰部分透明性。)

© www.soinside.com 2019 - 2024. All rights reserved.