2009-07-18 8 views
14

Unten ist eine kubische Interpolationsfunktion:Cubic/Kurve glatte Interpolation in C#

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)); 
} 

Diese Funktion wird kubisch zwischen dem Anfangs- und Endwert interpoliert eine Menge zwischen 0.0f gegeben - 1.0f. Wenn Sie diese Kurve zeichnen, würde man mit etwas am Ende wie folgt:

Expired Images Bild entfernt

Die kubische Funktion ist hier:

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

Wie ich tun Stellen Sie dies so ein, dass zwei Tangenten ein- und ausgehen.

um Kurven wie folgt zu erzeugen: (Linear zu kubischen Ende Start)

Images Bild entfernt Abgelaufene

Als eine Funktion

und wie der andere dies als: (Cubic Start lineares Ende)

Abgelaufenes Imageshack Bild entfernt

Wer hat irgendwelche Ideen? Danke im Voraus.

+2

Voted um diese Frage zu schließen, da es auf Bildern beruht, um zu zeigen, was die Frage/Problem ist, ein d diese Bilder sind anscheinend lange weg.Die Frage, wie sie so steht (meiner Meinung nach) hat keinen Wert, noch hat sie die Antwort, weil niemand weiß, welche Frage diese Antworten beantworten. –

Antwort

12

Was Sie wollen, ist ein Cubic Hermite Spline:

alt text

wo p0 der Startpunkt ist, p1 ist der Endpunkt, m0 ist die Starttangente und m1 ist die Endtangente

+1

dank Robert gepostet habe, damit es schöner aussieht :) –

+1

Ja. Dies ist der Weg, dies zu tun. Ein stückweise kubisches Hermite-Interpolationsmittel hat die nette Eigenschaft, dass es einfach sichergestellt ist, sowohl kontinuierlich als auch differenzierbar über die Bruchpunkte zu sein, da der Wert und die erste Ableitung an jedem Ende eines Intervalls gegeben ist. Dies ist, IMHO, eine sehr schöne Art, eine stückweise kubische Form aufzubauen. –

3

Sie könnten eine lineare Interpolation und eine kubische Interpolation haben und zwischen den beiden Interpolationsfunktionen interpolieren.

dh.

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) 

wobei t im Bereich von 0 ... 1

+0

Ich werde sehen, ob ich Ihre Lösung zum Laufen bringen kann. Idealerweise würde ich aber lieber die kubische Funktion in der Methode anpassen: Menge = (Menge * Menge) * (3f - (2f * Menge)); Ich gehe davon aus, dass das ziemlich leicht gemacht werden kann, ich bin nur nicht sicher, wie. – Rob

+1

Wenn Sie Tangenten haben möchten, verwenden Sie den Cubic Hermite Spline, den ich unter –

0

Nun, ein einfacher Weg wäre dies:

-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 

oder programmatisch (kubisch Stell):

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

Für die anderen, einfach auslassen die "bewegte":

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

oder programmatisch (kubisch Stell):

double amountdiv2 = amount/2; 
amount = -4 * amountdiv2 * amountdiv2 * amountdiv2 + 6 * amountdiv2 * amountdiv2;