2009-07-18 130 views
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圖片已刪除

任何人有任何想法?提前致謝。

+2

投票結束這個問題,因爲它依靠圖像來顯示問題是什麼,一個那些圖像顯然早已消失。這樣的問題(在我看來)沒有價值,也沒有答案,因爲沒有人知道這些答案會回答什麼問題。 – 2015-08-15 19:50:17

回答

12

你想要的是一個Cubic Hermite Spline

alt text

其中P0爲起點,P1是終點,M0是起點切線,而m1是終點切線

3

你可以有一個線性插值和一個三次插值,並在兩個插值函數之間插值。

即。

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

+0

我會看看我是否可以解決您的解決方案。但是,理想情況下,我寧願只調整方法中的三次函數: amount =(amount * amount)*(3f - (2f * amount)); 我假設這可以做得相當容易,我只是不知道如何。 – Rob 2009-07-18 00:53:49

+1

如果你想有切線,使用我發佈在 – 2009-07-18 01:33:52

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;