Created
April 13, 2012 04:31
-
-
Save bmander/2373706 to your computer and use it in GitHub Desktop.
polynomial line fitting
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function translate(tx, ty, func){ | |
return function(x,y){ | |
var xprime = x-tx; | |
var yprime = y-ty; | |
return func(xprime,yprime); | |
} | |
} | |
function rotate(theta, func){ | |
return function(x,y){ | |
var xprime = Math.cos(theta)*x-Math.sin(theta)*y; | |
var yprime = Math.sin(theta)*x+Math.cos(theta)*y; | |
return func(xprime,yprime); | |
} | |
} | |
function rotate_list(theta, ary){ | |
var lambda = function(pt){ | |
var x=pt[0]; | |
var y=pt[1]; | |
var xprime = Math.cos(theta)*x-Math.sin(theta)*y; | |
var yprime = Math.sin(theta)*x+Math.cos(theta)*y; | |
return [xprime,yprime]; | |
} | |
var ret = []; | |
for(var i=0; i<ary.length; i++){ | |
ret.push( lambda(ary[i]) ); | |
} | |
return ret; | |
} | |
function translate_list(tx,ty,ary){ | |
var ret =[]; | |
for(var i=0; i<ary.length; i++){ | |
ret.push( [ary[i][0]+tx,ary[i][1]+ty] ); | |
} | |
return ret; | |
} | |
function makecurve(points){ | |
//translate control points to origin | |
var tx = points[0][0]; | |
var ty = points[0][1]; | |
points = translate_list( -tx, -ty, points ); | |
//rotate outer control points to flat | |
var lastpt = points[points.length-1]; | |
var theta = Math.atan2( lastpt[1], lastpt[0] ); | |
points = rotate_list(-theta, points); | |
//solve polynomial fit problem | |
var pp = new Polyspec(points); | |
var pn = pp.solve(); | |
var rightmost=points[points.length-1][0]; | |
// rotate turn into inequality, rotate back, and translate back | |
return translate(tx,ty, | |
rotate(-theta, | |
function(x,y){ | |
return (y>pn.eval(x) || (x<0&&y>0) || (x>rightmost&&y>0)) &&!(x>rightmost&&y<0) &&!(x<0&&y<0); | |
} | |
) | |
) | |
} | |
function dist(x,y){ | |
return Math.pow(x*x+y*y,0.5); | |
} | |
function intersection(funcs){ | |
var metaargs=arguments; | |
return function(x,y) { | |
var ret=true; | |
for(var i=0; i<metaargs.length;i++){ | |
ret = ret && metaargs[i](x,y); | |
} | |
return ret; | |
} | |
} | |
function makecircle(r){ | |
return function(x,y){ | |
return Math.pow(x,2) + Math.pow(y,2) < Math.pow(r,2); | |
} | |
} | |
function maketranscircle( p1,p2 ){ | |
var r = dist(p1[0]-p2[0],p1[1]-p2[1])*1.3; | |
return translate(p1[0],p1[1],makecircle(r) ); | |
} | |
function xor(func1, func2){ | |
return function(x,y){ | |
var f1 = func1(x,y); | |
var f2 = func2(x,y); | |
return (f1 || f2) && !(f1 && f2) | |
} | |
} | |
var c1=[231,73]; | |
var c2=[338,293]; | |
var c3=[78,283]; | |
var f1 = makecurve([c3,[126,83],[129,156],[61,234],c1]); | |
var f2 = makecurve([c1,[372,156],c2] ); | |
var f3 = makecurve([c2,[194,396],c3] ); | |
var f4 = maketranscircle([296,321],[344,225]); | |
emit( xor( intersection(f1,f2,f3), f4) ); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment