Simuler une phénomène naturel en utilisantl'animation est un moyen excellent pour l'enseigner et pour l'expliquer. Cette approche permet, aussi, de modifier les différents paramètres et voir les différents scénarios possibles avec un coût (pratiquement) nul.
Dans cet exemple, nous allons simuler une chute libre dans le vide. Pour rendre la simualtion un peu plus réel, nous allons ajouter un effet de rebond par définir un facteur de préservation de l'énergie au moement de l'impact au sol.
L'objet en question est une boule. Elle sera définie comme un objet séparé pour donner la possibilité de comparer plsuieurs chutes avec des paramètres différents.
Le problème peut être modélisé suivant deux approches :
Dans cet exemple, nousa allons suivre cette deuxième approche. Le passage d'un instant à l'instant suivant est implémenté sous la forme d'une fonction que nous appelerons chaque intervalle du temps (un autre paramètre que nous pouvons modifier à notre guise).Dans cet exemple, nous allons simuler une chute libre dans le vide. Pour rendre la simualtion un peu plus réel, nous allons ajouter un effet de rebond par définir un facteur de préservation de l'énergie au moement de l'impact au sol.
L'objet en question est une boule. Elle sera définie comme un objet séparé pour donner la possibilité de comparer plsuieurs chutes avec des paramètres différents.
Le problème peut être modélisé suivant deux approches :
- L'utilisation des équations en fontion du temps "t", la position et la vitesse de l'objet seront calculées en fontion de l'instant "t" de l'animation.
- En utilisant des suites pour la vitesse te la position. Les paramètres de l'instant "t" seront obtenus en fontion des paramètres de l'instant "t - 1".
Le code principal est très simple. Il initialise l'environnement et déclare une boule. Chaque fois, il dessine la boule avec sa position, sa vitesse et son énergie.
Boule b; void setup(){ size(600, 400); b = new Boule(100, 0, 50, 10, 0.9f); } void draw(){ background(255); b.draw(); if(frameCount % 6 == 0) b.instantSuivant(); fill(0); text("" + b.getVitesse(), 10, 30); text("" + b.getEnergie(), 10, 50); text("" + b.getY(), 10, 70); };
Le code de l'objet Boule permet de garder les différentes information de la boule, de simuler la chute et de déssiner la boule :
class Boule { public final static float G = 1f; float preservation; int x, y, diametre, vitesse, masse, energie; public Boule(int x, int y, int diametre, int masse, float preservation){ this.x = x; this.y = y; this.diametre = diametre; this.masse = masse; this.preservation = preservation; } public void instantSuivant(){ y += vitesse; energie = masse * vitesse * vitesse / 2; if(y >= height - diametre / 2){ vitesse = (int)(-1 * preservation * Math.sqrt(2 * energie / masse)); }else{ vitesse += G; } } public void draw(){ fill(255); stroke(0); ellipse(x, y, diametre, diametre); } public int getVitesse(){ return vitesse; } public int getEnergie(){ return energie; } public int getY(){ return y; } public int getX(){ return x; } }
La fonction qui nous intéresse le plus est la fonction "instantSuivant()". Elle montre le changement appliqué sur la vitesse :
public void instantSuivant(){ y += vitesse; energie = masse * vitesse * vitesse / 2; if(y >= height - diametre / 2){ vitesse = (int)(-1 * preservation * Math.sqrt(2 * energie / masse)); }else{ vitesse += G; } }
- Si l'objet est en chute, la vitesse est influencée par la gravité seulement.
- Si la boule touche le sol, la gravité n'est plus appliquée mais c'est le rebond qui repousse la boule vers le haut.
Nous pouvons facilement ajouter une autre boule pour comparer les deux chutes :
Boule b1, b2; void setup(){ size(600, 400); b1 = new Boule(100, 0, 50, 10, 0.9f); b2 = new Boule(200, 0, 80, 10, 0.5f); } void draw(){ background(255); b1.draw(); b2.draw(); if(frameCount % 6 == 0){ b1.instantSuivant(); b2.instantSuivant(); } fill(0); text("b1", 10, 10); text("" + b1.getVitesse(), 10, 30); text("" + b1.getEnergie(), 10, 50); text("" + b1.getY(), 10, 70); text("b2", 10, 90); text("" + b2.getVitesse(), 10, 110); text("" + b2.getEnergie(), 10, 130); text("" + b2.getY(), 10, 150); };



