Infographie 2D - Projet

mer. 16 septembre 2009

Simulation d'une barre en équilibre

L'objectif de ce projet est de développer une petite application de simulation 2D d'une barre homogène en équilibre instable à partir des notions vues en cours/TD et des modules écrits en TP.

Evaluation : il est impératif que vous suiviez à la lettre les consignes qui suivent. Ce projet doit être constitué de modules, comportant chacun le fichier des en-têtes, le(s) fichier(s) source(s) ainsi qu'un fichier de tests. Chaque fichier doit avoir un nom éloquent, et contenir le nom de son auteur. Le fichier des en-têtes comportera toute explication permettant de comprendre la fonction et la structure du module, il tiendra donc lieu de documentation du module. Par ailleurs, le fichier principal contiendra toutes les informations nécessaires à l'utilisation du programme final. Un "makefile" accompagnera le tout, indépendant de l'organisation des répertoires de son auteur. Les droits des fichiers seront choisis de tel sorte que les correcteurs puissent prendre connaissance de leur contenu. L'ensemble des fichiers sources, sans l'exécutable, sera rassemblé dans une archive de type "tar file". La non observation de ces consignes simples sera systématiquement sanctionnée par des malus cumulatifs appliqués à la note finale. La notation de ce projet prendra aussi en compte : le respect du cahier des charges, l'efficacité des fonctions graphiques, ainsi que la robustesse, la lisibilité et la modularité de votre code.


Etude théorique

Cette simulation porte sur la recherche de la position à l'équilibre d'une barre homogène, à partir des mouvements de l'utilisateur à la souris dans le plan 2D. Le schéma ci-dessous permet de modéliser le problème :

schéma du pendule

A représente la position de l'extrémité du doigt en fonction de t ; G est le centre de masse de la barre homogène ; R une réaction du support (inconnue) et theta l'angle d'inclinaison de la barre par rapport à la verticale.

Après résolution du système d'équations associées, on trouve la loi des mouvements suivante :

loi des mouvements

qui définit l'accélération angulaire. Le vecteur k étant perpendiculaire au plan, le produit vectoriel revient à calculer un déterminant.

Soit ur définit par (-sin theta, cos theta) et l'accélération gamma de A par (aa, ab) on a :

formule finale

On peut introduire un facteur d'amortissement k dans l'équation de l'accéleration angulaire par la relation :

amortissement

On rappelle que l'accélération angulaire permet de calculer la vitesse angulaire, qui permet à son tour de calculer l'angle, soit :

vitesse et position angulaire

Implantation

La simulation proprement dite doit demander à son lancement : la position et la longueur l de la barre, les dimensions et la position de la window, les dimensions et la position de la viewport ainsi que l'inclinaison theta initiale. Une fois la projection dans l'espace écran effectuée, l'ensemble de la simulation doit se faire dans cet espace. On remarque en effet que les mouvements de la souris de l'utilisateur, qui conditionnent les calculs de vitesse et d'accélération du doigt, sont calculés en pixels.

L'affichage utilisera les fonctions implantées lors des précédents TP, en particulier le tracé de segments de droite par l'algorithme de Bresenham.

Cette simulation, comme c'est le cas la plupart du temps, est très sensible aux approximations numériques. On prendra donc quelques précautions particulières. Afin d'éviter la propagation des erreurs d'arrondis, on effectuera tous les calculs d'angle en radian et on calculera la nouvelle position de la barre à partir de sa position vecticale au repos (et non incrémentalement comme on pourrait être tenté de le faire). De même, on effectuera le calcul de l'accéleration, de la vitesse et donc de l'angle à partir d'un petit δt (0,001 par exemple), quitte à interpoler tous les 10 ou 20 résultats afin de conserver un affichage relativement fluide.

Pour les plus courageux, il serait bon de tester quand la barre touche un bord de la viewport et de réagir en conséquence (choc élastique, non élastique, ...).