/* * fillellipse — залитый эллипс с полуосями rx,ry, центр (cx,cy). * Нутро — текущим стилем заливки, контур — текущим цветом. * * По строкам: полуширина w = rx*sqrt(ry²-dy²)/ry (целочисленно через * _bgi_isqrt). ry²,dy² ≤ ~180² < 32767, rx*s ≤ rx*ry < 32767 — без * 32-бит (см. memory/avoid_32bit_arith_z80). */ #include "../_bgi.h" void fillellipse(int cx, int cy, int rx, int ry) { int dy, s, w; if (rx < 0 || ry < 0) return; _bgi_begin(); if (ry == 0) { _bgi_fill_span(cx - rx, cx + rx, cy); } else { for (dy = -ry; dy <= ry; dy++) { s = _bgi_isqrt(ry * ry - dy * dy); /* 0..ry */ w = (rx * s) / ry; _bgi_fill_span(cx - w, cx + w, cy + dy); } } _bgi_end(); /* Контур текущим цветом. */ ellipse(cx, cy, 0, 360, rx, ry); }