Académique Documents
Professionnel Documents
Culture Documents
Université de Montpellier II
2007-2008
Rapport de Projet
Visualisation de Graphes
Groupe 10 :
Edouard CUNIBIL
Emilie GENNARI
Benoit LANGE
Vincent MARTINEZ
Remerciements
Lors d’une réunion avec nos tuteurs (Anne-Elisabeth BAERT et Vincent BOUDET), nous
avons appris leur dégout certain pour la section d’un rapport concernant les remerciements. Nous
en avons donc déduit qu’ils ne la liraient certainement pas et donc nous avons décidé de ne pas
les remercier ! Par ailleurs, nous ne remercions pas non plus plus les personnes qui nous ont
aidés directement (Guilhem BARLOY par exemple) ou indirectement (tous les auteurs cités dans
la Bibliographie page 49 ou dans la Webographie page 50). Notre ingratitude sans bornes touche
également les quelques personnes, dont nous ne citerons bien évidemment pas les noms, ayant testé
notre application, nous ayant permis de la corriger et de l’améliorer grandement. Comble de l’égoı̈sme,
nous ne remercions pas non plus nos parents sans qui rien de tout ceci n’aurait été possible, ni
même nos enseignants qui, depuis l’école maternelle, ne nous ont inculqué que des notions qui ont
toutes eu leur utilité dans ce projet.
Toutefois, nous aimerions dire un grand merci aux personnes qui liront ce rapport et à la
société Druide informatique inc. Aux premiers parce qu’il y a de fortes chances que vous soyez l’une
des personnes sus-citées ; aux seconds parce que sans vous et votre logiciel (Antidote) les premiers
n’auraient surement pas été bien nombreux.
3 Remerciements
Visualisation de Graphes - Rapport de projet
Avant propos
Avant propos 4
Visualisation de Graphes - Rapport de projet
Page de garde 1
Avant propos 3
Introduction 9
2 Analyse du projet 11
2.1 Le sujet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.1 Définition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.1.2 Approfondissement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 Choix des outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3 Modèle MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3.1 Architecture générale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3.1.1 Modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.3.1.2 Vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.1.3 Contrôleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.3.2 Notre implémentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 Patrons de conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4.1 Singleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4.2 Monteur et Fabrique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.4.3 État . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4.4 Strategie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3 Développement 19
3.1 Algorithmes de calcul . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.1 Plus Court Chemin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.1.2 Diamètre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2 Génération de graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2.1 Anneau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.2.2 Complet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.2.3 Biparti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2.4 Régulier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.2.5 Aléatoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.3 Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.3.1 Fenêtres Principales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.3.1.1 La classe Fenêtre : Fenêtre Principale . . . . . . . . . . . . . . . . . . 26
3.3.1.2 Le menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.3.1.3 La barre d’outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.3.1.4 La classe OngletsVisualisations : vue des graphes et de leurs Outils . 28
3.3.1.5 La classe PanneauInformations : vue des informations des graphes . . 30
3.3.2 Éléments Graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3.2.1 La classe NœudGraphique . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3.2.2 La classe AreteGraphique . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3.2.3 La classe GrapheGraphique . . . . . . . . . . . . . . . . . . . . . . . 34
3.3.3 Les boites de dialogues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.3.3.1 Prédéfinies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.3.3.2 Complexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.3.4 Outils supplémentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.3.4.1 Gestion du undo /redo . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.4 Sauvegarde et chargement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
3.5 Exportation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4 Procédure de tests 41
4.1 Tests alpha . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.2 Tests bêta . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.3 Tests d’ergonomie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Conclusion 43
Annexes 46
4.4 Diagrammes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Table des figures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Webographie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Résumé 52
Introduction
9 Introduction
Visualisation de Graphes - Rapport de projet
2 Analyse du projet
Dans tout projet professionnel bien mené, l’analyse et la conception doivent au moins consom-
mer autant de ressources que le développement. Nous avons donc réalisé cette partie en un peu plus
d’un tiers du temps total que nous avions pour terminer le projet. Ce chapitre vous rappelle le sujet
de ce projet et dévoile les points les plus intéressants de son analyse.
2.1 Le sujet
2.1.1 Définition
Titre
Visualisation de graphes
Résumé
Le but du TER est de développer une application de visualisation 2D de graphes et de leurs
propriétés.
Parcours
CASAR, DIWEB, GL.
Modules connexes
– Conception et développement d’IHM
– Réseaux
– Algo
Détail
Pour étudier le comportement de systèmes distribués, comme les réseaux ad hoc par exemple,
une approche consiste à modéliser ces réseaux par des graphes et à utiliser des outils de visualisation
pour voir le comportement de ces réseaux lorsqu’on leur applique certains algorithmes. Le but du
TER sera de développer une application de visualisation 2D de graphes et de leurs propriétés. Cette
application prendra en entrée des topologies de graphes types ou des graphes ayant des propriétés
particulières modélisant des réseaux, le tout dans une interface conviviale. Il faudra que cette ap-
plication permette la visualisation d’algorithmes de diffusion dans le graphe ainsi généré. De plus,
11 Analyse du projet
Visualisation de Graphes - Rapport de projet
cette application devra pouvoir exporter, dans des formats de type PDF par exemple, les résultats
graphiques obtenus.
2.1.2 Approfondissement
Nous avons dû apporter beaucoup de légères modifications à notre logiciel, afin qu’il soit
plus fonctionnel et réponde au mieux aux attentes des tuteurs.
Nous avons dû tout d’abord penser à la manière d’ajouter une méthode de coloration per-
sonnalisée des éléments du graphe, qui même si elle n’est pas essentielle, permet à l’utilisateur de
colorer, s’il le souhaite, des parties importantes du graphe.
Une autre fonctionnalité qui nous a été demandée par les tuteurs est la possibilité de voir les
résultats des algorithmes directement sur le graphe. Au départ, nous pensions afficher les résultats de
ces algorithmes directement dans le panneau des informations du graphe. Donc, nous avons modifié
notre façon d’afficher les algorithmes et avons opté pour une coloration bien précise des nœuds et
arêtes concernés par l’algorithme sélectionné.
Au niveau du développement en lui-même, nous avons dû modifier notre première idée de
l’architecture de base de notre logiciel et avons préféré l’option du pattern MVC (Modèle Vue Contrô-
leur) qui va nous permettre de diviser soigneusement les différentes parties de l’application. Ainsi,
le modèle sera pour nous le graphe en lui-même. La vue nous permettra d’afficher directement le
graphe graphique à l’aide du graphe contenu dans le modèle et le contrôleur nous permettra de faire
la balance entre les deux parties citées précédemment. C’est-à-dire que lorsque l’utilisateur effectuera
une modification sur le graphe affiché à l’écran, celle-ci sera répercutée au niveau du contrôleur, afin
de mettre à jour le modèle qui servira surtout pour le calcul d’algorithmes. Ainsi, autant le graphe
graphique que le graphe contenu dans le modèle seront toujours dans un état similaire.
Concernant la génération de graphes, nous avons dû penser à un nouveau type de génération
différent des générations aléatoires ou en spécifiant le nombre de sommets et d’arêtes. Ces générations
sont les générations pour des graphes dits « de voisinage ». Elles sont créées en spécifiant le nombre
d’arêtes contenues dans le graphe ainsi que la distance maximale de création d’une arête. C’est-à-dire
qu’une arête ne peut être créée entre deux nœuds que si la distance entre ces derniers est inférieure
ou égale à la distance spécifiée avant la génération.
Enfin, pour l’enregistrement des graphes, pour une future réutilisation ou modification, nous
avons opté pour le format GraphML. Ainsi, le graphe est stocké sous forme de fichier XML et ce fichier
contient tout d’abord tous les nœuds du graphe, avec leurs attributs, tels que leurs coordonnées sur x
et sur y, et il contient ensuite les arêtes. Chaque arête, dans un fichier au format GraphML, contient
les numéros des deux nœuds étant ses extrémités ainsi que d’autres caractéristiques spécifiques comme
le poids de l’arête par exemple.
2.3.1.1 Modèle
Le Modèle sert d’interface pour l’accès aux données du logiciel. Ainsi, si celui-ci requiert
des informations issues d’une base de données, extraites depuis un fichier ou même depuis un flux
quelconque. C’est au sein de cette partie que le format des données est garanti et contrôlé autant au
moment de la lecture qu’au moment de l’écriture.
L’architecture de cette partie est très importante, car c’est souvent à ce niveau que se si-
tuent les manipulations les plus coûteuses en ressources. Dans le cadre de grosses applications, il est
souhaitable de pratiquer la mise en cache de certaines informations pour éviter de perdre trop de
temps dans leur recherche.
2.3.1.2 Vue
La Vue est l’interface entre l’utilisateur et le logiciel. Elle comprend tout le système de
fenêtrage, de boites de dialogues, de formulaires, de boutons... Toutefois, la Vue se contente d’afficher
les éléments, elle ne doit donc en aucun cas en gérer les interactions comme les clics.
La Vue est un élément important du logiciel, car c’est elle qui va rendre le logiciel attrayant et
agréable à utiliser ou pas. L’action d’un graphiste ou d’un ergonome dans le cycle de développement
ne concerne que la Vue.
2.3.1.3 Contrôleur
Le Contrôleur est le ciment de l’application. Il est chargé d’interpréter les requêtes de l’utili-
sateur et de les répercuter sur la Vue et le Modèle. Si un utilisateur clique sur un bouton de l’interface,
la Vue va prévenir le contrôleur qui va réagir en conséquence.
Une application peut contenir plusieurs Contrôleurs gérant chacun une partie des fonction-
nalités. Dans ce cas, il y aura généralement un Contrôleur principal qui se chargera de transmettre
les requêtes de l’utilisateur au bon Contrôleur secondaire (aussi appelé Helper).
normalement été transmises au Contrôleur. Le Contrôleur quant à lui n’est plus chargé de s’occuper
que des opérations lourdes.
1 class monSingleton {
2 protected static monSingleton _instance = null;
3
8 /* Accès à l’instance */
9 public static monSingleton getInstance() {
10 if (monSingleton._instance == null) {
11 monSingleton._instance = new monSingleton();
12 }
13 return monSingleton._instance;
14 }
15 }
Cela permet de créer facilement une nouvelle classe ayant un fonctionnement interne différent afin
d’améliorer les capacités du logiciel. La figure 2.4 page 17 illustre le fonctionnement de ce patron.
Notre application utilise le patron « Fabrique » pour la gestion des contrôleurs des graphes
ouverts par le contrôleur de l’application ainsi que pour la classe Graphe qui correspond à la structure
de données des graphes. Chaque contrôleur de graphe quant à lui implémente le patron « Monteur »,
chaque contrôleur se parant d’un objet Graphe (structure de données) et d’un objet GrapheGraphique
(vue).
Ce patron a été utilisé au sein de notre projet pour gérer les événements gravitant autour
Notre projet implémente ce patron pour la modélisation des divers algorithmes de manipula-
tion des graphes, mais aussi, de manière plus subtile, au sein même de notre structure de données de
graphes. De cette manière, il est possible d’ajouter des algorithmes ou de nouveaux types de graphes
aisément.
3 Développement
Cet algorithme est en O(n3 ) ce qui signifie que l’algorithme est très lent.
On sélectionne cet algorithme dans le menu (voir Figure 3.1 située page 20) puis on sélec-
tionne deux points sur le graphe et le résultat s’affiche en jaune.
19 Développement
Visualisation de Graphes - Rapport de projet
Fig. 3.1 – Cheminement dans l’interface pour l’utilisation de l’algorithme du Plus Court Chemin
On constate sur la Figure 3.2 située page 21) que le parcours de tous les points du graphe
est bien le plus long de tous les plus courts chemins. Pour détecter cela, il analyse séquentiellement
la distance entre les points.
3.2.1 Anneau
Le graphe en anneau est un graphe simple. Il s’agit d’un anneau dont chaque nœud a un
degré de deux. Pour son affichage, nous avons utilisé des calculs basés sur le cercle trigonométrique
afin d’obtenir un cercle.
Voir l’exemple sur la Figure 3.3 située page 22
3.2.2 Complet
Le graphe complet est comme son nom l’indique un graphe dont chaque sommet relie chaque
autre sommet. Pour sont dessin aussi, nous utilisons le cercle trigonométrique.
Voir l’exemple sur la Figure 3.4 située page 22
3.2.3 Biparti
Le graphe biparti est un graphe qui est divisible distinctement en deux part. Ainsi, nous
affichons les deux parties grâce au cercle trigonométrique aussi. Les arrêtes quand a elles sont tirées
aléatoirement entre les sommets, l’utilisateur décide du nombre de sommets et du nombre d’arêtes
au total.
Voir l’exemple sur la Figure 3.5 située page 23
3.2.4 Régulier
Le graphe régulier est un des graphes les plus difficiles à générer. Il demande de vérifier
le nombre d’arêtes pour chaque sommet. On choisit le nombre de sommets et le nombre d’arêtes
sortantes, et le graphe se génère. Le seul problème réside dans le fait que la génération peut durer
très longtemps.
Voir l’exemple sur la Figure 3.6 située page 24
3.2.5 Aléatoire
Les graphes aléatoires sont quant à eux de trois sortes différentes. Pour le placement de
ceux-ci, les points sont mis au hasard sur toute la zone d’affichage.
Il y a le graphe aléatoire qui obtient un nombre aléatoire de nœuds et d’arrêtes. Voir l’exemple
sur la Figure 3.7 située page 24
Ensuite, il y a le graphe aléatoire où l’on choisit le nombre de sommet et d’arêtes.
Et pour finir le graphe dit social où l’on choisit le nombre de sommets et la distance minimale
entre les sommets. On génère ainsi des liens lorsque les nœuds sont à une distance inférieure à celle
définie. Voir l’exemple sur la Figure 3.8 située page 25
3.3 Interface
3.3.1.2 Le menu
La barre de menu de notre application comporte dans un premier temps , les actions «
basiques » que l’on peut retrouver dans un éditeur de texte par exemple .
En effet dans le menu Fichier nous retrouvons les items « nouveau », « ouvrir », « enregistrer
», « exporter », ou bien « quitter ». Les actions qui leur sont associées sont essentiellement gérées
par les contrôleurs de notre logiciel. Lors de la sélection de l’item « nouveau » par exemple, nous
écrivons :
1 if (e.getSource() == nouveau) {
2 try {
3 ApplicationControlleur.getInstance().nouveau_graphe();
4 } catch (ControlleurException e1) {
5 e1.printStackTrace();
6 }
7 }
La barre de menu contient également une partie Édition contenant les actions undo
/redo(défaire , refaire) permettant à l’utilisateur de revenir sur n’importe quelle action qu’il vient
d’effectuer. Les actions correspondant à ces deux items sont gérées dans des classes spécifiques que
nous expliquerons et détaillerons par la suite.
Nous avons également un menu Affichage des items permettant de modifier l’apparence de
notre graphe actif en affichant ou non la pondération sur les arêtes du graphe ou bien les étiquettes
sur les sommets. Ces items sont sous forme de case à cocher afin de préserver la sélection de l’utili-
sateur quelque soit le graphe qu’il édite. Pour cela, lorsque l’un (ou les deux) item est sélectionné,
nous actualisons, pour chaque graphe présent dans les onglets, la valeur d’un booléen d’affichage
permettant d’afficher, ou non, les étiquettes ou les pondérations. Nous expliquerons, plus en détail,
le fonctionnement de cet affichage dans une section ultérieure.
Nous en venons maintenant au menu Graphes qui est le plus intéressant, c’est ici que nous
pouvons générer les différents types de graphes détaillés dans la partie 4.3, ou bien encore appliquer
les algorithmes cités plus haut comme le plus court chemin et le diamètre. Il est également possible
dans ce même menu de configurer la pondération des arêtes de manière totalement libre. L’utilisateur
peut choisir de pondérer toutes les arêtes d’un même poids qu’il doit au préalable saisir, ou bien alors
de générer des poids aléatoires compris entre deux extrémités (minimum et maximum) dont il saisira
également des valeurs au préalable. Parlons plus en détail de la génération des graphes. Dans le cas
de la génération totalement aléatoire, l’application ne demande rien à l’utilisateur, en effet, lorsque
l’utilisateur sélectionne ce type de génération, une fonction Random se charge d’attribuer un nombre
aléatoire d’arêtes (représenté par un entier aléatoire k) et de nœuds (représenté par un entier aléatoire
j) et fait ensuite appel au contrôleur de cette manière :
1 ApplicationControlleur.getInstance().get_graphe_actif().
generationAleatoire(k, j);
Ainsi, après cet appel, le graphe est automatiquement créé et affiché dans un nouvel onglet.
Le sous-menu de génération aléatoire possède également deux items permettant d’effectuer
une génération semi-aléatoire, c’est-à-dire que l’utilisateur va devoir rentrer un nombre minimum
d’informations afin que la génération soit possible. Le premier item concerne la génération aléatoire.
Après avoir spécifié le nombre de nœuds et d’arêtes que devra contenir le nouveau graphe, le graphe
se génèrera automatiquement dans une nouvelle fenêtre moyennant bien sûr un appel préalable au
contrôleur.
Le second item de génération semi-automatique est celui de la génération par distance. Cette
génération s’effectue après que l’utilisateur ait saisi le nombre de nœuds souhaité, ainsi que la distance
minimale, séparant deux nœuds, pour créer une arête. C’est-à-dire que ce type de génération crée
des graphes dits « sociaux » ou seuls les nœuds les plus proches sont reliés.
Nous pouvons également générer des graphes particuliers tels que les graphes en « anneau
», les graphes « bi parti », les graphes « complets » et les graphes « réguliers ». Pour les graphes en
« anneau », ainsi que les « complets », l’utilisateur n’aura qu’à saisir le nombre de nœuds souhaité
pour le graphe créé. Tandis que pour la génération de graphes « bi parti », ainsi que de graphes «
réguliers », l’utilisateur devra saisir le nombre de nœuds et d’arêtes souhaités.
Toutes ces générations font appel au contrôleur du graphe qui créera un nouveau graphe
dans un nouvel onglet.
Parlons maintenant des algorithmes. Pour le diamètre aussi bien que pour le plus court
chemin , nous faisons appel aux fonctions Diamètre() et PlusCourtChemin() du Controller.
3.3.2.1.3 Spécificités
Le fait que la classe NœudGraphique hérite de la classe Ellipse2D.Double n’est pas anodin,
car cette dernière implémentant l’interface Shape. De ce fait, notre NœudGraphique a accès à une
méthode vitale pour les interactions directes entre le graphe graphique et l’utilisateur, la méthode
contains(Point2D p). Cette méthode retourne un booléen qui indique si le nœud graphique contient,
ou non, le point p sélectionné sur le graphe. De ce fait, nous avons pu tester directement si le nœud
est sélectionné par l’utilisateur ou non.
que pour conserver la bonne distance entre les éléments et pour laisser donc le graphe dans un état
cohérent avant et après le déplacement d’une sélection.
Ainsi, la ligne est paramétrée dans la classe et non lors du dessin, ce qui donne la possibilité
de la dessiner plusieurs fois et de façon identique.
La seconde étape du dessin d’une arête est l’affichage de la pondération de l’arête. Nous
avons décidé que si l’arête avait une pondération de 1, cette dernière n’était pas affichée. Ensuite, un
problème d’affichage est survenu lors du déplacement de l’une des extrémités de l’arête. Nous avons
remarqué que selon les coordonnées de ses extrémités, le poids s’affichait directement sur l’arête, ce
qui empêchait donc une lecture claire du poids. Il nous a fallu donc calculer le placement du poids
selon son orientation. Par exemple, lorsque l’origine de l’arête possède des coordonnées sur x et sur
y qui diffèrent toutes deux par rapport à celles de l’extrémité, nous avons fait en sorte que le poids
s’affiche au-dessus de l’arête. Concernant les lignes, verticales ou horizontales, nous avons opté pour
décaler la valeur de la pondération et ainsi éviter tout chevauchement. (cf. Figure 3.13).
3.3.2.2.3 Spécificités
Outre le fait de la définition dans la classe, des caractéristiques de l’arête, un autre avantage
de l’héritage de la classe Line2D.Double est l’héritage de la méthode contains(Point2D p). Cette
dernière vérifie si la forme géométrique (Shape) possède, ou non, le point p dans son dessin. Le seul
problème qui est très vite apparu est que la méthode contains(Point2D p) de la classe Line2D.Double
ne fonctionne pas, car vérifier si une ligne, qui est uniquement une succession de points, contient un
point est difficile. Il nous a fallu donc redéfinir la méthode contains(Point2D p) et utiliser une autre
méthode de la classe Line2D.Double qui est la méthode ptSegDist(Point2D p) et qui retourne la
distance en pixels, du point p au segment pour lequel est appelée la fonction.
La nouvelle fonction contains(Point2D p) de la classe AreteGraphique devient :
1 public boolean contains(Point2D p)
2 {
3 return(this.ptSegDist(p) <= 3.0);
4 }
Nous avons défini une distance de clic inférieure ou égale à 3, afin que la sélection d’une arête
se fasse aisément et que si plusieurs arêtes sont proches, elles ne soient pas sélectionnées toutes les
deux en même temps du fait d’une sensibilité trop importante.
3.5 Exportation
L’une des demandes de nos tuteurs étant la possibilité d’exploiter les graphes créés par le
logiciel, nous avons mis en place la possibilité à l’utilisateur d’exporter son travail afin de l’intégrer
dans d’autres supports comme des sites web ou des rapports par exemple. Ainsi, on peut obtenir une
image de notre travail au format JPG comme vous pouvez le voir sur la Figure 3.16 ou la Figure 3.17
situées page 40
Cette partie de l’application a été conçue pour intégrer facilement de nouveaux formats
d’export comme LATEX ou DOT par exemple. Toutefois, pour des raisons de temps nous n’avons
implémenté que l’export en JPG pour le moment.
1 <graph>
2 <options />
3 <graphml>
4 <key id="posX" for="node" attr.name="x" attr.type="int" />
5 <key id="posY" for="node" attr.name="y" attr.type="int" />
6 <key id="weight" for="edge" attr.name="weight" attr.type="int" />
7 <graph id="1.xml">
8 <node id="0">
9 <data key="posX">162</data>
10 <data key="posY">122</data>
11 </node>
12 <node id="1">
13 <data key="posX">276</data>
14 <data key="posY">83</data>
15 </node>
16 <node id="2">
17 <data key="posX">293</data>
18 <data key="posY">239</data>
19 </node>
20 <edge source="0" target="2">
21 <data key="weight">1</data>
22 </edge>
23 <edge source="1" target="2">
24 <data key="weight">10</data>
25 </edge>
26 </graph>
27 </graphml>
28 </graph>
4 Procédure de tests
41 Procédure de tests
Visualisation de Graphes - Rapport de projet
Perspectives et conclusion
Perspectives
Par manque de temps, nous n’avons pas pu implémenter toutes les fonctions et outils que
nous avions prévus.
L’une des fonctionnalités qui peut être intéressante à ajouter à notre application est le copier-
coller. C’est-à-dire que l’utilisateur pourrait sélectionner un ensemble d’éléments du graphe et aurait
la possibilité soit de les dupliquer, soit de les couper, sur le même graphe ou bien sur le graphe
contenu dans un autre onglet.
De plus, pour faciliter la sélection multiple d’éléments du graphe, nous aurions pu ajouter
un rectangle de sélection, dit aussi « rectangle élastique ». Ce rectangle serait apparu directement
dans la fenêtre d’affichage du graphe lors d’un clic souris dans une partie ne contenant pas d’élément.
Sa taille varierait selon le déplacement de la souris en maintenant le bouton cliqué. Ceci aurait pour
effet de sélectionner automatiquement les éléments contenus dans ce rectangle ou bien les éléments
étant en partie en contact avec le rectangle. Et finalement, celui-ci disparaitrait dès que l’utilisateur
aurait relâché le bouton souris.
Enfin, nous avions éventuellement envisagé d’externaliser un certain nombre de classes dans
des fichiers JAR afin de créer un système de plug-ins dynamiques. Le développement de cette fonc-
tionnalité a été abandonné au profit des tests et corrections de notre version actuelle. Toutefois, notre
architecture permettrait de l’ajouter par la suite sans trop de peine.
Conclusion
La création d’un logiciel de visualisation de graphes requiert une bonne étude préalable,
afin de répondre facilement aux attentes des utilisateurs. C’est pourquoi, pour l’élaboration de notre
projet, il nous a fallu trouver une interface correcte et souple. Après cette étape, nous avons du
faire appel à nos connaissances en algorithmique de graphes ainsi qu’en IHM et de les combiner
pour obtenir un programme simple d’utilisation et directement compréhensible par l’utilisateur. Les
directives de nos tuteurs nous ont également beaucoup aidés, car le monde des graphes est assez vaste
et l’on peut vite s’éloigner du but premier de l’application.
Ce projet nous aura appris comment rassembler, de la manière la plus efficace possible, les
algorithmes de graphes qui traitent généralement des données difficilement représentables à l’écran,
tels que des listes d’adjacence, par exemple, avec des éléments graphiques sensés représenter les
graphes. Il nous aura également permis de nous familiariser avec les techniques d’IHM permettant
de créer une grande interactivité au niveau du logiciel.
Grâce à ce projet, nous avons pu nous familiariser au travail en groupe et à la répartition
des tâches entre les membres de ce dernier. Nous avons dû beaucoup discuter afin de lier d’une
façon correcte et efficace les différents modules du logiciel. Nous avons également eu l’opportunité
d’étudier différents patrons de conception, qui nous ont permis de rendre, au final, notre application
plus modulaire.
Au final, ce projet est intéressant en tous points, car il nous a permis de mettre en jeu
beaucoup de nos connaissances en informatique et de prendre notre connaissance de notre niveau
d’interaction avec les autres membres du groupe.
4.4 Diagrammes
Fig. 4.1 – Diagramme UML des classes utilisées pour l’implémentation de l’undo/redo
3.1 Cheminement dans l’interface pour l’utilisation de l’algorithme du Plus Court Chemin 20
3.2 Cheminement dans l’interface pour l’utilisation de l’algorithme du Diamètre . . . . . 21
3.3 Génération d’un graphe en Anneau . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4 Génération d’un graphe Complet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.5 Génération d’un graphe Biparti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
3.6 Génération d’un graphe Régulier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
3.7 Génération d’un graphe totalement Aléatoire . . . . . . . . . . . . . . . . . . . . . . . 24
3.8 Génération d’un graphe dit « Social » . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.9 Illustration de la Fenêtre Principale . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
3.10 Vue de la barre d’onglets et de tous ses composants. . . . . . . . . . . . . . . . . . . . 29
3.11 Vue de la barre d’outils d’édition du graphe . . . . . . . . . . . . . . . . . . . . . . . 29
3.12 Exemple de nœud graphique normal, sélectionné, dans un parcours . . . . . . . . . . 32
3.13 Positionnement de la pondération d’une arête graphique . . . . . . . . . . . . . . . . 33
3.14 Exemple d’arête normale, sélectionnée, contenue dans un parcours . . . . . . . . . . . 33
3.15 Exemple de boites de dialogue de saisie simple et complexe . . . . . . . . . . . . . . . 37
3.16 Exemple d’export au format JPG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
3.17 Autre exemple d’export au format JPG . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Bibliographie
[1] Lacomme, Philippe and Prins, Christian and Sevaux, Marc, Algorithmes de graphes,
Eyrolles, seconde édition edition, 2003.
[4] E. Gamma, R. Helm, R. Johnson, and J. Vlissides, Design patterns: elements of reusable
object-oriented software, Addison-Wesley Longman Publishing Co., Inc. Boston, MA, USA,
1995.
Bibliographie 49 Annexes
Visualisation de Graphes - Rapport de projet
Webographie
[5] Supinfo, Java & Solaris par le Laboratoire SUPINFO des technologies Sun, http://www.
labo-sun.com/.
[6] G. Picard, Design Patterns - Outils pour la Gestion de Projets, 2007, http://www.emse.fr/
~vercouter/cours/ogp/DesignPatternsISI.pdf.
Annexes 50 Webographie
Résumé