Comprendre quelques opérations de manipulation d'images.
Objectif.
Ce projet vous propose de compléter ce logiciel de dessin
bien connu avec différentes fonctionnalités basiques comme le tracé de
courbes, de lignes droites, de rectangles ou encore le remplissage de
forme et la rotation d'images.
Le but de ce tutoriel est de comprendre comment un code dessine dans une image.
Introduction.
-
Pour commencer, prendre connaissance des fonctionnalités attendues pour ce
logiciel en utilisant la proglet en mode démo (option à cocher en bas
à droite de l'onglet paintbrush). L'option hexa code vous montre que
cette image est en fait constituée de 32 pixels de large sur 32 pixels
de haut (soit 1024 pixels), chaque pixel contenant une couleur encodée
sous la forme d'un nombre entre 0 et 15. Dans ce mode, une couleur est
représentée par son numéro au format hexadécimal :
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.
-
Observez la mise à jour des codes numériques
de chaque pixel lors du remplissage d'une forme par exemple.
-
Passer ensuite en mode proglet, les fonctionnalités précédentes ne
fonctionnent plus ! Vous devez vous même programmer ces
fonctionnalités. Il faut pour cela recopier le squelette de
programme suivant
et compléter chaque fonction.
-
Afin de modifier les pixels de l'image, vous disposez de deux actions possibles :
- getPixel(x,y) renvoie le code couleur du pixel de
coordonnées (x,y).
- setPixel(x,y,couleur) modifie le pixel de coordonnées
(x,y) avec la couleur de numéro
couleur.
-
Chaque abscisse et chaque coordonnée doit varier dans l'intervalle
[0,31]. Une erreur se déclenchera si vous utilisez ces fonctions
hors de ces bornes.
Travail proposé.
-
Compléter la fonction affichePoint qui est utilisée
par le logiciel en mode Tracé à chaque fois qu'il est
nécessaire de colorier un pixel.
-
Compléter la fonction supprimePoint qui est
utilisée par le logiciel en mode Gomme pour effacer une zone
carrée de 3 pixels sur 3 pixels. Effacer un pixel revient à le colorier
avec la couleur de fond (ici le blanc).
-
Compléter la fonction afficheRectangle qui est
utilisée par le logiciel en mode Rectangle. L'utilisateur
désigne un premier point, déplace la souris vers un deuxième point
puis relâche le bouton de la souris. Ces deux points constituent les
extrémités de la diagonale du rectangle à tracer. Le logiciel fait
alors appel à la fonction afficheRectangle en donnant en
argument les coordonnées du premier point, les coordonnées du deuxième
point ainsi que la couleur demandée pour tracer les contours du
rectangle.
-
Compléter la fonction remplir qui est utilisée par
le logiciel en mode Remplir. Les coordonnées données en
paramètres sont celles du pixel sélectionné par l'utilisateur avec son
curseur pot de peinture. Attention cette solution demande un
peu de réflexion pour éviter de faire boucler la procédure de
remplissage mais il existe une solution relativement simple et
concise (penser récursif...)!
-
Compléter la fonction rotationGauche qui est utilisée par le
logiciel lorque l'utilisateur presse le bouton Rotation gauche.
Dans un premier temps, il est conseillé d'employer un tableau
intermédiaire de dimension 32x32. Dans un deuxième temps, essayer
de se passer d'un tableau intermédiaire en employant uniquement
une variable intermédiaire (de type int) dans la boucle interne
de votre programme.
-
Compléter la fonction afficheLigne qui est utilisée
par le logiciel en mode Ligne. L'utilisateur désigne un premier
point, déplace la souris vers un deuxième point puis relâche le bouton
de la souris. Ces deux points constituent les extrémités de la ligne à
tracer. Le logiciel fait alors appel à la fonction
afficheLigne en donnant en argument les coordonnées du
premier point, les coordonnées du deuxième point ainsi que la couleur
demandée pour tracer la ligne. Attention, cette fois
les lignes à tracer ne sont pas forcément horizontales ou
verticales. Comme le montre la figure ci-dessous, il faut savoir faire
des approximations pour allumer les pixels
les plus proches du segment idéal.
Pour réaliser des calculs avec davantage de précision, vous
pouvez manipuler provisoirement les coordonnées avec le
format double.
Pour réaliser la conversion inverse (de double
vers int), il faut prendre la partie entière d'un nombre réel
avec la fonction Java floor(double x).