44 lines
1.0 KiB
Plaintext
44 lines
1.0 KiB
Plaintext
@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
|