如何编写函数以指数方式将数字增加到最大值

How to write a function to exponentially increase a number to its max

我有一个名为 turnRadius 的变量,它来自用户输入,可以介于 -1 和 1 之间,0 是默认值。

然后我必须将此数字转换为 275 和 0 范围内的等效数字并存储在变量 spriteHorizontalPosition

问题是,由于我不能期望用户将 turnRadius 一直设置为 -1 或 1,所以我希望当 turnRadius 达到 0.65-0.65,以指数方式增加到 max/min,这样用户就不必输入完整的数字。

我想我明白了,但我不知道如何编写函数,我能得到一些帮助吗?

下面是我的,但我知道它不是指数的,当它达到 0.65 时,spriteHorizontalPosition 突然被拉到最大值并且看起来很尴尬。

let turnRadius = user.input;

if (turnRadius <= -0.65) {
  turnRadius = -1;
} else if (turnRadius >= 0.65 ) {
  turnRadius = 1;
}

spriteHorizontalPosition = ((turnRadius * -1) + 1) * 137.5;

if ( spriteHorizontalPosition >= 275 ) {
  spriteHorizontalPosition = 275;
}

else if ( spriteHorizontalPosition <= 0 ) {
  spriteHorizontalPosition = 0;
}

playerSprite.transform.x = spriteHorizontalPosition;

如何在实际可能的用户输入 (-0.65..0.65) 和所需的(/虚拟的)用户范围 (-1..1) 之间映射一个漂亮的三次曲线?

平滑曲线cubicMap可以表示为:

const A = 0.65;
const C = 1/A - A*A;
const cubicMap = (x) => {
  if (x >  0.65) return 1;
  if (x < -0.65) return -1;
  return C*x + x*x*x;
}

如图所示:Desmos Link,它将 -0.650.65 之间的用户输入平滑地映射到 -11 之间。

您的代码可能如下所示:

const turnRadius = cubicMap(user.input);
const spriteHorizontalPosition = 275 * (1 + turnRadius) / 2;
playerSprite.transform.x = spriteHorizontalPosition;

无需额外的 if 语句,该值已被 cubicMap 限制。