Задача скругления при рисовании окружности в средней точке - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь реализовать алгоритм рисования средней точки в 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);
    }
}

Это создает следующее изображение: Filled in circle with missing pixels И это проблема. Насколько я могу судить, 2 круга не занимают один и тот же пиксель, но есть пиксели, которые не заполнены ни одним кружком. Есть ли способ изменить мой код, чтобы эти пиксели принадлежали кругу? Любая помощь будет высоко ценится.

PS Извините за дамп кода, но я чувствовал, что это был самый прямой способ показать мою проблему.

1 Ответ

1 голос
/ 13 января 2020

Только не пытайтесь сделать диск из кругов. Вместо того, чтобы звонить 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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...