实现非线性插值的方法?

3
我需要实现一种非线性插值方法,包括ease-in、ease-out、通用缓动曲线以及用户定义的曲线。
我有一个基本的想法,但不确定它是否是最有效的解决方案。我的想法基本上如下:
使用二维立体、二次或n阶贝塞尔曲线来控制插值。线性遍历曲线以获取非线性Y轴分量,并将该值传入简单的线性插值方法中:
value = v1 + (v2 - v1) * t;

t为控制曲线的非线性Y分量。

这允许自定义用户定义的插值方法,但代价是一个非线性插值等于:

1 + 2 * (n-1)

总插值次数,其中n是控制曲线的阶数或控制点数。

我不是数学家,这是我能想到的最好解释,所以我的问题是是否有更好的解决方案?

编辑:我可能没有解释清楚,我不是一个母语为英语的人,因此这里有一些希望每个人都能理解的内容:

control curve interpolation

1
更好的解决方案是针对什么?是插值算法一般,还是更高效的贝塞尔曲线算法?你有什么限制条件? - Oliver Charlesworth
你将如何创建立方或四次曲线来“控制插值”?只是猜测吗? - Dan W
@DanW - 曲线的变化斜率被用作插值的t值,基本上不是从v1到v2得到线性变化,而是由控制曲线的Y分量决定插值值的“位置”。 - dtech
贝塞尔曲线是非线性插值的完美例子。如果您想让一个对象以恒定的速度遍历曲线,请参见此答案。否则,我不明白您的问题是什么。 - BlueRaja - Danny Pflughoeft
@BlueRaja-DannyPflughoeft - 我需要能够使用不同的曲线来控制两个值之间的插值,例如在动画或绘制渐变等方面。上面的示例是easy-in动画,动画开始缓慢,然后迅速增加速度,然后再次减速,这就是我需要实现的内容,这是我自己想出的方法,因此我的问题是它是否可以,如果不行,是否有更好的方法。谢谢! - dtech
显示剩余4条评论
1个回答

4
据我所知,您的t实际上是一个函数族fi(u),其中ufi(u)均在0到1之间。如果是这样的话,您已经提出的方案已经很好了。
看起来您担心在实际曲线计算过程中评估这些fi(u)值。如果您不想预先计算,则无法避免评估。如果性能是一个很大的问题,并且您不需要非常精确,可以为每个曲线计算fi(uj)表格,对于您想要的许多uj值(例如0到1之间的100或1000个离散点),并且当您需要在采样点之间的值时,在所需点周围的两个缓存值进行简单的线性插值。

谢谢,这就是我需要知道的全部内容。基本上的想法是创建一系列的类,其中一个是你描述的,返回从0到1的值,但用户也可以设置其他值和类型,例如你可能希望获得0到3之间的随机数,但你想要控制返回任何一个数字的几率,例如你想要70%的几率为0,20%的几率为1,7%的几率为2,仅有3%的几率为3,并且还可以控制while循环来创建自定义的非线性for循环和其他类似的东西... - dtech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接