/* * circle — окружность (midpoint) с центром (cx,cy) радиуса r, * текущим цветом. Целочисленный алгоритм, 8 октантов за шаг. * * Вся окружность рисуется в ОДНОЙ W3-скобке (_bgi_begin/_bgi_end) + * raw-плот — иначе скобка на каждый пиксель делает большие окружности * мучительно медленными (тысячи DI/EI). */ #include "_bgi.h" void circle(int cx, int cy, int r) { int x, y, d; uint8_t c = _bgi_fg; if (r < 0) return; x = 0; y = r; d = 1 - r; _bgi_begin(); while (x <= y) { _bgi_plot_raw(cx + x, cy + y, c); _bgi_plot_raw(cx - x, cy + y, c); _bgi_plot_raw(cx + x, cy - y, c); _bgi_plot_raw(cx - x, cy - y, c); _bgi_plot_raw(cx + y, cy + x, c); _bgi_plot_raw(cx - y, cy + x, c); _bgi_plot_raw(cx + y, cy - x, c); _bgi_plot_raw(cx - y, cy - x, c); if (d < 0) { d += 2 * x + 3; } else { d += 2 * (x - y) + 5; y--; } x++; } _bgi_end(); }