14

下面是一个三次插值函数:

public float Smooth(float start, float end, float amount)
{
    // Clamp to 0-1;
    amount = (amount > 1f) ? 1f : amount;
    amount = (amount < 0f) ? 0f : amount;

    // Cubicly adjust the amount value.
    amount = (amount * amount) * (3f - (2f * amount));

    return (start + ((end - start) * amount));
}

给定 0.0f - 1.0f 之间的数量,此函数将在开始值和结束值之间进行三次插值。如果你要绘制这条曲线,你最终会得到这样的结果:

已过期 Imageshack 图像已删除

这里的三次函数是:

    amount = (amount * amount) * (3f - (2f * amount));

我如何调整它以产生两条进出切线?

要产生这样的曲线:(线性开始到立方结束)

已过期 Imageshack 图像已删除

作为一项功能

并像另一个这样:(立方开始到线性结束)

已过期 Imageshack 图像已删除

有人有什么想法吗?提前致谢。

4

3 回答 3

12

您想要的是Cubic Hermite Spline

替代文字

其中 p0 是起点,p1 是终点,m0 是起点切线,m1 是终点切线

于 2009-07-18T01:18:31.740 回答
3

您可以在两个插值函数之间进行线性插值和三次插值并进行插值。

IE。

cubic(t) = cubic interpolation
linear(t) = linear interpolation
cubic_to_linear(t) = linear(t)*t + cubic(t)*(1-t)
linear_to_cubic(t) = cubic(t)*t + linear(t)*(1-t)

其中 t 范围为 0...1

于 2009-07-18T00:36:59.847 回答
0

嗯,一个简单的方法是这样的:

-Expand your function by 2 x and y
-Move 1 to the left and 1 down
Example: f(x) = -2x³+3x²
g(x) = 2 * [-2((x-1)/2)³+3((x-1)/2)²] - 1

或以编程方式(立方调整):

double amountsub1div2 = (amount + 1) / 2;
amount = -4 * amountsub1div2 * amountsub1div2 * amountsub1div2 + 6 * amountsub1div2 * amountsub1div2 - 1;

对于另一个,只需省略“移动”:

g(x) = 2 * [-2(x/2)³+3(x/2)²]

或以编程方式(立方调整):

double amountdiv2 = amount / 2;
amount = -4 * amountdiv2 * amountdiv2 * amountdiv2 + 6 * amountdiv2 * amountdiv2;
于 2013-12-22T02:18:30.090 回答