:: Enseignements :: ESIPE :: E4INFO :: 2008-2009 :: Compilation :: Petit langage d'animation de formes graphiques ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Petit langage d'animation de formes graphiques |
Le but de ce projet est d'implémenter un compilateur d'un petit langage d'animation de formes graphiques.
Présentation générale
Le but du projet est de réaliser un compilateur d'un petit langage d'animation de formes graphiques.
Ce petit langage décrit des formes graphiques et indique leurs diverses trajectoires et transformations (rotation, changement de couleur) dans le temps.
Le cadre graphique est donné.
Il s'agira juste de générer, à partir du langage, une classe qui indiquera à chaque rafraichissement les diverses propriétés des formes (position, couleur, rotation, ...).
Le code généré par le compilateur sera du code assembleur Jasmin, à partir duquel il est facile de générer une classe en Bytecode.
Le code ci-dessous devra générer l'animation suivante :
Vous noterez que l'animation est cyclique.
Que faire?
Le programme d'animation
IrFX est donné dans l'archive
irfx.zip.
Il dessine une fenêtre comportant les formes qui bougent et se transforment.
Pour chaque rafraichissement, il utilise une classe
Generated qui possède une méthode renvoyant la liste des formes avec leurs propriétés à l'instant de son appel.
Votre projet consistera à implémenter un système qui compilera un script
irfx en une classe
Generated.
Dans les faits, il générera un code assembleur Jasmin qui sera lui même transformé en une classe Bytecode par le programme
jasmin (cf TD).
Cette classe comportera :
- un constructeur prenant la durée d'un cycle en milliseconde (de type int) en paramètre
- une méthode public List<MovingShape> getCurrentMovingShapes() qui retourne la liste des formes avec leurs propriétés à l'instant de son appel.
La classe
MovingShape correspond à une forme graphique et ses propriétés:
- la forme initiale : shape
- l'angle de rotation (en radian) par rapport à la forme initiale : rotation
- la position (x,y) dans le plan ayant pour origine la position initiale de la forme
- la couleur color
- les facteurs de grossissement scaleX et scaleY
Les sources de la classe Generated de l'applet ci-dessus se trouve dans l'archive.
Dans le projet, le script irfx remplace Generated.java.
Il sera compilé en Generated.class.
Dans l'archive, il existe aussi une classe utilitaire
IrFXUtils.
Elle contient notamment :
- la méthode public static MovingShape getCurrentMovingShapeWithLinearRegression(
MovingShape ms1,
MovingShape ms2,
double t) qui renvoie la MovingShape à un instant t compris entre O et 1, étant donnés deux MovingShape aux instants 0 et 1, selon une méthode de régression linéaire.
- la méthode public static MovingShape getCurrentMovingShapeWithBezier(
MovingShape ms1,
MovingShape ms2,
MovingShape ms3,
double t) qui renvoie la MovingShape à un instant t compris entre O et 1, au moyen des courbes de Bezier utilisant 3 points de controle (3 MovingShape).
- la méthode public static MovingShape getCurrentMovingShapeWithBezier(
MovingShape ms1,
MovingShape ms2,
MovingShape ms3,
MovingShape ms4,
double t) qui renvoie la MovingShape à un instant t compris entre O et 1, au moyen des courbes de Bezier utilisant 4 points de controle (4 MovingShape).
Niveau 1 : la base
Le premier niveau consiste à implémenter un compilateur du langage minimal décrit par le script ci-dessus.
Le script comporte:
- l'importation des différentes classes utilisées implémentant l'interface java.awt.Shape (ex. java.awt.Rectangle)
- les propriétés par défaut des formes graphiques
- la définition des différentes formes utilisées en utilisant le constructeur de la classe associée
- la manière de calculer la trajectoire des formes (régression linéaire ou calcul des courbes de bezier)
- à différents moments du cycle d'animation (définis en pourcentage par rapport à la durée du cycle), la position et les transformations de chaque forme.
Il existe cinq types de base int, float, double, colorString et Shape.
Le type colorString est une chaîne de caractères (encadrée de simples quotes) qui correspond à un champ statique de la classe Color en Java.
Le type Shape correspond à l'interface java.awt.Shape en Java.
Pour assigner des valeurs aux différentes propriétés des formes, il existe des procédures prédéfinies :
- color(c) : assigne la couleur c avec c de type colorString
- color(r,g,b) : assigne la couleur avec les trois valeurs RGB (r, g et b sont des int compris entre 0 et 255)
- color(r,g,b,alpha) : assigne la couleur avec les trois valeurs RGB avec le degré de transparence alpha; toutes ces valeurs sont des entiers compris entre 0 et 255.
- position(x,y) : donne la position en abscisse x (de type int) et en ordonnée y (de type int) dans le plan ayant pour origine la position initiale de la forme
- rotate(r) : donne le degré de rotation r (de type double) en radian par rapport à la forme initial
- scale(scx,scy): donne le degré de grossissement selon l'axe des abscisse (scx de type double) et l'axe des ordonnées (scy de type double) par rapport à la forme initiale
Pour indiquer la méthode de calcul de la trajectoire, il existe deux méthodes:
- régression linéaire (par défaut): linearRegression
-
courbes de Bezier avec 3 points de controle: bezier(x1,x2,x3)
-
courbes de Bezier avec 4 points de controle: bezier(x1,x2,x3,x4)
Les courbes de Bezier ne permettent pas de respecter le temps, alors que la régression linéaire le permet.
Niveau 2 : procédures
Un script de niveau 2 incorpore les procédures comme montré ci-dessous:
Les procédures ont des arguments typés et permettent de faire des opérations sur les formes.
Vous noterez que les arguments peuvent être des expressions arithmétiques !
Niveau 3: tableaux et boucles for
Un script de niveau 3 intègre les boucles for et les tableaux de formes.
Ceci permet la création et l'animation dynamique de plusieurs formes comme montré dans l'exemple ci-dessous :
Dans l'exemple précédent, le bout de code suivant permet de réaliser une boucle qui parcourt le tableau.
A chaque itération i, on définit la couleur de la forme t[i], ie élément du tableau t de formes.
Vous noterez que N est une constante entière qui a été définie en début de script !
for i:
t[i] {color(10*i,10*i,10*i);}
Vous pourrez rajouter des instructions conditionnelles dans la boucle du type:
for i:
when i < N -1 then:
t[i] {color(10*i,10*i,10*i);}
Bonus
Le bonus consiste à proposer et implémenter des modifications au petit langage pour améliorer l'application.
Attention: la notation tiendra compte de la difficulté technique des améliorations proposées.
Modalités de rendu
Le projet doit se faire en binome.
Vous devrez présenter vos projets lors d'une soutenance de 15 minutes fin mai 2009.
La soutenance consistera en :
- une présentation générale de votre compilateur avec slides (5 min)
- une démonstration (5 min)
- des questions diverses (5 min)
Vous devez envoyer à votre chargé de TD une archive
<nom1>_<nom2>_IrFX.zip contenant votre projet pour le
18 mai 2009.
Cette archive contiendra vos sources, un script permettant de compiler votre code plus un script pour exécuter.
© Université de Marne-la-Vallée