Created
May 31, 2013 23:35
-
-
Save ankurcha/5688644 to your computer and use it in GitHub Desktop.
This file contains hidden or 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 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