有时我脑子里想出一个需要特殊类型的数学函数的想法:例如,余弦,对数或多项式。 由于我没有太多的数学背景,因此更有可能知道我想要的函数的形状 ,但不知道如何写下来。
如果幸运的话,我尘土飞扬的一角将摆脱一年级代数以来一直积累的蜘蛛网并提供服务,比如说“嗯……也许可以尝试tanh?”
但是今天我很不幸。 我想要某种像方波的东西,但是不那么苛刻。 正弦波太平滑,而方波不够平滑。 当然,我必须说出一些数学咒语可以解决这个问题! 我有个想法,我想从正弦波开始并“挤压”它,因此0和1之间的位更接近1,而0和–1之间的位更接近–1。
我的数学集尘者有很好的意图,例如说“不是在[0,1]中平方一个数字会使其变小,而在[1,∞)中平方一个数字会不会使它变大? 这有用吗?”和“ S形函数看起来不像S吗? 您的曲线上有看起来很S的东西,也许是个S型曲线。”但事实证明,这些曲线都不符合我的需求。
好的,所以我的数学记住者没有用。 是时候遵循第一原理了。 如果我有一些函数squash ( x ),它将[-1,1]中的值从0推向范围的边缘,那么它的属性是什么? 首先,我知道南瓜 (0) = 0 。 另外, 壁球 (1) = 1, 壁球 (–1) = –1。 然后介于两者之间的一些值: 壁球 (0.5)应该更接近1,例如0.6。 壁球 (–0.5)应该更接近–1,与将0.5推向1的数量相同。我像在9年级一样绘制了点。
当我看着自己绘制的图片时,一个灯泡在我的头上掉了:看起来有点像Photoshop的“曲线” UI! 快速搜索和有帮助的StackOverflow答案提示了Bezier样条曲线,从那里我发现了cube-bezier.com,它使我可以绘制一些想要的曲线,也可以绘制一些不需要的曲线。
其他一些页面具有用于二次,三次,四次等的“缓入-渐出”功能,但是我希望能够一直调整曲线的清晰度,从一条直线(完全没有挤压)到一条曲线。方波(将所有<0到–1,且所有≥0到+1压扁),平稳。 我想要一个可以调整的参数来说明曲线的锐度。 我想要三次加半或四次减去一个位。
我没有在任何地方写下等式,所以我弄清楚了。 经过几次死胡同之后,我想到了以下内容:
这里的k是曲线的“压缩度”,其中1是直线,而∞是阶跃函数。
将余弦喂入其中, 瞧 !
我可以想象这种功能除了挤压余弦外,还可以用于其他各种事情。 您可以在生成的地形上运行它,以使悬崖更陡峭,山谷更宽,或者在动画中使用它来控制“机率”。 我将使用它来控制昼夜周期的光照水平。 如果您使用它来制作游戏或其他方式,请在Twitter上告诉我! 我在@nornagon,您应该关注我。