
Si l'on désire encore accentuer l'effet d'inertie comme entrevue avec les fonctions à base de polynômes, rien ne vaut l'exponentielle à base 2.
Prenons le cas de la fonction d'easing de type In. L'idée est d'appliquer à 2 un exposant variant entre 10 fois la fraction d'interpolation effectuée à laquelle on ôte 1 (soit 100%) pour obtenir un nombre négatif. La valeur retournée par l'exposant variera entre -9 et 0 : il faudra simplement faire attention au départ jamais atteint puisque le premier pas (AStep) vaut 1. De son côté, l'exponentielle à base 2, affectée d'un tel exposant, renverra une valeur entre tout près de 0 et 1, ce qui permettra de l'appliquer comme le multiplicateur de AChange.
Par conséquent, la catégorie des fonctions Expo sera implémentée ainsi :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | function TMainForm.EaseInExpo(AStart, AChange, AStep: Single): Single; // *** INEXPO *** begin Result := ifthen(AStep = 0, AStart, AChange * Power(2, 10 * (AStep / fDuration - 1)) + AStart); end; function TMainForm.EaseOutExpo(AStart, AChange, AStep: Single): Single; // *** OUTEXPO *** begin Result := ifthen(AStep = fDuration, AChange + AStart, AChange * (- Power(2, -10 * AStep / fDuration) + 1) + AStart); end; function TMainForm.EaseInOutExpo(AStart, AChange, AStep: Single): Single; // *** INOUTEXPO *** begin if AStep = 0 then Result := AStart else if AStep = fDuration then Result := AChange + AStart else begin AStep := AStep / fDuration * 2; if AStep < 1 then Result := AChange / 2 * Power(2, 10 * (AStep - 1)) + AStart else Result := AChange / 2 * (- Power(2, - 10 * (AStep - 1)) + 2) + AStart; end; end; function TMainForm.EaseOutInExpo(AStart, AChange, AStep: Single): Single; // *** OUTINEXPO *** begin if AStep < fDuration / 2 then Result := EaseOutExpo(AStart, AChange / 2, AStep * 2) else Result := EaseInExpo(AStart + AChange / 2, AChange / 2, AStep * 2 - fDuration); end; |

Dans le même esprit, nous allons définir des fonctions à base de cercle, c'est-à-dire s'appuyant sur l'équation cartésienne du cercle trigonométrique x² + y² = 1 ou encore y² = 1 - x². Voilà encore une valeur unitaire particulièrement intéressante ! Pour obtenir l'ordonnée y, il suffira de calculer la racine carrée de 1- x² (forcément positive ou nulle dans le cercle trigonométrique de rayon 1).
Les fonctions relatives au cercle de la catégorie Circ auront l'implémentation suivante :
Code delphi : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | function TMainForm.EaseInCirc(AStart, AChange, AStep: Single): Single; // *** INCIRC *** begin Result := - AChange * (Sqrt(1 - Power(AStep / fDuration, 2)) - 1) + AStart; end; function TMainForm.EaseOutCirc(AStart, AChange, AStep: Single): Single; // *** OUTCIRC *** begin Result := AChange * Sqrt(1 - Power(AStep / fDuration - 1, 2)) + AStart; end; function TMainForm.EaseInOutCirc(AStart, AChange, AStep: Single): Single; // *** INOUTCIRC *** begin AStep := AStep / fDuration * 2; if AStep < 1 then Result := - AChange / 2 * (Sqrt(1 - Power(AStep, 2)) - 1) + AStart else Result := AChange / 2 * (Sqrt(1 - Power(AStep - 2, 2)) + 1) + AStart; end; function TMainForm.EaseOutInCirc(AStart, AChange, AStep: Single): Single; // *** OUTINCIRC *** begin if AStep < fDuration / 2 then Result := EaseOutCirc(AStart, AChange / 2, AStep * 2) else Result := EaseInCirc(AStart + AChange / 2, AChange / 2, AStep * 2 - fDuration); end; |
Forts de notre expérience, nous nous lancerons lors du prochain épisode dans des fonctions encore plus spectaculaires avec effets d'élastique, de rebond et d'aller-retour. A très bientôt !

Vous avez lu gratuitement 815 articles depuis plus d'un an.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.
Soutenez le club developpez.com en souscrivant un abonnement pour que nous puissions continuer à vous proposer des publications.