Растровая развертка круга

213
27 апреля 2019, 00:20

Как выглядит алгоритм растровой развертки КРУГА по алгоритму Брезенхема? На просторах интернета могу найти только алгоритм развертки окружности :(

--

Как сместить цент?

public void Draw(int R, int _x, int _y)
    {
        int y = _y;
        int x = R;
        int d = 3 - 2 * R;
        while (x > -y)
        {
            int tempx = _x, tempy = _y;
            int i = 0;
            while (i < x)
            {
                PutPixel(GetX(x - tempx), GetY(y));
                PutPixel(GetX(-x + tempx), GetY(y));
                i++;
                tempx++;
            }
            i = 0;
            tempx = _x;
            while (i < x)
            {
                PutPixel(GetX(x - tempx), GetY(-y));
                PutPixel(GetX(-x + tempx), GetY(-y));
                i++;
                tempx++;
            }
            if (d < 0)
                d = d - 4 * y + 6;
            else
            {
                tempy = _y;
                i = 0;
                while (i < -y)
                {
                    PutPixel(GetX(y - tempy), GetY(x));
                    PutPixel(GetX(-y + tempy), GetY(x));
                    i++;
                    tempy--;
                }
                i = 0;
                tempy = _y;
                while (i < -y)
                {
                    PutPixel(GetX(y - tempy), GetY(-x));
                    PutPixel(GetX(-y + tempy), GetY(-x));
                    i++;
                    tempy--;
                }
                d = d - 4 * (y + x) + 10;
                x--;
            }
            Form1.Wait(0.03);
            y--;
        }
    }
Answer 1

Классический алгоритм Брезенхема генерирует точки для четвертинки окружности. Остальные точки получаются отражением сгенерированной точки относительно осей координат. Таким образом вы на каждом шаге алгоритма получаете четыре точки - начала и концы двух горизонтальных диапазонов пикселов, которые нужно закрасить. Вот и получился алгоритм растеризации круга.

void draw_pixels(int x1, int x2, int y)
{
  line(x1, y, x2, y);
}
void BresenhamCircle(int cx, int cy, int radius)
{
  int x = radius, y = 0;
  int D = 2 * (1 - radius);
  while (x >= 0)
  {
    draw_pixels(cx - x, cx + x, cy + y);
    draw_pixels(cx - x, cx + x, cy - y);
    if (D < 0 && 2 * D + 2 * x - 1 <= 0)
    { 
      ++y;
      D += 2 * y + 1;
    }
    else if (D > 0 && 2 * D - 2 * y - 1 >= 0)
    {
      --x;
      D -= 2 * x - 1;
    }
    else
    {
      --x, ++y;
      D += 2 * y - 2 * x + 2;
    }
  }
}

Вариант Мичнера генерирует точки для одной осьмушки окружности, а остальные точки получаются отражением относительно осей координат и диагоналей. На каждом шаге вы получаете восемь точек - начала и концы четырех горизонтальных диапазонов пикселов, которые нужно закрасить. Снова получился алгоритм растеризации круга.

void MichenerCircle(int cx, int cy, int radius)
{
  int x = radius, y = 0;
  int d = 3 - 2 * radius;
  while (y <= x)
  {
    draw_pixels(cx - x, cx + x, cy - y);
    draw_pixels(cx - x, cx + x, cy + y);
    draw_pixels(cx - y, cx + y, cy + x);
    draw_pixels(cx - y, cx + y, cy - x);
    if (d <= 0)
    { 
      d += 4 * y + 6;
      ++y;
    }
    else
    { 
      d += 4 * (y - x) + 10;
      --x, ++y;
    }
  }
}

Выбирайте, что вам больше нравится.

READ ALSO
Аналог в c# многомерного массива строк из php

Аналог в c# многомерного массива строк из php

как в C# в массив string[] добавить значения типа многомерного как в php типа такого

233
Запись в локальную переменную из потока

Запись в локальную переменную из потока

При нажатии кнопки "указать", указывается путь к папке с файлами, получается список файлов и по очередной загружается в picturebox и параллельно...

159
Цепочное освобождение объектов

Цепочное освобождение объектов

Все объекты являются неуправляемыми за исключением некоторых типов

166
Как заблокировать клавиатуру и мышь?

Как заблокировать клавиатуру и мышь?

Просто как заблокировать клавиатуру и мышь? Уже смотрел эту страницу http://wwwcyberforum

304