I love D3's Quantitative Scales and wanted a simple way to create and use scales in that style.
var centigradeToFahrenheit = new Sideburns(-40, 0, -40, 32);
centigradeToFahrenheit(35); // 95 hot!
centigradeToFahrenheit.inverse(14); // -10 cold!I love D3's Quantitative Scales and wanted a simple way to create and use scales in that style.
var centigradeToFahrenheit = new Sideburns(-40, 0, -40, 32);
centigradeToFahrenheit(35); // 95 hot!
centigradeToFahrenheit.inverse(14); // -10 cold!| var Sideburns = function(minDomain, maxDomain, minRange, maxRange, clamp){ | |
| // This is a function | |
| var Normalizer = function(min, max) { | |
| return function(val) { | |
| return (val - min) / (max - min); | |
| } | |
| } | |
| // This is another | |
| var Interpolater = function(min, max, clamp) { | |
| return function(val) { | |
| val = min + (max - min) * val; | |
| return clamp ? Math.min(Math.max(val, min), max) : val; | |
| } | |
| } | |
| // This is a third | |
| var Scale = function(minDomain, maxDomain, minRange, maxRange, clamp) { | |
| var normalize = new Normalizer(minDomain, maxDomain); | |
| var interpolate = new Interpolater(minRange, maxRange, clamp); | |
| var _normalize = new Normalizer(minRange, maxRange); | |
| var _interpolate = new Interpolater(minDomain, maxDomain, clamp); | |
| var s = function(val) { | |
| return interpolate(normalize(val)); | |
| }; | |
| s.inverse = function(val) { | |
| return _interpolate(_normalize(val)); | |
| }; | |
| return s; | |
| } | |
| return Scale(minDomain, maxDomain, minRange, maxRange, clamp); | |
| }; |