Найти формулу обратного преобразования

Есть такая функция:

(timeFraction) => {
        return timeFraction < 0.5
          ? 4 * timeFraction * timeFraction * timeFraction
          : (timeFraction - 1) *
              (2 * timeFraction - 2) *
              (2 * timeFraction - 2) +
              1;
      }

принимает она число от 0 до 1 и отдает тоже число от 0 до 1

Вот пример для 0.3: (0.3) => 0.108

Как сделать функцию обратной операции: (0.108) => 0.3?


Ответы (1 шт):

Автор решения: Exploding Kitten

// прямая функция
let f = (timeFraction) => {
  return timeFraction < 0.5
    ? 4 * timeFraction * timeFraction * timeFraction
    : (timeFraction - 1) *
        (2 * timeFraction - 2) *
        (2 * timeFraction - 2) +
        1;
};

// обратная
let ff = t => {
  return t < 0.5
    ? Math.cbrt(t / 4)
    : Math.cbrt((t - 1) / 4) + 1
};

var x = f(0.3);
var reverse = ff(x);

console.log(x);
console.log(reverse);

x = f(0.6);
reverse = ff(x);

console.log(x);
console.log(reverse);

С первой частью условия все достаточно просто, её можно преобразовать на лету, а вот вторую можно представить как уравнение и решить:

y = (x - 1) * (2x - 2) * (2x - 2) + 1

y = 4 * (x - 1) ^ 3 + 1

(y - 1) / 4 = (x - 1)^3 

cbrt((y - 1) / 4) = x - 1

cbrt((y - 1) / 4) + 1 = x
→ Ссылка