2009-07-18 28 views
14

Poniżej jest funkcja sześciennych interpolacji:sko/Curve Smooth Interpolacja w 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)); 
} 

Funkcja ta kubiczną interpolacji pomiędzy wartością początkową i końcową danej kwoty między 0.0f - 1.0f. Jeśli było wykreślić tę krzywą, by skończyć z czymś takim:

Wygasła Imageshack obrazu usunięto

sześciennej funkcji jest tutaj:

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

Jak to zrobić dostosuj to, aby produkować dwie styczne i wchodzić na zewnątrz?

celu wytworzenia krzywej jak to: (rozpocząć normalny kubicznej końca)

minął Imageshack obrazu usuwa

W jednej funkcji

i tak jak inna (sko początek koniec liniowy)

Wygasły obraz Imageshack usunięty

Ktoś ma jakieś pomysły? Z góry dziękuję.

+2

Zagłosowano, aby zamknąć to pytanie, ponieważ opiera się na obrazach, aby pokazać, jakie jest pytanie/problem, te obrazy najwyraźniej dawno już minęły.Pytanie w tej formie (moim zdaniem) nie ma żadnej wartości, ani nie ma odpowiedzi, ponieważ nikt nie wie, na jakie pytanie odpowiedzi te odpowiadają. –

Odpowiedz

12

Co chcesz to Cubic Hermite Spline:

alt text

gdzie p0 jest punkt początkowy, p1 jest punktem końcowym, m0 to styczna początkowa, a m1 to styczna końcowa.

+1

dzięki Robertowi, za sprawienie, że będzie wyglądać WAY ładniej :) –

+1

Tak. W ten sposób można to zrobić. Kawałek sześcienny interpolantu Hermite'a ma ładną właściwość, że jest po prostu zapewniony, że jest zarówno ciągły, jak i różniczkowalny w punktach przerwania, ponieważ podana jest wartość i pierwsza pochodna na każdym końcu przedziału. To jest, IMHO, bardzo ładny sposób na budowanie kawałków sześciennych. –

3

możesz mieć interpolację liniową i interpolację sześcienną i interpolować między dwiema funkcjami interpolacji.

tj.

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) 

gdzie t jest w zakresie od 0 ... 1

+0

Zobaczę, czy uda mi się sprawić, żeby twoje rozwiązanie działało. Jednak najlepiej byłoby po prostu dostosować funkcję sześcienną w metodzie: kwota = (kwota * kwota) * (3f - (2f * kwota)); Zakładam, że można to zrobić dość łatwo, po prostu nie jestem pewien jak. – Rob

+1

Jeśli chcesz mieć styczne, użyj Cubic Hermite Spline, który zamieściłem poniżej –

0

Cóż, prosty sposób to:

-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 

lub programowo (sześcienne regulacji):

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

Dla drugiego, po prostu pominąć "przeniesienie":

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

lub programowo (sześcienne regulacji):

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