Skip to content

Instantly share code, notes, and snippets.

@ankurcha
Created May 31, 2013 23:35
Show Gist options
  • Select an option

  • Save ankurcha/5688644 to your computer and use it in GitHub Desktop.

Select an option

Save ankurcha/5688644 to your computer and use it in GitHub Desktop.
function Average(left, right) {
var result = new Array();
if (left instanceof Array && right instanceof Array) {
for (var i=0; i<left.length || i<right.length; i++) {
result[i] = Average((i<left.length ? left[i] : 0.0), (i<right.length ? right[i] : 0.0));
}
} else if (left instanceof Array) {
for (var i=0; i<left.length; i++) {
result[i] = Average(left[i], (i==0 ? right : 0.0));
}
} else if (right instanceof Array) {
for (var i=0; i<right.length; i++) {
result[i] = Average((i==0 ? left : 0.0), right[i]);
}
} else {
result = (left + right) / 2;
}
return result;
}
function Difference (left, right) {
var result = new Array();
if (left instanceof Array && right instanceof Array) {
for (var i=0; i<left.length || i<right.length; i++) {
result[i] = Difference((i<left.length ? left[i] : 0.0), (i<right.length ? right[i] : 0.0));
}
} else if (left instanceof Array) {
for (var i=0; i<left.length; i++) {
result[i] = Difference(left[i], (i==0 ? right : 0.0));
}
} else if (right instanceof Array) {
for (var i=0; i<right.length; i++) {
result[i] = Difference((i==0 ? left : 0.0), right[i]);
}
} else {
result = left - right;
}
return result;
}
function Haar(source) {
if (source instanceof Array) {
if (source.length > 1) {
var avg = new Array();
var diff = new Array();
for (var i=0; i<source.length - 1; i += 2) {
avg[avg.length] = Average(source[i], source[i+1]);
diff[diff.length] = Difference(source[i], source[i+1]);
}
for (var i=0; i<diff.length; i++) { diff[i] = Haar(diff[i]); }
source = Haar(avg).concat(diff, (source.length % 2 == 1 ? source[source.length -1] : []));
} else if (source.length == 1) { source[0] = Haar(source[0]); }
}
return source;
}
function Left(average, difference) {
var result = new Array();
if (average instanceof Array && difference instanceof Array) {
for (var i=0; i<average.length || i<difference.length; i++) {
result[i] = Left((i<average.length ? average[i] : 0.0), (i<difference.length ? difference[i] : 0.0));
}
} else if (average instanceof Array) {
for (var i=0; i<average.length; i++) {
result[i] = Left(average[i], (i==0 ? difference : 0.0));
}
} else if (difference instanceof Array) {
for (var i=0; i<difference.length; i++) {
result[i] = Left((i==0 ? average : 0.0), difference[i]);
}
} else {
result = average + difference/2;
}
return result;
}
function Right(average, difference) {
var result = new Array();
if (average instanceof Array && difference instanceof Array) {
for (var i=0; i<average.length || i<difference.length; i++) {
result[i] = Right((i<average.length ? average[i] : 0.0), (i<difference.length ? difference[i] : 0.0));
}
} else if (average instanceof Array) {
for (var i=0; i<average.length; i++) {
result[i] = Right(average[i], (i==0 ? difference : 0.0));
}
} else if (difference instanceof Array) {
for (var i=0; i<difference.length; i++) {
result[i] = Right((i==0 ? average : 0.0), difference[i]);
}
} else {
result = average - difference/2;
}
return result;
}
function deHaar(source) {
if (source instanceof Array) {
if (source.length > 1) {
var sub = Math.floor(source.length/2);
var avg = source.slice(0,sub);
var diff = source.slice(sub, sub*2);
deHaar(avg);
for (var i=0; i<sub; i++) {
diff[i] = deHaar(diff[i]);
source[i*2] = Left(avg[i], diff[i]);
source[i*2+1] = Right(avg[i], diff[i]);
}
} else if (source.length == 1) { source[0] = deHaar(source[0]); }
}
return source;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment