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); | |
}; |