用c->无限循环中的中点算法填充绘制的圆?

s.r*_*.r. 2 c algorithm geometry infinite-loop

我试图用中点算法绘制一个实心圆.我已设法绘制一个未填充的圆,y0 = 320; x0 = 240; radius = 180-使用以下代码(参考:https://en.wikipedia.org/wiki/Midpoint_circle_algorithm):

int x0, int y0, int radius;

x0 = 320;     //assign values
y0 = 240;
radius = 180;

int x = radius-1;
int y = 0;
int dx = 1;
int dy = 1;
int err = dx - (radius << 1);

while (x >= y)
{
    putpixel(x0 + x, y0 + y);
    putpixel(x0 + y, y0 + x);
    putpixel(x0 - y, y0 + x);
    putpixel(x0 - x, y0 + y);
    putpixel(x0 - x, y0 - y);
    putpixel(x0 - y, y0 - x);
    putpixel(x0 + y, y0 - x);
    putpixel(x0 + x, y0 - y);

    if (err <= 0)
    {
        y++;
        err += dy;
        dy += 2;
    }
    if (err > 0)
    {
        x--;
        dx += 2;
        err += dx - (radius << 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

这提供了以下输出(保存在位图中): 在此输入图像描述

现在我想,这个未填充的黄色圆圈将被填充,所以它看起来像这样:

在此输入图像描述

我认为我可以通过设置每次半径半径来实现这一点 - 所以它绘制半径为-1的相同圆 - 直到半径= 0.因此,基本上它每次都会绘制一个用旧圆圈填充的新圆圈,直到现在有圆形绘制(半径= 0).我的代码是:

int x0,int y0,int radius;

x0 = 320;     //assign values
y0 = 240;
radius = 180;

int x = radius-1;
int y = 0;
int dx = 1;
int dy = 1;
int err = dx - (radius << 1);

while(radius!=0) {
    while (x >= y)
    {
        putpixel(x0 + x, y0 + y);
        putpixel(x0 + y, y0 + x);
        putpixel(x0 - y, y0 + x);
        putpixel(x0 - x, y0 + y);
        putpixel(x0 - x, y0 - y);
        putpixel(x0 - y, y0 - x);
        putpixel(x0 + y, y0 - x);
        putpixel(x0 + x, y0 - y);

        if (err <= 0)
        {
            y++;
            err += dy;
            dy += 2;
        }
        if (err > 0)
        {
            x--;
            dx += 2;
            err += dx - (radius << 1);
        }
    }

    x0 = x0 - 1;     //getting the next circle until radius = 0
    y0 = y0 -1;
    radius = radius - 1;

    x = radius-1;
    y = 0;
    dx = 1;
    dy = 1;
    err = dx - (radius << 1);

}
Run Code Online (Sandbox Code Playgroud)

这应该是我的想法如何填补的代码,但我得到的是一个无限循环..有谁知道为什么?或者有没有其他方法使用中点算法填充圆圈?

问候

unw*_*ind 6

我很确定你这样做不会产生一个非常好的圈子; 舍入错误,这样可能最终会给你圆圈中的"洞",即未填充的像素.

更好的方法是认识到圆可以被视为一堆不同长度的水平线.因此,所有你需要做的是迭代y从零部件-rr,并为每个这样的y计算相应的x使用现有的代码.然后从画一条水平线(-x, y)(x, y).