Since we know what a circle looks like, why don’t we directly plot each point since we know x must span from [x-x0,x+x0]?
y = y0 +/- sqrt(r*r-(x-x0)(x-x0))
<!DOCTYPE html> <html> <head> <script> function plotPoint(ctx,x,y) { ctx.fillRect(x,y,1,1); } function getRandomInt (min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } function drawRandom() { var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); drawCircle(getRandomInt(100,800),getRandomInt(100,400),getRandomInt(50,100),ctx); } function drawCircle(x0,y0,r,ctx) { var r2=r*r; var step=.1; var y; for(var x=x0-r;x<=x0+r;x+=step) { var dx2 = (x-x0)*(x-x0); y = y0 + Math.sqrt(r2-dx2); plotPoint(ctx,x,y); y = y0 - Math.sqrt(r2-dx2); plotPoint(ctx,x,y); } } function draw() { var c=document.getElementById("myCanvas"); var ctx=c.getContext("2d"); try { var x0 = parseInt(document.getElementById('x0').value); var y0 = parseInt(document.getElementById('y0').value); var r = parseInt(document.getElementById('r').value); if ('NaN' == x0||'NaN'==y0||'NaN'==r) return; drawCircle(x0,y0,r,ctx); } catch(err) { alert(err); } } </script> </head> <body> X0: <input type=text id=x0 value=300 size=3 /> Y0: <input type=text id=y0 value=300 size=3 /> R: <input type=text id=r value=100 size=3 /> <input type=button value="draw a circle" onclick="javascript:draw()"/> <input type=button value="draw a random circle" onclick="javascript:drawRandom()"/> <p> <canvas id="myCanvas" width="800" height="600" style="border:1px solid #d3d3d3;"> Your browser does not support the HTML5 canvas tag.</canvas> </p> </body> </html>