@startuml
title Эллипс/дуга: алгоритм растризации

start
:Read rx, ry, thickness,\narc_percent, closed, filled;
if (rx<=0 or ry<=0?) then (yes)
  stop
endif

:Build local bbox corners with margin;
:Transform corners to buffer\nand compute pixel scan bounds;
:Create temporary transparent buffer;
if (do_fill?) then (yes)
  :startFill() collect border pixels;
endif

while (for each pixel in bbox)
  :Map pixel center Buffer -> World -> Local;
  :nx = x/rx, ny = y/ry,\nd = nx^2 + ny^2;
  if (d in stroke ring?) then (yes)
    if (arc_percent < 100?) then (yes)
      :Compute angular position\nvia atan2 and normalized diff;
      if (inside arc sector?) then (yes)
        :plot stroke pixel;
      endif
    else (full ellipse)
      :plot stroke pixel;
    endif
  endif
endwhile

if (closed and arc_percent<100?) then (yes)
  :Draw two radial segments\n(center->start and center->end);
endif

if (do_fill?) then (yes)
  :stopFill(fill_color);
endif

:Composite temp buffer to target\nonce with object opacity;
stop

@enduml
