UGE Paint

La librairie SimpleGraphics

Pour développer notre application, nous allons utiliser la librairie SimpleGraphics.java

Dans un premier temps, téléchargez et exécutez: SimpleGraphicsExample.java

Modifier l'exemple pour afficher les deux diagonales (sous forme de lignes) en plus du rectangle.

Il faut lire la Javadoc de Graphics2D!

Modifier l'exemple pour afficher une ellipse (inscrite) dans le rectangle.

Dessins de lignes

Toutes vos classes pour cet exercice doivent être dans le package fr.uge.poo.paint.ex2 et votre application dans une classe Paint de ce package.

On souhaite prendre en paramètre du programme un fichier simple contenant la description de diffèrentes figures; pour l'instant on supposera que le fichier ne décrit que des lignes.
Le format d'une ligne est le suivant : "line x0 y0 x1 y1".

Exemple de fichier draw1.txt
line 0 0 100 100
line 0 50 100 50

Le programme Paint doit lire le fichier, stocker l'ensemble des figures dans une liste, puis dessiner celles-ci sur l'écran.

On peut lire un fichier ligne à ligne en utilisant le code suivant:

       Path path = Paths.get("figures.txt");
       try(Stream<String> lines = Files.lines(path)) {
         lines.forEach(line -> System.out.println(line));
       }
     
Pour décomposer une ligne en "mots" on peut utiliser String.split et Integer.parseInt comme ceci:
       String[] tokens = text.split(" ");
       int x1 = Integer.parseInt(tokens[1]);
       int y1 = Integer.parseInt(tokens[2]);
       int x2 = Integer.parseInt(tokens[3]);
       int y2 = Integer.parseInt(tokens[4]);
     

Ecrire le code qui prend un fichier en tant que premier argument de la ligne de commande, qui lit celui-ci et stocke l'ensemble des lignes dans une liste.
Puis, dessiner la liste des lignes précédemment obtenues en utilisant la librairie SimpleGraphics.
Vous pouvez tester avec le fichier draw1.txt

Et des ellipses et des rectangles ...

Toutes vos classes pour cet exercice doivent être dans le package fr.uge.poo.paint.ex3. Recopiez vos classes de l'exercice précédent dans ce nouveau package.

On souhaite modifier le programme précédent pour traiter les fichiers décrivant à la fois des lignes, des ellipses et des rectangles.

Le format du fichier d'entrée est étendu naturellement.

Par simplicité, l'ordre des paramètres pour décrire un rectangle ou un ellipse est le même que ceux des fonctions Graphics2D.drawRect et Graphics2D.drawOval.

Vous pouvez tester en utilisant le fichier draw2.txt

Un peu de sélection

Toutes vos classes pour cet exercice doivent être dans le package fr.uge.poo.paint.ex4. Recopiez vos classes de l'exercice précédent dans ce nouveau package.

On souhaite afficher sur la console (au moins dans un premier temps) la figure la plus proche de l'endroit où l'utilisateur a cliqué.
Pour que les choses soient simples, la figure la plus proche est définie comme étant la figure qui a son centre à la distance la plus courte par rapport aux coordonnées de la souris.

La distance entre deux points se calcule avec pythagore et il n'est pas nécessaire de faire une racine carrée car on peut comparer les carrés !

Le code suivant illustre comment on peut écouter les clics de la souris
SimpleGraphicsExampleClick.java

Comment devez-vous modifier votre programme pour prendre en compte cette nouvelle fonctionnalité ?

Il faut gérer l'absence de sélection.

Si vous ne l'avez pas déjà fait, il faut encapsuler la liste des figures dans une classe. Pourquoi est-ce nécessaire ?

Il y a beaucoup de code dupliqué entre Ellipse et Rectangle. Factoriser ce code sans que cela soit visible pour un utilisateur du package.

Toutes vos classes pour cet exercice doivent être dans le package fr.uge.poo.paint.ex5. Recopiez vos classes de l'exercice précédent dans ce nouveau package.

Selection colorée

Modifier le programme précédent pour que au lieu d'afficher la selection sur la console, la figure selectionnée s'affiche en orange.

Sachant que l'on veut garder la figure étant selectionnée dans un champ pour la suite, expliquer pourquoi stocker une couleur dans chaque figure est une erreur.

Implanter le code !