C# 中点圆画圆问题

C# 中点圆画圆问题,c#,algorithm,graphics,C#,Algorithm,Graphics,我试图用C语言实现中点绘制算法,从一个点向外扫描。 我有以下代码: private bool[,] squares; public Bitmap(int br, int h) { squares = new bool[br, h]; MakeCircle(9, 10, 10); MakeCircle(8, 10, 10); MakeCircle(7, 10, 10); MakeCircle(6, 10, 10); MakeCircle(5,

我试图用C语言实现中点绘制算法,从一个点向外扫描。 我有以下代码:

private bool[,] squares;

public Bitmap(int br, int h)
{   
    squares = new bool[br, h];
    MakeCircle(9, 10, 10);
    MakeCircle(8, 10, 10);
    MakeCircle(7, 10, 10);
    MakeCircle(6, 10, 10);
    MakeCircle(5, 10, 10);
    MakeCircle(4, 10, 10);
    MakeCircle(3, 10, 10);
    MakeCircle(2, 10, 10);
    MakeCircle(1, 10, 10);
    MakeCircle(0, 10, 10);
}

public void SelectSymmetry(int x, int y, int x0, int y0)
{
    TryPlace(x + x0, y + y0);
    TryPlace(-x + x0, y + y0);
    TryPlace(x + x0, -y + y0);
    TryPlace(-x + x0, -y + y0);
    TryPlace(y + x0, x + y0);
    TryPlace(-y + x0, x + y0);
    TryPlace(y + x0, -x + y0);
    TryPlace(-y + x0, -x + y0);
}

public void TryPlace(int x, int y)
{
    if (x >= 0 && x < vakjes.GetLength(0) && y >= 0 && y < vakjes.GetLength(1))
    {
        squares[x, y] = true;
    }
}

public void MakeCircle(int radius, int x0, int y0)
{
    int x = 0;
    int y = radius;
    double d = 5 / 4.0 - radius;
    SelectSymmetry(x, y, x0, y0);
    while (x < y)
    {
        x++;
        if (d < 0)
        {
            d += 2 * x + 1;
        }
        else
        {
            y--;
            d += 2 * (x - y) + 1;
        }
        SelectSymmetry(x, y, x0, y0);
    }
}
这将创建以下图像: 这就是问题所在。据我所知,没有两个圆圈占据同一个像素,但有一些像素没有被任何圆圈填充。有没有办法改变我的代码,使这些像素属于一个圆?任何帮助都将不胜感激


顺便说一句,很抱歉代码转储,但我觉得这是显示我问题的最直接的方式。

只是不要试图用圆圈制作磁盘。不要调用MakeCircle 10次,只调用一次:

public void MakeDisk(int radius, int x0, int y0)
{
    int x = 0;
    int y = radius;
    double d = 5 / 4.0 - radius;
    for (int ty=y; ty>=x; --ty) {
        SelectSymmetry(x, ty, x0, y0);
    }
    while (x < y)
    {
        x++;
        if (d < 0)
        {
            d += 2 * x + 1;
        }
        else
        {
            y--;
            d += 2 * (x - y) + 1;
        }
        for (int ty=y; ty>=x; --ty) {
            SelectSymmetry(x, ty, x0, y0);
        }
    }
}

整数和三角学真的不会混合。画一个圆意味着使用正弦和余弦函数以及数字pi。这些都不能很好地处理整数。如果你有足够大的整数,那么你不会注意到整数数学带来的问题。但是您正在一个非常小的绘图面上工作。如果你想看到另一个类似的问题,拿一个小的位图图像,然后逐渐缩小它。该算法不能保证同心圆会完全填满空间。它只会创建好看的圆。当坡度超过1/2时,只通过一个坐标将创建孔。用一种方法检查两个操作系统来避免这种情况。