var add = function(a,b){ return a+b; };
var add_uu = function(a,b){ return a+b[0]*b[0]; };
var add_uv = function(a,b){ return a+b[0]*b[1]; };
var add_vv = function(a,b){ return a+b[1]*b[1]; };
var add_uuu = function(a,b){ return a+b[0]*b[0]*b[0]; };
var add_vvv = function(a,b){ return a+b[1]*b[1]*b[1]; };
var add_uvv = function(a,b){ return a+b[0]*b[1]*b[1]; };
var add_uuv = function(a,b){ return a+b[0]*b[0]*b[1]; };
var getx = function(e){ return e[0]; };
var gety = function(e){ return e[1]; };
$(document).ready(function () {
var paper = Raphael("canvas");
var points=[];
$("#canvas").mousedown(function (e) {
var x = e.offsetX;
var y = e.offsetY;
points.push([x,y]);
paper.circle(x, y, 1);
});
$("#clear").click(function(){
paper.clear();
points = [];
});
$("#go").click(function(){
var N = points.length;
var xb = points.map(getx).reduce(add,0) / N;
var yb = points.map(gety).reduce(add,0) / N;
var u = points.map(function(e){return [e[0]-xb,e[1]-yb];});
var a1 = u.reduce(add_uu,0);
var b1 = u.reduce(add_uv,0);
var c1 = 0.5*(u.reduce(add_uuu,0) + u.reduce(add_uvv,0));
var a2 = u.reduce(add_uv,0);
var b2 = u.reduce(add_vv,0);
var c2 = 0.5*(u.reduce(add_vvv,0) + u.reduce(add_uuv,0));
var q = a2/a1;
var vc = (c2-q*c1)/(b2-q*b1);
var uc = (c1-b1*vc)/a1;
var r = Math.sqrt(uc*uc+vc*vc+(a1+b2)/N);
var x = uc+xb;
var y = vc+yb;
paper.circle(x, y, r).attr({"stroke":"#f00","stroke-width":2});
var e = points.reduce(function(p,c) {
var t = r*r - (c[0]-x)*(c[0]-x) - (c[1]-y)*(c[1]-y);
return p+t*t;
},0);
console.log("Residue = " + e);
});
});
#canvas {
width: 600px;
height: 400px;
border: 2px dotted #ccc;
cursor: crosshair;
}
<script src="http://cdnjs.cloudflare.com/ajax/libs/raphael/2.1.0/raphael-min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="clear">Clear</button>
<button id="go">Compute circle</button>
<div id="canvas"></div>