В этом скромном рецепте я покажу один из важных алгоритмов в области математической графики — алгоритм Брезенхема для рисования окружности. Код, который будет приведен далее, является модификацией кода с 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 за наглое использование кода для своей библиотеки мы вернули, но об этом в следующий раз…