如何编写函数以指数方式将数字增加到最大值
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.65
和 0.65
之间的用户输入平滑地映射到 -1
和 1
之间。
您的代码可能如下所示:
const turnRadius = cubicMap(user.input);
const spriteHorizontalPosition = 275 * (1 + turnRadius) / 2;
playerSprite.transform.x = spriteHorizontalPosition;
无需额外的 if
语句,该值已被 cubicMap
限制。
我有一个名为 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.65
和 0.65
之间的用户输入平滑地映射到 -1
和 1
之间。
您的代码可能如下所示:
const turnRadius = cubicMap(user.input);
const spriteHorizontalPosition = 275 * (1 + turnRadius) / 2;
playerSprite.transform.x = spriteHorizontalPosition;
无需额外的 if
语句,该值已被 cubicMap
限制。