/* * _bgi_ellipse_arc — контур дуги/эллипса полилинией. * * Точки параметризованы углом (BGI: 0°=восток, против часовой, ось Y * вниз): px = cx + xr*cos(a), py = cy - yr*sin(a). Соседние выборки * соединяются отрезками — контур сплошной при любом радиусе. * * Тригонометрия в Q7 (×128): xr*cos128 ≤ 255×128 < 32767, помещается в * int — БЕЗ 32-битной арифметики (её SDCC/Z80 собирает криво: раньше * эллипс через (long)…>>8 рисовался прямоугольником). */ #include "_bgi.h" void _bgi_ellipse_arc(int cx, int cy, int stangle, int endangle, int xr, int yr, uint8_t color) { int a, x, y, px, py, first; if (endangle < stangle) endangle += 360; /* дуга через 0° */ px = 0; py = 0; first = 1; for (a = stangle; a <= endangle; a++) { x = cx + ((xr * _bgi_cos128(a)) >> 7); y = cy - ((yr * _bgi_sin128(a)) >> 7); if (!first) _bgi_lineseg(px, py, x, y, color); px = x; py = y; first = 0; } }