40 lines
859 B
Crystal
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
|