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