INF220 - TP Séance 1
Durée : 2h00
Objectifs
- Utiliser la récursivité.
- Dessiner un cerisier en fleurs.
Au menu
- Consignes
- Principe du dessin récursif de l'arbre
- Amélioration du dessin de l'arbre
- Ajout des fleurs
L'objectif de ce TP est de dessiner un cerisier en fleurs
Lisez attentivement cet énoncé de TP
en suivant les instructions.
En cas d'interrogation,
faites appel à moi,
que ce soit pour en savoir plus sur un des points abordés pendant le TP, ou
pour savoir comment effectuer une des tâches demandées (numérotées pour pouvoir
y faire référence simplement).
Surtout
ne restez pas bloqué(e) sur une des questions.
Entre parenthèses, à côté des titres de sous-sections, est indiqué
le temps que vous avez dû passer à effectuer les étapes précédentes.
question(); ?>Téléchargez le
fichier INF220TP1.java qui contient
le code permettant de dessiner une maison, que nous avions
créé lors d'un TP précédent.
question(); ?>Compilez et exécutez ce code.
On retrouve dans ce code des fonctions déjà utilisées précédemment :
- NombreAleatoire qui prend deux
entiers comme paramètres d'entrée, et tire un entiers compris (au sens large)
entre ces deux entiers.
- dessineRectangle(Graphics g, int abscisseCoin, int ordonneeCoin, int largeur, int hauteur, Color couleur)
qui dessine sur l'objet g un rectangle vide dont la bordure est de couleur
Color, et dont le coin en haut à gauche a pour coordonnées (abscisseCoin,ordonneeCoin),
et qui a pour largeur largeur et pour hauteur hauteur
- dessineRectanglePlein(Graphics g, int abscisseCoin, int ordonneeCoin, int largeur, int hauteur, Color couleur),
qui dessine sur l'objet g un rectangle dont l'intérieur est coloré de la même couleur
Color que la bordure, dont le coin en haut à gauche a pour coordonnées (abscisseCoin,ordonneeCoin),
et qui a pour largeur largeur et pour hauteur hauteur
- dessineLigne(Graphics g, int abscisse1, int ordonnee1, int abscisse2, int ordonnee2, Color couleur),
qui dessine sur l'objet g une ligne commençant au point de coordonnées
(abscisse1,ordonnee1) et se terminant au point de coordonnées (abscisse2,ordonnee2).
- couleurRGB(int r,int g,int b) qui renvoie une couleur, de type Color,
qui est une combinaison de rouge, vert et bleu, ces trois couleurs correspondant
aux variables d'entrée r, g et b qui sont des entiers entre
0 et 255.
question(); ?>Créez une fonction dessineArbre qui prend en entrée un objet Graphics g,
deux entiers abscisseBas et ordonneeBas, un entier niveau,
et ne renvoie rien. Dans la suite de ce TP, nous allons remplir cette
fonction pour qu'elle dessine un arbre dans la fenêtre graphique
g,
dont la base du tronc se situe au point de coordonnées
(
abscisseBas,
ordonneeBas), et dont le nombre de paliers (en hauteur)
est donné par l'entier
niveau.
question(); ?>Ajoutez une instruction à l'intérieur de la fonction dessineArbre
pour dessiner le tronc de l'arbre : une ligne verticale brune de 50 pixels
de hauteur (dessin 1 ci-dessous).
question(); ?>Appelez l'algorithme
dessineArbre depuis la fonction paint pour que le tronc soit
effectivement ajouté au dessin. Réglez les coordonnées pour que le tronc soit
bien planté dans le gazon (la partie verte), comme dans le dessin 1
ci-dessous.
On passe maintenant au coeur de l'algorithme de dessin du haut de l'arbre
(la partie au-dessus du tronc), que l'on va gérer par un algorithme récursif.
Le principe est que pour construire le haut d'un
arbre de niveau
n+1, on va construire, en haut du point où
on vient d'arriver (le haut du tronc) deux branches, une vers la
gauche, une vers la droite, et en haut de chacune de ces branches
on va construire un arbre de niveau
n.
En suivant ce principe,
question(); ?>écrivez un algorithme récursif
dessineHautArbre, qui prend en entrée un objet Graphics g,
deux entiers abscisseBas et ordonneeBas, et un entier
n, et qui, en partant du point de coordonnées
(abscisseBas,ordonneeBas), dessine
deux branches :
- une vers la gauche (20 pixels vers la gauche, 50 pixels vers le haut)
- une vers la droite (20 pixels vers la droite, 50 pixels vers le haut)
puis, au-dessus de chaque branche, s'appelle lui-même pour dessiner
le haut d'un arbre de niveau
n-1.
question(); ?>Appelez cet algorithme
dessineHautArbre dans l'algorithme dessineArbre
afin de dessiner un arbre de niveau 5 (dessin 2 ci-dessous).
La structure de l'arbre est trop régulière et les branches se touchent
et se recouvrent. Pour éviter cela,
question(); ?>au lieu de dessiner
des branches de hauteur 50, dessinez des branches de hauteur aléatoire
entre 10 et 50 (dessin 3 ci-dessous).
On va tenter d'améliorer le dessin de l'arbre pour le rendre plus
réaliste.
Afin de permettre de dessiner des branches d'épaisseur différente,
question(); ?>écrivez
une fonction dessineBranche
qui prend les mêmes entrées que dessineLigne,
avec une entrée supplémentaire : un entier epaisseur.
Elle dessine alors pas seulement une ligne, mais
epaisseur lignes décalées de 1 pixel vers la droite.
Utilisez cette fonction dessineBranche, avec une épaisseur
égale au niveau de l'arbre,
afin de dessiner le tronc de l'arbre (dessin 4 ci-dessous).
question(); ?>Utilisez la fonction
dessineBranche à l'intérieur
de l'algorithme dessineHautArbre pour que l'épaisseur
varie en fonction du niveau (dessin 5 ci-dessous) : à
chaque fois que le niveau baisse de 1, l'épaisseur aussi.
On finira au prochain TP les améliorations du dessin de l'arbre
(branches plus petites en haut, nombre de branches aléatoire
aux embranchements, etc.). Si vous avez terminé en avance, revenez à
l'exercice
bonus du TP5 sur le jeu des tours de Hanoï pour le terminer.
On verra au prochain TP comment dessiner les fleurs en ajoutant
des petits ovales blancs et roses aux bons endroits.