2009-07-18 9 views
14

Voici une fonction d'interpolation cubique:cubique/courbe lisse en C Interpolation #

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

Cette fonction interpoler entre le cubiquement début et la valeur finale donnée un montant entre 0.0f - 1.0f. Si vous deviez tracer cette courbe, vous finiriez avec quelque chose comme ceci:

Image Périmé Imageshack enlevé

La fonction cubique est ici:

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

Comment puis-je ajuster ceci pour produire deux tangentes produisent et sortent?

Pour produire des courbes similaires à: (Linear début et la fin cubique)

Expiré l'image Imageshack enlevé

Comme une fonction

et de ce que l'autre: (début cubique à fin linéaire)

Expiré Imageshack image retirée

Vous avez des idées? Merci d'avance.

+2

A voté pour la suppression de cette question puisqu'elle se fonde sur des images afin de montrer quelle est la question/le problème, d ces images ont apparemment disparu depuis longtemps.La question telle qu'elle se présente (à mon avis) n'a aucune valeur et n'a pas de réponse, car personne ne sait à quelle question répondent ces réponses. –

Répondre

12

Ce que vous voulez est un Cubic Hermite Spline:

alt text

où p0 est le point de départ, p1 est le point final, m0 est la tangente de départ, et m1 est la tangente de fin

+1

merci Robert, pour que ça fasse WAY plus mignon :) –

+1

Oui. C'est le moyen de le faire. Un interpolant d'Hermite cubique par morceaux a la bonne propriété d'être simplement continu et différentiable à travers les points de rupture, parce que la valeur et la dérivée première à chaque fin d'un intervalle sont données. C'est, à mon humble avis, une très belle façon de construire un cubique par morceaux. –

3

vous pourriez avoir une interpolation linéaire et une interpolation cubique et interpoler entre les deux fonctions d'interpolation.

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) 

où t varie de 0 ... 1

+0

Je vais voir si je peux obtenir votre solution de travail. Cependant, idéalement, je préfère juste ajuster la fonction cubique dans la méthode: montant = (montant * montant) * (3f - (2f * montant)); Je suppose que cela peut être fait assez facilement, je ne suis pas sûr de savoir comment. – Rob

+1

Si vous voulez avoir des tangentes, utilisez la Spline Cubic Hermite que j'ai posté ci-dessous –

0

Eh bien, un moyen simple serait la suivante:

-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 

ou par programmation (réglage cubical):

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

Pour l'autre, il suffit de laisser le "mouvement":

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

ou par programmation (réglage cubical):

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