* Linear mapping a value from domain to range * @memberOf module:echarts/util/number * @param {(number|Array. )} val * @param {Array. } domain Domain extent domain[0] can be bigger than domain[1] * @param {Array. } range Range extent range[0] can be bigger than range[1]
(val, domain, range, clamp)
| 18860 | * @return {(number|Array.<number>} |
| 18861 | */ |
| 18862 | function linearMap(val, domain, range, clamp) { |
| 18863 | var subDomain = domain[1] - domain[0]; |
| 18864 | var subRange = range[1] - range[0]; |
| 18865 | |
| 18866 | if (subDomain === 0) { |
| 18867 | return subRange === 0 |
| 18868 | ? range[0] |
| 18869 | : (range[0] + range[1]) / 2; |
| 18870 | } |
| 18871 | |
| 18872 | // Avoid accuracy problem in edge, such as |
| 18873 | // 146.39 - 62.83 === 83.55999999999999. |
| 18874 | // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError |
| 18875 | // It is a little verbose for efficiency considering this method |
| 18876 | // is a hotspot. |
| 18877 | if (clamp) { |
| 18878 | if (subDomain > 0) { |
| 18879 | if (val <= domain[0]) { |
| 18880 | return range[0]; |
| 18881 | } |
| 18882 | else if (val >= domain[1]) { |
| 18883 | return range[1]; |
| 18884 | } |
| 18885 | } |
| 18886 | else { |
| 18887 | if (val >= domain[0]) { |
| 18888 | return range[0]; |
| 18889 | } |
| 18890 | else if (val <= domain[1]) { |
| 18891 | return range[1]; |
| 18892 | } |
| 18893 | } |
| 18894 | } |
| 18895 | else { |
| 18896 | if (val === domain[0]) { |
| 18897 | return range[0]; |
| 18898 | } |
| 18899 | if (val === domain[1]) { |
| 18900 | return range[1]; |
| 18901 | } |
| 18902 | } |
| 18903 | |
| 18904 | return (val - domain[0]) / subDomain * subRange + range[0]; |
| 18905 | } |
| 18906 | |
| 18907 | /** |
| 18908 | * Convert a percent string to absolute number. |
no outgoing calls
no test coverage detected