Алгоритм Брезенхэма для рисования окружности в ppmformats

В этом скромном рецепте я покажу один из важных алгоритмов в области математической графики — алгоритм Брезенхема для рисования окружности. Код, который будет приведен далее, является модификацией кода с Rosetta Code, но для ppmformats, хотя может быть легко переиспользован и для любой другой библиотеки.

Без лишних слов, код алгоритма:

import ppmformats;
 
void circle(P6Image img, int x0, int y0, int radius, RGBColor color)
{
    int f = 1 - radius;
    int ddfX = 1;
    int ddfY = -2 * radius;
    int x = 0;
    int y = radius;
    img[x0, y0 + radius] = color;
    img[x0, y0 - radius] = color;
    img[x0 + radius, y0] = color;
    img[x0 - radius, y0] = color;
 
    while (x < y) {
        if (f >= 0) {
            y--;
            ddfY += 2;
            f += ddfY;
        }
        x++;
        ddfX += 2;
        f += ddfX;
        img[x0 + x, y0 + y] = color;
        img[x0 - x, y0 + y] = color;
        img[x0 + x, y0 - y] = color;
        img[x0 - x, y0 - y] = color;
        img[x0 + y, y0 + x] = color;
        img[x0 - y, y0 + x] = color;
        img[x0 + y, y0 - x] = color;
        img[x0 - y, y0 - x] = color;
    }
}

Испытать код можно, к примеру так:

void main() {
    auto img = new P6Image(100, 100, new RGBColor(255, 255, 255));
    circle(img, 52, 52, 32, new RGBColor(0, 0, 0));
    img.save(`circle.ppm`);
}

Результат:

Этот код является очень хорошей реализацией классического алгоритма и был использован почти без изменений, за что проекту Rosetta Code отдельное спасибо (на сайте огромное количество практических примеров кода на D и не только на нем). Пример, в основном, учебный, но мы его публикуем, чтобы вы могли его использовать в ваших приложениях.

P.S: Долг проекту Rosetta Code за наглое использование кода для своей библиотеки мы вернули, но об этом в следующий раз…

Добавить комментарий