RosettaCodeData/Task/Bitmap-Midpoint-circle-algorithm/Crystal/bitmap-midpoint-circle-algorithm-1.cr
2026-04-30 12:34:36 -04:00

40 lines
859 B
Crystal

require "./pixmap"
require "./bresenham"
class Pixmap
def circle (cx, cy, r, color, fill = false)
f = 1 - r
ddF_X = 0
ddF_Y = -2 * r
x = 0
y = r
self[cx, cy + r] = color
self[cx, cy - r] = color
p1, p2 = {cx + r, cy}, {cx - r, cy}
if fill
line(*p1, *p2, color)
else
self[*p1] = self[*p2] = color
end
while x < y
if f >= 0
y -= 1
ddF_Y += 2
f += ddF_Y
end
x += 1
ddF_X += 2
f += ddF_X + 1
[{cx - x, cy - y}, {cx + x, cy - y},
{cx - x, cy + y}, {cx + x, cy + y},
{cx - y, cy - x}, {cx + y, cy - x},
{cx - y, cy + x}, {cx + y, cy + x}].each_slice(2, reuse: true) do |(p1, p2)|
if fill
line(*p1, *p2, color)
else
self[*p1] = self[*p2] = color
end
end
end
end
end