Skip to content

Instantly share code, notes, and snippets.

@bmander
Created April 13, 2012 04:31
Show Gist options
  • Save bmander/2373706 to your computer and use it in GitHub Desktop.
Save bmander/2373706 to your computer and use it in GitHub Desktop.
polynomial line fitting
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