После того, как @Bergi предложил мне попробовать упростить свою исходную функцию, я переписал функцию в стиле @Andy и сумел ее тоже инвертировать.
Вы должны начать с упрощения до const log = -Math.log (1 - значение) / Math.log (100) * max; - Берги
const logScale = (value, max) => {
const x1 = 1 - value;
const x2 = -Math.log(x1);
const x3 = x2 / Math.log(100);
const x4 = x3 * max;
return x4;
};
const altInverseRmsLogScale = (lg, max) => {
const x4 = lg / max;
const x3 = x4 * Math.log(100);
const x2 = Math.exp(-x3);
const x1 = 1 - x2;
return x1;
};
console.log(logScale(0.7, 300)); // 4.727557716909737
console.log(inverseLogScale(logScale(0.7, 300), 300)); // 0.07000000000000006
Краткая версия
const logScale = (value, max) => (-Math.log(1 - value) / Math.log(100)) * max;
const inverseLogScale = (lg, max) => 1 - Math.exp(-(lg / max * Math.log(100)));
Версия Terser
const logScale = (value, max) => (-Math.log(1 - value) / Math.log(100)) * max;
const inverseLogScale = (lg, max) => 1 - Math.pow(100, -lg / max);
console.log(logScale(0.6, 300));
console.log(inverseLogScale(logScaleTwo(0.6, 300), 300));
https://repl.it/@sarcoma / логарифмическая шкала
Окончательная функция
Мне также нужно было обработать Infinity
, возвращаемое при value === max
.
const logScale = (value, max) => {
const log = (-Math.log(1 - value) / Math.log(100)) * max;
return log === Infinity ? max : log;
};
const inverseLogScale = (lg, max) => 1 - Math.pow(100, -lg / max);