Sorry for my bad language, I'm french !
I don't see function for drawing circle, so I made it:
function _360(x,y,r,color,fill)
if not fill then
for a=1,360,1 do --draw outline only
dx=math.cos(a)*r+x
dy=math.sin(a)*r+y
pix(dx,dy,color)
end
else
for r=r,1,-1 do --draw circle for each radius (for fill circle)
for a=1,360,1 do
dx=math.cos(a)*r+x
dy=math.sin(a)*r+y
pix(dx,dy,color)
end
end
end
end
function _bresenham(x,y,r,color)
--see <a href="<a href=" https:="" fr.wikipedia.org="" wiki="" algorithme_de_trac%c3%a9_d%27arc_de_cercle_de_bresenham"=""></a><a href="<a href=" https:="" fr.wikipedia.org="" wiki="" algorithme_de_trac%c.."="">https://fr.wikipedia.org/wiki/Algorithme_de_trac%C...</a>">https://fr.wikipedia.org/wiki/Algorithme_de_trac%C....">https://fr.wikipedia.org/wiki/Algorithme_de_trac%C...
px=0
py=r
m=5-4*r
while(px<=py) do
pix((px+x),(py+y),color)
pix((py+x),(px+y),color)
pix((-px+x),(py+y),color)
pix((-py+x),(px+y),color)
pix((px+x),(-py+y),color)
pix((py+x),(-px+y),color)
pix((-px+x),(-py+y),color)
pix((-py+x),(-px+y),color)
if m>0 then
py=py-1
m=m-8*py
end
px=px+1
m=m+8*px+4
end
end
function _andres(x,y,r,color,fill)
--see <a href="<a href=" https:="" fr.wikipedia.org="" wiki="" algorithme_de_trac%c3%a9_de_cercle_d%27andres"="">https://fr.wikipedia.org/wiki/Algorithme_de_trac%C...</a>">https://fr.wikipedia.org/wiki/Algorithme_de_trac%C...
px=x
py=y
d=r-1
a=r
--a=r-1
b=0
while(a>=b) do
if not fill then
pix((px+b),(py+a),color)
pix((px+a),(py+b),color)
pix((px-b),(py+a),color)
pix((px-a),(py+b),color)
pix((px+b),(py-a),color)
pix((px+a),(py-b),color)
pix((px-b),(py-a),color)
pix((px-a),(py-b),color)
else
line((px+b),(py-a),(px+b),(py+a),color)
line((px+a),(py-b),(px+a),(py+b),color)
line((px-b),(py-a),(px-b),(py+a),color)
line((px-a),(py-b),(px-a),(py+b),color)
end
if d>=2*b then
d=d-2*b-1
b=b+1
elseif d<2*(r-a) then
d=d+2*a-1
a=a-1
else
d=d+2*(a-b-1)
a=a-1
b=b+1
end
end
end
function _axis(cx,cy,r,color,fill)
if not fill then
for y=-r,r,1 do --outline
for x=-r,r,1 do
if (x*x+y*y)<=(r*r) then
pix(cx+x,cy+y,color)
end
end
end
r=r-1
for y=-r,r,1 do --unfill
for x=-r,r,1 do
if (x*x+y*y)<=(r*r) then
pix(cx+x,cy+y,-1)
end
end
end
else
for y=-r,r,1 do
for x=-r,r,1 do
if (x*x+y*y)<=(r*r) then
pix(cx+x,cy+y,color)
end
end
end
end
end
function circ(x,y,r,color,algo)
if algo=="360" then
--don't use it, it's false/incomplete
--_360(x,y,r,color,true)
elseif algo=="bresenham" then
_bresenham(x,y,r,color)
_andres(x,y,(r),color,true)
elseif algo=="andres" then
_andres(x,y,r,color,true)
elseif algo=="axis" then
_axis(x,y,r,color,true)
end
end
function circb(x,y,r,color,algo)
if algo=="360" then
--don't use it, it's false/incomplete
--_360(x,y,r,color,false)
elseif algo=="bresenham" then
_bresenham(x,y,r,color)
elseif algo=="andres" then
_andres(x,y,r,color,false)
elseif algo=="axis" then
_axis(x,y,r,color,false)
end
end
There are a lot of algorithm to drawing circle, but after comparison, I suggest to use Andres's method:
function _andres(x,y,r,color,fill) --see https://fr.wikipedia.org/wiki/Algorithme_de_trac%C.... px=x py=y d=r-1 a=r --a=r-1 b=0 while(a>=b) do if not fill then pix((px+b),(py+a),color) pix((px+a),(py+b),color) pix((px-b),(py+a),color) pix((px-a),(py+b),color) pix((px+b),(py-a),color) pix((px+a),(py-b),color) pix((px-b),(py-a),color) pix((px-a),(py-b),color) else line((px+b),(py-a),(px+b),(py+a),color) line((px+a),(py-b),(px+a),(py+b),color) line((px-b),(py-a),(px-b),(py+a),color) line((px-a),(py-b),(px-a),(py+b),color) end if d>=2*b then d=d-2*b-1 b=b+1 elseif d<2*(r-a) then d=d+2*a-1 a=a-1 else d=d+2*(a-b-1) a=a-1 b=b+1 end end end function circ(x,y,r,color) _andres(x,y,r,color,true) end function circb(x,y,r,color) _andres(x,y,r,color,false) end
