Sujet du projet

Cette page concerne le projet du cours IN201 pour l'année 2015/2016.

Le sujet du projet se trouve ici.

La liste des équipes se trouve ici.

Modèles pour les rapports

Pour écrire vos rapports, vous utiliserez les modèles suivants :

Premier rapport : rapport d'analyse et de conception

Quelques commentaires

La partie analyse de ce premier rapport a pour but de voir si vous avez bien compris le sujet en vous plaçant du point de vue d'un utilisateur de l'application. Il ne s'agit pas ici de trouver une solution au problème posé. Il permet de plus de vous présenter deux nouveaux diagrammes UML : les diagrammes de cas d'utilisation et les diagrammes de séquence (que nous avons aperçus lors de la séance sur les associations).

Vous devez également répartir le travail entre les différents binômes de votre équipe (cf. sujet du projet).

Dans une seconde partie, le rapport doit vous permettre de proposer une solution au problème posé. Pour cela, vous allez devoir concevoir un diagramme de classe présentant les différentes classes et interfaces de votre application et les relations les liant.

Il se peut que vous ayiez besoin de notions qui seront vues plus tard dans le cours. En ce qui concerne les interfaces graphiques, une structuration en paquetages vous permet de considérer un paquetage qui contiendra toutes les classes nécessaires à la construction de l'interface graphique et de ne pas développer plus ce point.

Les diagrammes de séquence demandés dans cette partie du rapport sont différents des diagrammes du premier rapport d'analyse : ils ne concernent pas les interactions entre l'utilisateur et le système, mais les appels de méthodes entre les objets de vos classes. Il ne s'agit pas d'en faire pour chaque scénario possible, mais vous devez en produire quelques-uns qui doivent permettre de mieux comprendre les interactions entre les objets que vous allez utiliser. Ils sont donc à « réserver » pour les interactions les plus complexes qui vont exister à l'intérieur de votre application.

Tutoriel ArgoUML

Si vous souhaitez utiliser ArgoUML, vous trouverez un petit tutoriel ici qui vous présentera comment créer un diagramme de classes et générer le code Java correspondant.

Documents à rendre

Ce rapport est à déposer pour le 19 novembre 2015 23h00 sur le dépôt de votre équipe.

Vous déposerez également à la même date dans le dépôt SVN correspondant à votre équipe les squelettes documentés des classes Java à développer ainsi que les éventuelles classes de test que vous pouvez déjà fournir.

On rappelle que le dépôt associé à l'équipe tNUM rattachée à la PC GPE est https://eduforge.isae.fr/repos/IN201/GPE/tNUM.

Implantation

Utiliser BufferedImage

Pour stocker les images, je vous ai conseillé un objet de type java.awt.BufferedImage qui permet d'obtenir une image que l'on peut modifier. En particulier, cette classe possède une méthode setRGB(int i, int j, int RGB) qui permet de positionner la couleur du pixel de coordonnées (i,j). Reste à savoir comment calculer la couleur à passer en paramètre...

Avec le modèle par défaut, la couleur du pixel est représentée par quatre entiers dont les valeurs sont comprises entre 0 et 255 (donc sur 1 octet chacune) représentant respectivement les « valeurs » sur le canal Alpha (transparence), puis Rouge, Vert et Bleu. Ces quatre couleurs sont stockées sous la forme d'un seul entier que l'on décompose ainsi :

Comment faire alors pour construire l'entier correspondant à la couleur (128, 56, 200) par exemple ? Il faut utiliser l'opérateur de décalage de bits << qui permet de décaler un entier d'un certain nombre de bits à gauche. Pour notre couleur (128, 56, 200), on doit construire un entier de 3 octets de la façon suivante :

On obtient donc l'entier correspondant à (128, 56, 200) avec un canal alpha de 255 par (255 << 24 + 128 << 16) + (56 << 8) + 200.

Pour récupérer les valeurs, il suffit de décaler dans l'autre sens et d'appliquer un masque pour ne récupérer que les octets intéressants.

Vous trouverez ici un petit programme Java qui travaille avec une image (vous pouvez utiliser celle-là).

Écrire un programme permettant de gérer des options via la ligne de commande

Il vous est demandé de permettre à l'utilisateur de choisir facilement entre une utilisation de votre application via une interface graphique ou via la ligne de commande. Pour faire cela, il faut récupérer des arguments sur cette ligne de commande. Dans la méthode main d'une classe applicative, on peut récupérer ce que l'utilisateur a écrit lors de l'appel à la JVM dans l'argument args de type String[] de la méthode.

Par exemple, si on exécute java MonApp blabla coucou alors args[0] vaut "blabla" et args[1] vaut "coucou". Je vous propose ici un petit programme qui permet d'utiliser les arguments de la ligne de commande pour déterminer si l'utilisateur veut utiliser l'interface graphique ou pas et d'afficher éventuellement une aide pour l'utilisation de l'application.

Si vous voulez transformer les chaînes de caractères ainsi récupérées en nombre, il faut utiliser les méthodes statiques des classes Integer, Double etc. comme parseInt, parseDouble etc. Attention dans ce cas aux exceptions qui peuvent être levées si la chaîne de caractères ne correspond pas au type attendu (par exemple si on essaye de transformer "blabla" en entier).

Vous trouverez un exemple ici. J'utilise la syntaxe classique des applications Unix. Quelques exemples d'appels :

java MyApp -h
java MyApp blabla coucou --help
java MyApp -gui
java MyApp -cli

Attention, je ne vérifie pas ici que l'on ne met pas les deux options en même temps etc. À vous de modifier cette classe pour l'adapter à votre application.

Vous pouvez également utiliser des bibliothèques plus évoluées permettant de créer des applications en ligne de commande comme :

Je suis perdu, j'ai mal à la tête et j'ai envie de passer mon ordinateur (ou C. Garion) par la fenêtre

N'hésitez pas à contacter votre PC(wo)man (qui peut être occupé(e) et ne pas répondre immédiatement) ou C. Garion pour plus d'explications. Il faut dans ce cas envoyer un mail clair avec des explications sur ce qui ne fonctionnent pas (dans quel cas les erreurs se produisent-elles par exemple).