Theorie Des Graphes (Principes Et Programmation)

download Theorie Des Graphes (Principes Et Programmation)

of 95

Transcript of Theorie Des Graphes (Principes Et Programmation)

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    1/95

    Theorie des graphes

    Principes et programmation

    Soluscience

    Yann Dantal

    [email protected]

    Christophe Haug

    [email protected]

    Copyright c 2003 Soluscience

    mailto:[email protected]:[email protected]:[email protected]:[email protected]
  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    2/95

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    3/95

    Table des matieres

    I Structures de graphe 9

    1 Structure dun graphe simple 11

    1.1 Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    1.2 Representations classiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111.2.1 Matrice dadjacence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    1.2.2 Matrices dincidence sommet-arc . . . . . . . . . . . . . . . . . . . . . . . 12

    1.2.3 Listes dadjacence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

    1.3 Proprietes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    1.3.1 Acyclicite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    1.3.2 Simple connexite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    1.3.3 Connexite forte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    1.3.4 Biconnexite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    2 Structure dun graphe hierarchique 15

    3 Implementation 17

    3.1 Les classes de structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    3.1.1 La classe GraphStruct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

    3.1.2 Les sous-graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

    3.1.3 Les graphes hierarchiques . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

    3.2 Les mille et un parcours dun graphe . . . . . . . . . . . . . . . . . . . . . . . . . 21

    3.2.1 Interface de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . 21

    3.2.2 Quelques parcours predefinis . . . . . . . . . . . . . . . . . . . . . . . . . 22

    3.3 Utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

    II Algorithmie 23

    4 Definitions et proprietes des graphes 25

    4.1 Algorithmes de parcours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    4.1.1 Le parcours en largeur (BFS : Breadth First Search) . . . . . . . . . . . . 25

    4.1.2 Le parcours en profondeur (DFS : Depth First Search) . . . . . . . . . . . 26

    Illustration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

    4.2 Les applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

    4.2.1 Premier cas dapplication du DFS : le tri topologique . . . . . . . . . . . 28

    4.2.2 Le deuxieme cas dapplication du DFS : la biconnexite . . . . . . . . . . . 304.2.3 Le troisieme cas dapplication du DFS : les composantes connexes . . . . 32

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    4/95

    III Geometrie 3D des structures relationnelles 33

    5 Attributs dun graphe 3D 35

    5.1 Les modeles nodaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355.2 Les modeles composites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355.3 Attributs auxiliaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    6 Resolution geometrique de graphes 3D 376.1 Mode operatoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376.2 Formulation directe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376.3 Formulation optimale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

    6.3.1 Calcul des orientations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386.3.2 Calcul des translations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

    7 Implementation et utilisation 417.1 Cas simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417.2 Cas hierarchique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    IV Interfaces utilisateur 43

    8 Presentation de lediteur de graphe 458.1 Interfaces graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458.2 Interface de donnees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 458.3 Donnees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468.4 Exemple dutilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    8.4.1 Localisation de lexemple . . . . . . . . . . . . . . . . . . . . . . . . . . . 488.4.2 Code dutilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    8.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    9 Interface de donnees 499.1 Classe de declaration :VManagerGraph . . . . . . . . . . . . . . . . . . . . . . . . 50

    9.1.1 Methodes virtuelles de declaration . . . . . . . . . . . . . . . . . . . . . . 509.1.2 Declaration dune modification . . . . . . . . . . . . . . . . . . . . . . . . 509.1.3 Stockage des modifications . . . . . . . . . . . . . . . . . . . . . . . . . . 52

    9.2 Classe dimplementation :VManagerGraphTest . . . . . . . . . . . . . . . . . . . . 529.2.1 Separation donnees de graphe/autres donnees . . . . . . . . . . . . . . . . 52

    9.2.2 Separation recuperation/modification dinformations . . . . . . . . . . . . 539.2.3 Gestion du graphe hierarchique. . . . . . . . . . . . . . . . . . . . . . . . 539.2.4 Code exemple de creation dun gestionnaire . . . . . . . . . . . . . . . . . 53

    10 Interface graphique du graphe 5510.1 wxGraph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

    10.1.1 Comportement abstrait wxAbstractComportGraph . . . . . . . . . . . . . 5610.1.2 Comportement souris wxMouseComportGraph . . . . . . . . . . . . . . . . 5810.1.3 Comportement clavier wxComportGraph . . . . . . . . . . . . . . . . . . . 5810.1.4 Style graphique wxStyleGraph . . . . . . . . . . . . . . . . . . . . . . . . 5810.1.5 Interface scrollable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    10.1.6 Informations internes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6010.1.7 Donnee de calque . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    5/95

    10.2 wxGraphScroll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6210.3 wxGraphEditor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

    11 Gestionnaire de calques 65

    V Tutorial 67

    12 Tutorial 6912.1 Graphe et parcours de graphe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69

    13 Tutorial 7713.1 Creation dun graphe hierarchique . . . . . . . . . . . . . . . . . . . . . . . . . . 7713.2 Creation dun graphe hierarchique recurif . . . . . . . . . . . . . . . . . . . . . . 8213.3 Utilisation de sous modeles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

    VI Pour finir. . . 89

    A Le reste du monde 93A.1 Theorie de graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93A.2 Programmation de graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93A.3 Visualisation de graphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93A.4 Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

    Copyright c 2003 Soluscience 5

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    6/95

    6 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    7/95

    Introduction

    En 50 ans, la theorie des graphes a produit une quantite incroyable dalgorithmes permettantde les transformer en un outil de modelisation tres puissant.

    La validite de ces algorithmes nest plus a prouver. Neanmoins, pour pouvoir en profiter, ilest necessaire de disposer dune base algorithmique permettant de les implementer.

    Nous proposons ici une bibliotheque permettant la manipulation de ces graphes. Nous fournis-sons une structure de donnees tres performante permettant lapplication aisee de ces algorithmes.La documentation presentee ici est encore dans une phase de tests. Elle ne sera (et ne

    pourra) etre complete quapres lutilisation de la bibliotheque par les utilisateurs. La validationde la bibliotheque et de sa documentation se feront par le biais des retours derreurs.

    Dans la premiere partie de ce document nous presenterons quelques bases theoriques necessairesa la comprehension et a la manipulation du concept de graphes. Nous introduirons egalementune notion moins connue, celle de graphe hierarchique. Nous montrerons egalement les structuresde bases de la bibliotheque permettant la manipulation de ces graphes.

    La deuxieme partie sinteressera a lalgorithmie de graphe, et nous presenterons les quelquesalgorithmes de base implementes dans la bibliotheque.

    La troisieme partie penchera sur les geometrie 3D des structures relationnelles, et donc dela representation de graphes tridimensionnels.

    La quatrieme partie presentera les mecanismes de linterface utilisateur. Elle introduit lesfonctionnalites essentielles de linterface de programmation.

    Nous concluerons ce document par un tutorial, et par un recensement des travaux effectuesdans le monde sur ce sujet.

    Copyright c 2003 Soluscience 7

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    8/95

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    9/95

    Premiere partie

    Structures de graphe

    Copyright c 2003 Soluscience 9

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    10/95

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    11/95

    Chapitre 1

    Structure dun graphe simple

    base/

    struct

    1.1 Definitions

    On appelle graphe G le couple (S, A) constitue dun ensemble S de sommets et dun

    ensemble A darcs. Chaque arc de A relie deux sommets de S.Un graphe peut etre oriente ou non selon le sens que lon donne aux arcs, les deux sommets

    quils relient pouvant etre consideres comme ordonne ou non.Nous ajouterons une notion, qui nest pas essentielle a la theorie des graphes, mais qui est

    extremement importante, dans son applicabilite et sa generalisation. Il sagit de la notion deport. Il correspond a la localisation de laccroche, realisee ou non, dun arc sur un sommet.Il permet notamment de montrer un graphe en cours de construction, les ports dun sommetpouvant etre imposes par des regles externes a la theorie des graphes.

    On appelle sous-graphe de G, un graphe G = (S, A) tel que S et A soient des sous-ensembles respectifs de S et A.

    On appelle sous-graphe de G induit par S, le sous-graphe G = (S, A) de G tels que A

    soit lensemble des arcs de A reliant des sommets de S.

    base/struct

    1.2 Representations classiques

    Nous allons presenter differentes methodes de representation formelle des graphes.

    1.2.1 Matrice dadjacence

    Cest une matrice A(n, n) telle que ai,j = 1 pour tout arc (i, j) appartenant au graphe, tousles autres elements etant nuls.

    Illustration Voici une matrice dadjacence :

    a b c d

    a 0 1 1 1b 0 0 0 0c 0 0 0 0d 0 1 0 0

    Voici son expression :

    Copyright c 2003 Soluscience 11

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    12/95

    CHAPITRE 1. STRUCTURE DUN GRAPHE SIMPLE

    a

    b

    d

    c

    Fig. 1.1 Expression de la matrice dadjacence precedente

    1.2.2 Matrices dincidence sommet-arc

    Cest une matrice A, de taille n m. On associe les sommets aux lignes, et les arcs auxcolonnes. Lecriture de cette matrice necessite la numerotation des arcs ; le choix est laisse alutilisateur. On definira donc la matrice de A de la sorte :

    aij =

    1 si le sommet i est le sommet origine de larc k1 si le sommet i est le sommet destination de larc k0 sinon

    On obtient une matrice tres creuse. Cette methode est donc peu performante. On la presentea des fins theoriques plus qualgorithmique tant son utilisation se revele couteuse et complexe.

    Illustration Voici une matrice dincidence :

    1 2 3 4 5a 1 1 1 0 0b -1 0 0 -1 1c 0 0 -1 0 -1d 0 -1 0 1 0

    Voici son expression :

    b

    c

    5

    a

    1

    3

    d

    24

    Fig. 1.2 Expression de la matrice dincidence precedente

    1.2.3 Listes dadjacence

    La structure de liste dadjacence est souvent utilisee car elle permet de representer un graphepeu dense sans utiliser beaucoup de ressources.

    12 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    13/95

    Cette liste dadjacence dun graphe G = (S, A) consiste en un tableau Adj de |S| listes, unepour chaque sommet de S. Pour tout u S la liste dadjacence Adj[u] est une liste chanee dessommets v, pour (u, v) A. Donc Adj[u] est constituee de tous les sommets adjacents a u dans

    G.

    Illustration Voici une representation par liste dadjacence :

    a c b d

    b e

    c

    d b

    e a

    Voici son expression :

    a

    b

    d

    c

    e

    Fig. 1.3 Expression des listes dadjacence precedentes

    base/struct

    1.3 Proprietes

    1.3.1 Acyclicite

    On appelle cycle dun graphe (S, A), un sous-ensemble ordonne darcs, tel que tout coupledarcs consecutifs puisse secrire ((u, v), (v, w)) et que le premier arc et le dernier arc secrivent

    (a, b

    ) et (c, a

    ). Cette notion sapplique aussi bien dans un graphe oriente que non-oriente.Un graphe est dit acyclique lorsquil ne possede aucun cycle. Attention, un graphe non-oriente peut contenir des cycles alors que lorsquil est considere comme oriente, il soit acyclique.

    On attribue souvent un ordre topologique a un graphe acyclique oriente. Cet ordre estdailleurs la preuve lorsquil peut etre applique, que le graphe est acyclique. On representesouvent cet ordre par une valeur unique attribuee a chaque sommet. Cette valeur OT : S Rverifie alors pour tout arc (u, v) reliant deux sommets u et v, on a legalite OT(u) > OT(v).

    1.3.2 Simple connexite

    On appelle chemin simple de u a v, ...

    Un graphe (S, A) est dit simplement connexe si pour tous sommets u et v de S, u;

    vimplique quil existe au plus un chemin simple de u a v.

    Copyright c 2003 Soluscience 13

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    14/95

    CHAPITRE 1. STRUCTURE DUN GRAPHE SIMPLE

    1.3.3 Connexite forte

    On appelle composante fortement connexe dun graphe oriente (S, A), le sous-graphe(S, A) induit par S qui soit maximal quant a la relation dinclusion sur les sommets et tel quetout couple de sommets soient mutuellement accessibles ((u, v) A u ; v et v ; u).

    1.3.4 Biconnexite

    On appelle composante biconnexe dun graphe G un ensemble maximal daretes tel quedeux aretes quelconques de lensemble se trouvent dans le meme cycle elementaire1. On appelerapoint (resp. arete) darticulation dun graphe connexe tout nud (resp. arete) dont lasuppression rend le graphe non connexe.

    1Un cycle est dit elementaire si tous les sommets sont distincts

    14 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    15/95

    Chapitre 2

    Structure dun graphe hierarchique

    La structure de graphe hierarchique G0 repose sur un ensemble, M = {M}, de modeles

    de graphes et la donnee, M0, dun de ces modeles. On dit que G0 est une instantiation deM0 sur M.

    Nous distinguerons deux types de modele de graphe. Le premier, dit composite, est constituede plusieurs elements :

    une liste dinstantiations g0(i) de Mm(i) sur M {M0}, une liste de ports externes, P0(p), une liste de connections dinstantiation a instantiation, S0() = (Pi1()(p1()), Pi2()(p2())), une liste de connections dinstantiation a port externe, S0() = (Pi()(p()), P0(p2())),Le deuxieme type de modele, dit elementaire ou nodal, est simplement constitue dune liste

    de ports externes.Exemples :

    Copyright c 2003 Soluscience 15

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    16/95

    CHAPITRE 2. STRUCTURE DUN GRAPHE HIERARCHIQUE

    16 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    17/95

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    18/95

    CHAPITRE 3. IMPLEMENTATION

    Les booleens removeOldLinks et with... permettent de controler la suppression des entitesattenantes. Par exemple, la suppression dun port peut etre accompagnee ou non de celle du lienet du port eventuellement adjacents.

    Quelques methodes supplementaires permettent de controler la qualite dorientation dugraphe. Cette derniere sera interpretee par dautres classes comme les parcours de graphes.

    void GraphStruct::SetDirected(bool d =true);

    bool GraphStruct:: IsDirected(void) const;

    Un certains nombres diterateurs standards ont ete mis en place, nous nindiquons ici que lamethode ...begin. Les autres sont peuvent etre deduites.

    GraphStruct:: node_iterator GraphStruct::nodes_begin(void);

    GraphStruct::const_node_iterator GraphStruct::nodes_begin(void) const;

    GraphStruct:: port_iterator GraphStruct::ports_begin(void);

    GraphStruct::const_port_iterator GraphStruct::ports_begin(void) const;

    GraphStruct:: link_iterator GraphStruct::links_begin(void);

    GraphStruct::const_link_iterator GraphStruct::links_begin(void) const;

    Enfin, nous trouvons quelques methodes dacces a differentes proprietes du graphe :

    int GraphStruct::nodes_number(void ) const;

    int GraphStruct::ports_number(void ) const;

    int GraphStruct::ports_number(NodeId n) const;

    int GraphStruct::links_number(void ) const;

    En tant que pointeur les differents identifiants dentites permettent dacceder a ces entites.Linterface de programmation evoluera probablement legerement si le choix des pointeurs estremis en question :

    NodeId Node::opposite(const LinkId) const;

    NodeId Port::node;

    LinkId Port::link;

    PortId Link::first;PortId Link::second;

    NodeId Link::source(void) const;

    NodeId Link::target(void) const;

    3.1.2 Les sous-graphes

    Nous avons defini une class abstraite au sens de Barton et Nackman permettant de manipulerla notion de sous-graphe. Labstraction est possede la meme interface que GraphStruct et seracomprise par les classes de parcours qui seront definies plus loin.

    Le sous-graphe se definit comme un sous-ensemble de nuds et/ou de liens et ou de ports

    dun graphe complet. Les classes concretes apportent une methode attestant de lappartenancede ces entites au sous-graphes :

    18 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    19/95

    bool SubG::ValidNode(NodeId n) const;

    bool SubG::ValidPort(PortId n) const;

    bool SubG::ValidLink(LinkId n) const;

    Nous fournissons deja deux classes de sous-graphes, le sous-graphe complet, FullSubGraphStruct,ou les validateurs renvoient toujours true, et un sous-graphe qui sappuie sur les map de la STL,MapSubGraphStruct :

    GraphStruct graph;

    NodeId n1 = graph.CreateNode();

    NodeId n2 = graph.CreateNode();

    LinkId l = graph.CreateLink(n1,n2);

    ...

    MapSubGraphStruct subGraph(graph);

    subGraph.include_Node[n1] = true;subGraph.include_Node[n2] = false;

    ...

    Si une entite nest pas incluse dans les include ..., le sous-graphe suppose par defaut quellene lui appartient pas.

    3.1.3 Les graphes hierarchiques

    Un graphe hierarchique est beaucoup plus complexe a mettre en place. La difficulte essentiellevient du fait que ce nest pas a proprement parler un graphe, mais une collection de modeles

    de graphe. Rigoureusement un graphe hierarchique est la donnee de cette collection et dun desmodeles devant etre instantie.

    Nous avons donc deux classes differentes, HierarchicalGraphStruct et GraphModel. Lapremiere gere la liste de modeles que constituent les objets de la classe suivante.

    Linterface de programmation de la premiere est simple :

    ModelId HierarchicalGraphStruct:: CreateModel();

    ModelId HierarchicalGraphStruct:: AddModel(ModelId);

    ModelId HierarchicalGraphStruct::CreateSubModel(ModelId p, const set& s);

    void HierarchicalGraphStruct:: RemoveModel(ModelId);

    La methode CreateSubModel permet de creer un nouveau modele (celui retourne), a partirduquel on instantiera un nud qui remplacera un ensemble de nuds s du modele parent p.

    On y a ajoute les methodes traditionnelles :

    int HierarchicalGraphStruct::models_number(void);

    model_iterator HierarchicalGraphStruct::models_begin(void);

    const_model_iterator HierarchicalGraphStruct::models_begin(void) const;

    ...

    La seconde est plus etoffee, puisquun modele de graphe est un graphe dont les nuds peuventfaire reference a un autre modele.

    Copyright c 2003 Soluscience 19

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    20/95

    CHAPITRE 3. IMPLEMENTATION

    class GraphModel : public GraphStruct {

    NodeId CreateNode();

    NodeId CreateNode(ModelId);

    PortId CreatePort(NodeId =0, bool pseudo =false);LinkId CreateLink(PortId, PortId);

    ModelId GetModel(NodeId);

    void SetModel(NodeId, ModelId);

    void SetModel(NodeId, ModelId, const PortTranslator&);

    void SetModel(NodeId, ModelId, set&, bool withOtherPort = false);

    void SetModel(NodeId, ModelId, const PortTranslator&,

    set&, bool withOtherPort = false);

    NodeId SetAsSubModel(ModelId parent, const set&);

    PortId GetFreePort(PortId localId);

    PortId GetLocalFreePort(NodeId localId, PortId internalId);

    };

    Les deux premieres methodes permettent la creation de nuds simple ou selon un modele.

    Les differentes methodes SetModel permettent de changer ou denlever le modele dun nud.La difficulte de cette operation vient du traitement de la liasion entre les ports locaux et les portsinternes dun nud instantie selon un modele.

    A Completer...

    La methode SetAsSubModel est appelee par HierarchicalGraphStruct::CreateSubModel .Son interface publique pourra etre remise en cause.

    Dans le cas dun nud instantie selon un modele, ses ports seront en relation directe avec lesports libres (ie sans nud) du modele en question. Un modele pouvant etre instantie plusieursfois, on comprend alors que le nom du port libre dans le modele instantie ne peut etre le meme quecelui des ports correspondants dans le modele instantiant. Les dernieres methodes permettentde passer dun systeme de nommage a un autre.

    La declaration exacte des classes HierarchicalGraphStruct et GraphModel est en fait beau-

    coup plus compliquee. Elles ne seront jamais utilisees directement, mais au travers de classesderivees. Un premier couple de classes, qui ne fait rien de plus, que ce qui a ete deja decrit,a ete renomme DefaultHierarchicalGraph et DefaultGraphModel. Un deuxieme permet lagestion des dependances quil peut y avoir entre les differents modeles, HierarchicalGraphLibet GraphModelOfLib. Sans rien imposer sur ces contraintes, le HierarchicalGraphLib enre-gistre au fur et a mesure le fait quun modele en utilise un autre et lui est donc necessairepour etre instantie. En fait, HierarchicalGraphLib est un GraphStruct, dont les nuds sontles GraphModelOfLib et les liens ces relations de dependances. Un simple tri topologique de cegraphe permet alors de savoir si lon peut ou non (( mettre a plat )) tous les modeles du graphehierarchique.

    Linterface de programmation est encore susceptible de bouger, mais devrait ressembler aceci :

    20 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    21/95

    1 ...

    2 lib.UpdateOrder();

    3 if (lib.topologicalOrder.is_acyclic()) {

    4

    ...5 TopSort::const_iterator mi = lib.topologicalOrder.begin();

    6 while ( mi != lib.topologicalOrder.end()) {

    7 ... // (*mi) is a model

    8 ++mi;

    9 }

    10 }

    base/im

    pl

    3.2 Les mille et un parcours dun graphe

    Contrairement a une structure sequentielle, le graphe ne possede pas de notion de parcoursqui soit evidente. Sans meme se creuser les meninges, on trouve facilement dix facons tout aussinaturelles les unes que les autres de le parcourir :

    la liste de ses nuds la liste de ses liens la liste de ses ports la liste des liens attaches (directement ou non) a un nud la liste des nuds adjacents a un autre la liste des nuds simplement connexes a un autre. . . .

    3.2.1 Interface de programmation

    Il etait donc necessaire de positionner correctement linterface de programmation dans cecadre. La principale contrainte etant de laisser suffisamment de place a la creation des mille etune autres facons de le parcourir que nous navons pas imaginees encore.

    Dans la STL, la notion de parcours passe par celle diterateurs, qui sont des indicateurs deposition dans un parcours. Etant etroitement lies, le conteneur et son parcours sont alors tressouvent confondus. Les methodes begin() et end() sont par exemple les deux methodes essen-tielles dun parcours fini. La presence de deux parcours distincts dans un conteneur bidirectionnelcomme un vecteur se traduit par la duplication de ces methodes (rbegin() et rend()).

    Il nest evidemment pas question dans le cas des graphes, de proceder entre autre a cettemultiplication des methodes de delimitation, a chaque nouveau parcours imagine. Nous avonsdonc proposer des classes supplementaires, chacune exprimant une facon de parcourir un graphe.

    La creation de nouveaux parcours est extremement simple et les appels aux methodes begin()et end() sont parfaitement lisibles.

    A premiere vue, la syntaxe parait un peu plus lourde que celle de la STL, elle correspondaussi a une necessite dexpression beaucoup plus riche.

    1 ...

    2 AllNodesPath allnodes(graph);

    3 AllNodesPath::const_iterator ni = allnodes.begin();

    4 for (; ni!=allnodes.end(); ++ni)

    5 NodeId n = *ni;

    Nous ferons une petite remarque, a loccasion, sur la ligne 5 et loperateur dincrementationde ni. On a lhabitude decrire par defaut une simple incrementation en utilisant loperateur

    Copyright c 2003 Soluscience 21

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    22/95

    postfixe. Cest probablement par conformisme avec lappellation meme du C++. Il sagit bien ladune mauvaise habitude, comme souvent peut letre le conformisme. En effet loperateur prefixeet postfixe ne sont pas du tout equivalents.

    Le premier incremente une valeur et renvoie une reference sur cette valeur. Le deuxiemecree une copie de la valeur quil renverra plus tard et incremente la valeur. On limplementetraditionnellement comme ci-dessous :

    1 T& T::operator++() {

    2 ...

    3 return *this;

    4 }

    5 // operateur postfixe : attention a la syntaxe

    6 T T::operator++(int) {

    7 T tmp = *this;

    8

    operator++();9 return tmp;

    10 }

    On voit que loperateur postfixe nest pas du tout aussi anodin que son cousin prefixe.

    3.2.2 Quelques parcours predefinis

    AllNodesPath nodes(graph);

    AllPortsPath ports(graph);

    AllLinksPath links(graph);

    ExternalPortsPath freeports(graph);

    CompletedLinksPath fulllinks(graph);

    PortsOfNodePath nports(graph,node);

    LinksOfNodePath adjacent_links(graph,node);

    DirectLinksOfNodePath from_links(graph,node);

    IndirectLinksOfNodePath to_links(graph,node);

    NodesOfNodePath adjacent_nodes(graph,node);

    DirectNodesOfNodePath next_nodes(graph,node);

    IndirectNodesOfNodePath precious_nodes(graph,node);

    base/impl

    3.3 Utilisation

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    23/95

    Deuxieme partie

    Algorithmie

    Copyright c 2003 Soluscience 23

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    24/95

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    25/95

    Chapitre 4

    Definitions et proprietes des graphes

    algo/

    intro

    4.1 Algorithmes de parcours

    Parcourir un graphe consiste a choisir un sommet et a enumerer a partir de celui-ci ses somets

    en suivant arcs ses autant que possible. Le choix de larc et du nud a visiter en priorite estdefini au prealable par le type de parcours (profondeur, largeur, etc.)

    4.1.1 Le parcours en largeur (BFS : Breadth First Search)

    a

    b

    c

    d

    e

    d1

    a1

    b1

    c1 e1

    c2

    a2

    b2

    d2

    e2

    b3

    a3

    c3

    d3e3

    centre

    Fig. 4.1 Graphe a parcourir

    Le parcours en largeur consiste a parcourir les noeuds du graphe en commencant toujourspar les plus proches du point de depart.

    Pour cela, on utilise un file, dans laquelle on met des aretes a visiter. Ces aretes sont des

    couples de noeuds, (d, a) tels que d et a soient voisins, d a deja ete entierement traite et pas

    a. Au depart, cette file ne contient que le noeud de depart (d, d). Lalgorithme est alors le

    suivant : on enleve la premiere arete (d, a) de la file. Si a est le point darrivee, on a fini.

    Sinon, on ajoute en queue de file toutes les aretes (a, b) telles que b soit un voisin de a non

    visite et on note que tous les b seront visites.

    Cliquez ici pour une animation de ce parcours.

    Copyright c 2003 Soluscience 25

    http://www.cs.sunysb.edu/~skiena/combinatorica/animations/anim/bfs.gifhttp://www.cs.sunysb.edu/~skiena/combinatorica/animations/anim/bfs.gif
  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    26/95

    CHAPITRE 4. DEFINITIONS ET PROPRIETES DES GRAPHES

    a

    b

    c

    d

    e

    a1

    b1

    c1

    d1

    e1

    a2

    b2

    c2

    d2

    e2 a3

    b3 c3

    d3e3

    centre a

    b

    c

    d

    e

    a1

    b1

    c1

    d1

    e1

    a2

    b2

    c2

    d2

    e2 a3

    b3 c3

    d3e3

    centre

    Fig. 4.2 Premieres etapes

    4.1.2 Le parcours en profondeur (DFS : Depth First Search)

    La strategie adoptee par le parcours en profondeur est la suivante :

    Pendant le parcours, on enumere un sommet u , puis un sommet v adjacent a u. Le parcours

    en profondeur va enumerer les sommets adjacents a v, avant denumerer les sommets adja-

    cents a u. Comme un sommet peut avoir plusieurs sommets adjacents, il convient de fixer

    des relations dordre pour definir un ordre de parcours (poids affecte au sommet, etc.) Le

    processus complet est acheve lorsque tous les sommets ont ete parcourus.

    Passons a un exemple afin de mieux saisir le fonctionnement de cet algorithme.

    Illustration

    Voici le graphe a parcourir, que lon appellera G.

    On choisit (arbitrairement) de parcourir G a partir du sommet centre. Pour que lalgorithmepuisse prendre une decision que lon controlera, il faut definir une relation dordre entre lessommets. On dira donc quil parcoura en priorite les nuds de type a, puis b, ..., d, puis sicela nest pas suffisant quil parcoura dabord a, puis a1,...a3. Cela devrait suffire pour notre

    parcours.Voici les premieres etapes du parcours

    Le fonctionnement est tres simple, en partant du nud centre lalgorithme parcourt succes-sivement les sommets a, b, d1, a1, en respectant les relations dordre citees plus haut.

    Le parcours se poursuit jusqua lexploration du nud a2. On rencontre ici un nouveau typede probleme. Le sommet suivant est, en respectant les regles, b2. On se trouve alors bloque, surune feuille de larbre de parcours. Le fonctionnement ici consiste a remonter la pile des nudsvisites, pour trouver des nuds non visites.

    Ici, la pile des sommets visites est (en commencant par la tete) b2, a2, c2, b1, etc.. Or, a2possede des nuds adjacents non visites. Le parcours reprend donc a partir de a2

    On distinguera deux notions :

    La decouverte : la decouverte est la date a laquelle la parcours passe pour la premiere foispar le nud.

    26 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    27/95

    a

    b

    c

    d

    e

    a1

    b1

    c1

    d1

    e1

    a2

    b2

    c2

    d2

    e2 a3

    b3 c3

    d3e3

    centre a

    b

    c

    d

    e

    a1

    b1

    c1

    d1

    e1

    a2

    b2

    c2

    d2

    e2 a3

    b3 c3

    d3e3

    centre

    a

    b

    c

    d

    e

    a1

    b1

    c1

    d1

    e1

    a2

    b2

    c2

    d2

    e2 a3

    b3 c3

    d3e3

    centre

    Fig. 4.3 Etapes suivantes

    La fin de traitement : la fin de traitement est la date a laquelle on observe plus aucunnud adjacent libre pour un sommet.

    Cliquez ici pour une animation de ce parcours.

    Copyright c 2003 Soluscience 27

    http://www.cs.sunysb.edu/~skiena/combinatorica/animations/anim/dfs.gifhttp://www.cs.sunysb.edu/~skiena/combinatorica/animations/anim/dfs.gif
  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    28/95

    CHAPITRE 4. DEFINITIONS ET PROPRIETES DES GRAPHES

    a

    b

    c

    d

    e

    d1

    a1

    b1

    c1 e1

    c2

    a2

    b2

    d2

    e2

    b3

    a3

    c3

    d3e3

    centre

    Fig. 4.4: Le graphe que lon va parcourir

    algo/dfs

    4.2 Les applications

    4.2.1 Premier cas dapplication du DFS : le tri topologique

    Le tri topologique dun graphe oriente acyclique consiste a ordonner lineairement tous sessommets de sorte que sil contient un arc (u, v), u apparaisse avant v. Si le graphe nest pasacyclique, aucun ordre lineaire nest possible.

    Schematiquement, on pourrait dire que le tri topologique dun graphe est lalignement de sessommets, sur un axe horizontal, de maniere a ce que tout ses arcs soient orientes de la droite versla gauche. (Ceci nest bien evidemment quune representation schematique et pas une definitionformelle).

    Le fonctionnement du tri topologique se base sur le parcours en profondeur. On veut, a lafin du tri, obtenir une liste chanee L des nuds a parcourir. On appelle donc le parcours enprofondeur.

    A chaque fois que le traitement dun nud sacheve, on insere ce nud en tete de liste.

    Un exemple basique est celui de lordonancement de taches. Considerons lelaboration dunerecette de cuisine, les lasagnes . (La recette est livree telle quelle sans garantie de reussite).

    On fixera arbitrairement le debut du parcours a Allumage du four.

    28 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    29/95

    a

    b

    c

    d

    e

    d1

    a1

    b1

    c1 e1

    c2

    a2

    b2

    d2

    e2

    b3

    a3

    c3

    d3e3

    centre a

    b

    c

    d

    e

    d1

    a1

    b1

    c1 e1

    c2

    a2

    b2

    d2

    e2

    b3

    a3

    c3

    d3e3

    centre

    a

    b

    c

    d

    e

    d1

    a1

    b1

    c1 e1

    c2

    a2

    b2

    d2

    e2

    b3

    a3

    c3

    d3e3

    centre a

    b

    c

    d

    e

    d1

    a1

    b1

    c1 e1

    c2

    a2

    b2

    d2

    e2

    b3

    a3

    c3

    d3e3

    centre

    Fig. 4.5: Premieres etapes

    Carottes

    Oignons

    Viande

    Tomates

    Sel et poivre

    Beurrer le plat

    Beurre

    Farine

    Lait

    Assembler le tout

    Allumer le four

    Avoir un four chaud

    A partir de sommet Allumer le four on arrive finalement surEnfourner, qui se retrouve en tete de liste. (pour alleger la notation,on ne montrera pas les sommets adjacents dans la liste)

    L = {Enfourner}

    Le parcours se poursuit ainsi jusqua letat :

    L = {Enfourner, Avoir un four a bonne temperature, Allumer le four}

    On poursuit ainsi, tres simplement, le parcours en profondeur. Letatfinal de la liste L est represente ci-contre.Cet exemple a ses limites : sil a le merite dexposer brievement le fonc-tionnement de lalgorithme, ainsi quune application du DFS, il resteassez naf dans la mesure ou les relations dordre entre les differentesphases sont assez floues.

    Copyright c 2003 Soluscience 29

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    30/95

    CHAPITRE 4. DEFINITIONS ET PROPRIETES DES GRAPHES

    a

    b

    c

    d

    e

    d1

    a1

    b1

    c1 e1

    c2

    a2

    b2

    d2

    e2

    b3

    a3

    c3

    d3 e3

    centre a

    b

    c

    d

    e

    d1

    a1

    b1

    c1e1

    c2

    a2

    b2

    d2

    e2

    b3

    a3

    c3

    d3e3

    centre

    a

    b

    c

    d

    e

    d1

    a1

    b1

    c1e1

    c2

    a2

    b2

    d2

    e2

    b3

    a3

    c3

    d3e3

    centre a

    b

    c

    d

    e

    d1

    a1

    b1

    c1 e1

    c2

    a2

    b2

    d2

    e2

    b3

    a3

    c3

    d3e3

    centre

    Fig. 4.6: Premieres etapes

    4.2.2 Le deuxieme cas dapplication du DFS : la biconnexite

    Voici le graphe G que lon vaetudier :

    F

    BE

    C

    D

    A

    G

    IH

    Le graphe G

    On appelle composante biconnexe dungraphe G un ensemble maximal daretes telque deux aretes quelconques de lensemble setrouvent dans le meme cycle elementairea. Onappelera point (resp. arete) darticulationdun graphe connexe tout nud (resp. arete)dont la suppression rend le graphe non connexe.

    aUn cycle est dit elementaire si tous les sommets sont

    distincts

    30 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    31/95

    Assembler le tout

    Enfourner

    Beurre

    Farine

    Lait Beurrer le plat Sel et Poivre

    Concentr de tomates

    Oignons

    Viande

    Carottes

    Allumer le four

    Avoir un four bonne temprature

    Fig. 4.7: Le graphe H

    E

    B

    C

    A

    F

    D

    H

    G

    I

    Arbre obtenu en appellant le DFS a

    partir du sommet F

    Le DFS sur un graphe connexe produit un arbredont les arcs appartiennent au graphe. On lesrepresentera en trait plein. Les arcs de G res-tant seront representes en trait pointille. Les as-

    sertions suivantes seront admises, mais elles sontfacilement demontrables.Si la racine de larbre a plus dun descendant,alors la racine est un point darticulation.On appelle donc le DFS a partir de chaquenud, et on verifie que ce nud a plus dundescendant. Cest un algorithme tres gourmanden ressources. Neanmoins elle a le meritedexposer aisement les possibilites offertes parle DFS

    Les composantes biconnexes de G ont ete mises en couleur :

    Copyright c 2003 Soluscience 31

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    32/95

    F

    BE

    C

    D

    A

    G

    IH

    Fig. 4.8: Coloration des composantes biconnexes de G

    3

    4

    5

    7 9

    1

    2

    6 8

    G1 G2 G3

    Fig. 4.9: Le graphe G

    4.2.3 Le troisieme cas dapplication du DFS : les composantes connexes

    On appelle composante connexe dun graphe G un sous graphe connexe maximal.En image, la definition prend tout son sens :On remarque les trois composantes connexes du graphe G, a savoir SG1 = {1, 2, 3}, SG2 =

    {4, 5, 6, 7} et SG3 = {8, 9}.Lors de lutilisation de lalgorithme, il faut bien veiller a parcourir la totalite du graphe,

    sous peine de parcourir une seule composante connexe. On appellera le DFS a partir dun nudquelconque u de G. Lorsque le traitement du nud u est termine, on peut faire face a deuxsituations :

    La liste des nuds de G non visites est vide : le DFS a parcouru tous les nuds. On adecouvert toutes les composantes connexes.

    La liste des nuds de G non visites est non vide : on appelle le DFS a partir dun nudv non visite, pour parcourir une nouvelle composante connexe.

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    33/95

    Troisieme partie

    Geometrie 3D des structuresrelationnelles

    Copyright c 2003 Soluscience 33

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    34/95

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    35/95

    Chapitre 5

    Attributs dun graphe 3D

    Nous allons maintenant definir un graphe 3D, en decorant les differents elements definissant

    un graphe hierarchique, avec un certain nombre dattributs geometriques.

    geometry/attribut

    5.1 Les modeles nodaux

    Ils sont supposes ponctuels. On najoutera donc simplement lorientation geometrique Q(p)de chaque port externe. Celle-ci peut etre definie par un deplacement euclidien de lespace,cest-a-dire par une rotation.

    La direction de la future liaison est donnee par limage de Oz par cette rotation. Limagede Ox par la rotation est donnee comme reference pour evaluer langle de torsion autour de lafutur liaison.

    Remarque : on utilisera souvent les quaternions pour representer numeriquement une ro-tation.

    geometry/attribut

    5.2 Les modeles composites

    Seules les liaisons de type instantiation instantiation possederont une information geometriqueinitiale.

    Une liaison est definie par la donnee de sa longueur () et dun angle de torsion ()autour de cette derniere. On calcule ainsi le deplacement oriente du port origine vers le portextremite :

    D0

    () = T(Oz,()).R(Ox,).R(Oz,())

    Toutes les autres donnees seront supposees calculees et/ou evaluables sur la donnee de laposition et de lorientation de lune des instantiation. Lorientation et la position dun portexterne sont, par exemple, les memes que celles du port issu de linstantiation auquel le portexterne se rattache.

    geometry/attribut

    5.3 Attributs auxiliaires

    On note D/i(p), le deplacement affine tel que limage du point nul represente la position dansle modele Mm(i) du port externe p. La partie vectorielle identifiant son orientation.

    On note D(i), le deplacement affine identifiant la position et lorientation de g0(i) dans lemodele M0.

    Copyright c 2003 Soluscience 35

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    36/95

    CHAPITRE 5. ATTRIBUTS DUN GRAPHE 3D

    On note enfin D(), le deplacement effectif entre les deux extremites p1 de g0(i1) et p2 deg0(i2). On a la relation evidente :

    D() = (D(i1).D/i1(p1))1

    .D(i2).D/i2(p2)

    36 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    37/95

    Chapitre 6

    Resolution geometrique de graphes3D

    geometry/optimal

    6.1 Mode operatoireIl sagit devaluer les attributs geometriques auxiliaires dun graphe hierarchique. Connaissant

    par definition tous les attributs des modeles elementaires, nous pouvons definir une procedurede calcul des attributs dun modele composite M0, a partir des attributs des modeles dont ildepend.

    Sont donc consideres comme donnes, tous les deplacements D/i(p) des ports, dits internes,et les deplacements voulus D0().

    Les variables sont les deplacements D(i) de chaque instantiation.Remarques :

    Les D(i) sont definis a un deplacement global pres. Il existe une methode de calcul direct et exacte des D(i) dans le cas dun graphe connexe

    sans cycle. Les deplacements D0() ne permettent pas de determiner completement ou de facon ro-

    buste tous les D(i), en presence de cycles ou de composantes connexes multiples.

    geometry/optim

    al

    6.2 Formulation directe

    geometry/optimal

    6.3 Formulation optimale

    Notons D une distance definie sur lespace des deplacements affines. Nous pouvons donc

    poser le probleme optimal sur les variables D(i) :min/D(i)

    D

    D0(), D()

    D(i = 0) = Id

    (6.1)

    Nous definissons un deplacement D comme un couple (Q, T) dune rotation et dune trans-lation telles que D = Q.T. IL sagit pour les trois termes, dapplications affines de lespace. Onnote q et t le quaternion et le vecteur translation associes. On note aussi [q] et [t] les operateursmatriciels affines. On prendra garde aux multiples produits en presence, notamment le produitnon commutatif defini sur le corps des quaternions.

    On definit les normes et Q =

    Q et T =

    T, par :

    Q(D0(), D()) = 1

    q.q0

    2

    Copyright c 2003 Soluscience 37

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    38/95

    CHAPITRE 6. RESOLUTION GEOMETRIQUE DE GRAPHES 3D

    T(D0(), D()) =

    t t02La forme particuliere de Q vient du calcul de la somme sur les vecteurs de base ei :

    Q =ei

    q.q0 .ei ei2

    Comme attendu, cette distance ne distingue pas q et q qui identifie la meme rotation.Nous ne resoudrons pas exactement le probleme 6.1, mais un probleme approche, ou lon cal-

    cule dabord les orientations minimisant Q, puis les translations (qui dependent de la premiereetape) minimisant T. Dans la mesure, ou lon met en place ce procede uniquement dans un cadredestine a corriger des imprecisions sur les donnees de depart, cette approche est largement satis-faisante. Dautant que la mise en place dune distance globale D induit de nombreux problemestechniques de normalisation des differents termes (optimisation multi-criteres).

    Reste a etablir les expressions de q() et de t() en fonction de q(i), t(i), q/i(p) et t/i(p). Onnotera que [q]1 = [q], que [t]1 = [t] et donc que (q, t)1 = (q, [q] .t).

    q() = q/i1 .q(i1).q(i2).q/i2 (6.2)

    t() =

    q/i1

    .

    t/i1 + [q(i1)] .

    t(i1) + t(i2) + [q(i2)] .t/i2

    (6.3)

    6.3.1 Calcul des orientations

    La premiere etape de la resolution est en fait un probleme doptimisation sous contraintes.En effet, on doit avoir a lesprit que les quaternions doivent rester normalises (qq = 1). Onintroduit donc les coefficients de Lagrange n(i) et on definit la nouvelle fonctionnelle :

    q(q(i), n(i)) =

    Q +i

    n(i). (q(i).q(i) 1)

    La condition de stationnarite de q en n(i) equivaut au respect de la normalisation de q(i). Ilne reste qua evaluer les derivees de q par rapport a q(i). Nous ferons pour cela une hypotheseimportante a retenir par la suite :

    Hypothese : Quel que soit , i1() et i2() sont differents. Cest a dire que lon ne peutrelier deux ports dune meme instantiation.

    On notera Iq le tenseur dordre 2 issu de la derivation q(i)q(i) .

    q(i1)q() = q/i2 .q(i2). I

    q .q/i1

    q(i2)q() = q/i2 . I

    q .q(i1).q/i1

    1

    2

    q(i1)Q =

    q/i1 . I

    q .q(i2).q/i2 .q0

    (6.4)

    1

    2

    q(i2)Q =

    q0.q/i2 . I

    q .q(i1).q/i1

    (6.5)

    1

    2

    q(i)i

    n(i

    ).

    q(i

    ).q(i

    ) 1

    = n(i).q(i) (6.6)

    38 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    39/95

    6.3.2 Calcul des translations

    La seconde etape est beaucoup plus classique. On notera It le tenseur dordre 2 issu de laderivation t(i)

    t(i)

    .

    t(i1)t() =

    q/i1 .q(i1)

    It

    t(i2)t() =

    t(i1)t()

    1

    2

    t(i1)T =

    q(i1).q/i1

    t() t0()

    = [q(i1)] .t/i1 + t(i1) t(i2) [q(i2)] .t/i2 +

    q(i1).q/i1

    t0() (6.7)

    1

    2

    t(i2)T

    = 1

    2

    t(i1)T

    (6.8)

    Copyright c 2003 Soluscience 39

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    40/95

    CHAPITRE 6. RESOLUTION GEOMETRIQUE DE GRAPHES 3D

    40 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    41/95

    Chapitre 7

    Implementation et utilisation

    geom

    etry/impl

    7.1 Cas simple

    geometry/impl

    7.2 Cas hierarchique

    Copyright c 2003 Soluscience 41

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    42/95

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    43/95

    Quatrieme partie

    Interfaces utilisateur

    Copyright c 2003 Soluscience 43

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    44/95

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    45/95

    Chapitre 8

    Presentation de lediteur de graphe

    Plusieurs widgets ont ete construits pour permettre la representation de systemes de graphes.

    Il sagit en fait de presenter une librairie souple qui permette a tous types dutilisateurs de seservir dun outil de representation de graphes adapte a ses propres besoins.

    Ces interfaces graphiques fonctionnent avec la librairie de graphes fournie dans lensembleSoluTK2 mais elle est independante dans le sens ou une autre librairie de graphes peut etrerepresentee.

    Plusieurs groupes de composants interviennent dans cette librairie : Les interfaces graphiques de representations. Les interfaces de donnees. Les donnees.

    Cette decomposition est calquee sur le modele de la librairie Phenix qui a inspire ce travail.

    gui/editor2d

    8.1 Interfaces graphiques

    Quatre widgets composent cette librairie :

    Graph est lediteur de graphe proprement dit. Il permet de creer une fenetre seule ou les differentscomposants du graphe (noeuds, ports, liens) peuvent etre implementes dans un espace detravail qui nest quune partie de la zone dimplementation du graphe.

    GraphScroll est compose de lediteur precedent, dascenseurs pour faire defiler la zone de travailet dune roulette pour manipuler le zoom de lediteur.

    LayerManager est un outil qui permet de manipuler un systeme de calques. Le calque est uneprofondeur de representation de differents composants. On peut modifier la profondeur des

    calques et leur visibilite. Les differents composants du graphe se trouvent sur des calques.

    GraphEditor est un ensemble complexe permettant de visionner plusieurs parties du graphesimultanement. Il permet en fait de representer des widgets de type GraphScroll (10 aumaximum) en decoupant une fenetre de travail soit horizontalement soit verticalement.

    Ce widget possede egalement un gestionnaire de calques et une barre de titre qui permetla navigation dans un graphe hierarchique. Cette barre donne acces a des sous menus quioffrent des fonctionnalites de representation.

    gui/editor2d

    8.2 Interface de donnees

    Une interface de donnees permet a linterface graphique de communiquer avec une donneede graphe et une donnee associee de positionnement des differents composants (rectangle pour

    Copyright c 2003 Soluscience 45

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    46/95

    CHAPITRE 8. PRESENTATION DE LEDITEUR DE GRAPHE

    les noeuds et les ports, vecteur de points pour les liens). Le concept de base est dacceder et demodifier les donnees via des cles qui sont du type void* qui identifie les noeuds, les ports et lesliens et les donnees associees.

    Elle est composee dune classe, VManagerGraph possedant un grand nombre de methodes.On en distingue trois types :

    Les methodes virtuelles dobtention dinformations soit de graphe, soit de positionnement. Les methodes normales de modification dinformations. Ce sont celles quil faut appeler si

    lon veut manipuler la donnee sans linterface. Elle gere lappel a des fonctions de modifi-cations mais aussi des methodes denrobage dune modification : le stockage de la modification dans une structure adaptee stockage temporaire dune modification et compilation de modification dans une liste de

    modifications deja realisee. Les methodes virtuelles de modifications dinformations. Ce sont celles qui sont appelees

    par les methodes prececentes. Elles portent le meme nom, sauf que chaque nom commence

    par un V comme Virtual. Ces methodes doivent etre redefinies dans les classes deriveesmais elles ne sont pas appelees directement.Lorsque la donnee est modifiee, un compte rendu de modification doit etre rempli. Cecompte rendu doit refleter exactement ce que le programmeur a fait sur la donnee lorsdune modification.Ce compte rendu est stocke dans une classe VMModif qui offre tous les champs necessairespour en rendre compte. Cette technique offre une liberte totale aux utilisateurs pour fairece quils desirent lors dune modification de donnees.

    Par dessus la librairie de graphe exposee precedemment, une interface derivee, VManagerGraphTest,a ete developpee. On introduit a ce niveau, un objet particulier, le manipulateur de donnees quiest utilise pour les methodes qui permettent une modification de donnees. Cette astuce permet

    dimplementer rapidement des comportements differents lors de la modification de la donnee.De plus, cela isole les methodes de modifications, des methodes dobtention de linformation.Une classe de base est fournie, DGManip et une classe derivee utilisant la structure de grapheexposee precedemment a ete implementee du nom de DGManipTest. Cette derniere classe offreun comportement trivial de base qui peut etre reutilise pour des manipulations un peu pluscomplexe.

    gui/edi

    tor2d

    8.3 Donnees

    Deux types de donnees sont geres par linterface precedente :

    Les donnees de graphes. Elles doivent se caracteriser par la fourniture de cles qui sont desidentifiants uniques des noeuds, des ports, des liens et des modeles de graphes pour lesgraphes hierarchiques.On implemente la classe GraphModelV qui se comporte comme la classe GraphModel*.

    Les donnees de positionnement qui fournissent les rectangles pour les noeuds et les ports,les vecteurs de points pour les liens. Pour chacun des composants, on peut recuperer unechane de caracteres.Pour les noeuds, on peut fournir une scene vectorielle qui permet de dessiner le noeud dunmaniere particuliere, un objet de la classe Scene2D. Une transformation geometrique peutegalement etre associee. Cela permet dafficher des noeuds du meme type dun manieredifferente. Si ces objets nexistent pas, les noeuds seront dessines sous la forme dun carre

    jaune.Pour les ports, il est possible de fournir une direction de sortie privilegiee. Cette direction

    46 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    47/95

    peut etre utilisee pour forcer un lien a sortir suivant une direction precise lors de la creationdun lien.Une classe particuliere, DataLayout a ete implementee. Il sagit grosso modo dune map

    entre les cles et les donnees de positionnement.Aux cles de noeuds, de ports et de liens on peut associer autant de types de donnees que

    lutilisateur le souhaite. Linterface ne les utilisera a priori pas, mais il est toutefois possibledinteragir avec elles grace aux manipulateurs de donnees derivees qui peuvent tenir compte deces donnees annexes lors de la manipulation de donnees.

    La figure 8.1 presente cette organisation generale.

    GUI

    Structure de Graphe

    VManagerGraphTest

    VManagerGraph

    DGManip

    DGManipTest Autre Manipulateur

    Lien

    Port

    Noeud

    InfosGeometriques

    Modele

    Autres Infos

    Autre Manager

    Fig. 8.1: Organisation de linterface de donnee et des donnees

    gui/editor2d

    8.4 Exemple dutilisation

    La creation de graphe est realisable de la maniere suivante : Pour ajouter un noeud, il suffit de cliquer avec le bouton gauche sur lespace de travail. Pour ajouter un port rattacher a un noeud, cliquer avec le bouton droit sur le-dit noeud. Pour ajouter un port libre, cliquer avec le bouton droit sur lespace de travail. Pour a jouter un lien, cliquer avec le bouton gauche sur un port (libre ou non) qui sera

    donc le port de debut du lien, puis sur un second port (libre ou non) qui sera donc le portde fin du lien.

    Il est possible de modifier manuellement lagencement et lapparence dun graphe.

    Pour deplacer un noeud ou un port (libre ou non), si cela est autorise, cliquer en son seinet effectuer un dragging vers lemplacement desire. Pour retailler un noeud ou un port (libre ou non), si cela est autorise, cliquer pres du bord

    ou du coin a retailler et effectuer un dragging jusqua obtenir la taille desiree. Il est a noterque ces objets ont une taille minimale.

    Pour ajouter un point de controle a un lien, si cela est autorise, cliquer sur le segmentvoulu et effectuer un dragging jusqua lobtention du point desire.

    Pour deplacer un point de controle dun lien, si cela est autorise, cliquer sur ce point eteffectuer un dragging jusqua lobtention du deplacement du point desire. Il est a noterquun point de controle situe proche du segment forme par ses points de controle precedentet suivant sera supprime.

    On peut aussi deplacer un segment entier dun lien, si cela est autorise, selon les directionsdes segments precedent et suivant. Pour se faire, appuyer sur la touche Shift et effectuer

    Copyright c 2003 Soluscience 47

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    48/95

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    49/95

    Chapitre 9

    Interface de donnees

    Linterface de donnees est un protocole de communication entre une interface graphique (ou

    autre chose) et une donnee reelle. Il sagit le plus souvent dun cadre stricte de methodes :

    informations auxquelles linterface peut acceder.

    formes sous lesquelles elle va les recevoir

    maniere de modifier une information avec un format donne.

    Lobjectif est de permettre a une interface graphique de sabstraire dune donnee particuliere

    et en fait de pouvoir representer non pas une donnee mais des donnees ayant des caracteristiques

    communes avec le minimum defforts de programmation.

    Ce chapitre presente linterface de donnees qui permet la communication entre lediteur de

    graphes et les donnees de graphes ayant les caracteristiques suivantes :

    Le graphe est constitue de noeuds, de ports et de liens que lon repere via des cles (iden-

    tifiant unique) de type void*. Un port peut appartenir a un noeud ou etre libre. On peut donc obtenir le noeud dun

    port (egal au pointeur 0 si le port na pas de noeud) et obtenir tous les ports dun noeud.

    Un lien relie deux ports. On peut donc obtenir a partir dune cle de lien, deux ports, le

    premier etant le port de depart, le second le port darrivee. On peut egalement obtenir le

    lien dun port sil existe.

    Les noeuds et les ports sont reperes geographiquement par des rectangles. On peut donc

    obtenir a partir de la cle dun noeud ou dun port son rectangle respectif.

    Les liens sont reperes geographiquement par des vecteurs de points qui definissent des

    lignes brisees entre le debut et la fin dun noeud.

    Les noeuds, les ports et les liens appartiennent a un calque qui est repere par un numero

    strictement positif. Les calques permettent de definir des profondeurs de representations

    et des visibilites pour un ensemble de composants.

    Les noeuds, les ports et les liens possedent une chane de caracteres associee.

    Les noeuds possedent une scene vectorielle associee qui est utilisee pour leur affichage. Si

    elle est non definie, le noeud sera represente par un carre jaune. Ce type dinformation est

    rendu via la classe Scene2D de la librairie Phenix.

    Les noeuds possedent un vecteur de deplacements qui peuvent etre appliques aux scenes

    qui les representent.

    Les ports possedent un point qui indique un vecteur de direction privilegiee de sortie pour

    un lien en sortant.

    A partir de ces caracteristiques, une classe de declaration,VManagerGraph a ete construite.Une classe dimplementation, VManagerGraphTest basee sur la librairie de graphe introduit

    Copyright c 2003 Soluscience 49

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    50/95

    CHAPITRE 9. INTERFACE DE DONNEES

    auparavant et sur une architecture particuliere que lon conseille, a ete realisee offrant une

    veritable plateforme de developpement avec de nombreuses fonctionnalites deja en place tout en

    laissant de larges opportunites de developpements.

    gui/interfacedonnee.tex

    9.1 Classe de declaration :VManagerGraph

    Cette classe possedent deux attributions :

    1. Declarer les methodes virtuelles qui seront redefinies dans les classes derivees comme

    VManagerGraphTest.

    2. Gerer le stockage des modifications et la derniere modification en cours dite modification

    courante.

    9.1.1 Methodes virtuelles de declaration

    Ces methodes sont reparties en deux groupes distincts :

    1. Les methodes qui permettent de recuperer de linformation. Leurs noms commencent tou-

    jours par Get suivi dun nom generalement expressif. Les methodes qui permettent de

    recuperer de linformation de graphe ne sont pas dissociees des methodes qui permettent

    de recuperer des informations geometriques.

    2. Les methodes qui permettent de modifier de linformation dans les donnees. Toutes ces

    methodes commencent leurs noms par VSet, V comme Virtual. La encore, les methodes

    qui permettent de modifier de linformation de graphe ne sont pas dissociees de celles qui

    permettent de modifier des informations geometriques.

    Ces methodes doivent etre redefinies dans les classes derivees dans leur totalite.

    La plupart du temps, on recupere ou modifie une information sur un composant repere par

    une cle du type void*. Toutes ces methodes renvoient un argument booleen qui indique si laction

    demandee a pu etre realisee. Pour linstant, aucun message derreur nest prevu pour informer

    lutilisateur dun probleme eventuel.

    9.1.2 Declaration dune modification

    Lorsquune modification est realisee sur une donnee, un formulaire de modifications doit etre

    rempli. Cette obligation a pour interet de permettre a nimporte quel programmeur de realiser

    ce quil desire via les methodes de modifications et ceci de maniere bien differente des methodesdites triviales.

    Ce formulaire prend la forme dune classe du nom de VMModif qui possede un grand nombre

    dattributs publics qui vont par groupe :

    NodesAdd, NodesAddInfo de type vector, vector representent

    les cles de noeuds ajoutes et les informations geometrique et de graphe creees pour sto-

    cker la modification. La classe NodeAddInfo peut etre derivee a volonte pour stocker des

    informations specifiques a chaque probleme rencontre.

    NodesRemove NodesRemoveInfo de type vector, vector representent les cles de noeuds supprimes et les informations geometrique et de graphe

    creees pour stocker la modification. La classe NodeRemoveInfo peut etre derivee a volontepour stocker des informations specifiques a chaque probleme rencontre.

    50 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    51/95

    NodesModif, NodesModifInfo de type vector, vector representent les informations de cles de ports supprimes et les informations geometrique

    et de graphe creees pour stocker la modification. La classe NodeModifInfo peut etre derivee

    a volonte pour stocker des informations specifiques a chaque probleme rencontre.

    PortsAdd, PortsAddInfo de type vector, vector representent les informations de cles de ports ajoutes et les informations geometrique et

    de graphe creees pour stocker la modification. La classe PortAddInfo peut etre derivee a

    volonte pour stocker des informations specifiques a chaque probleme rencontre.

    PortsRemove, PortsRemoveInfo de type vector, vector representent les informations de cles de ports supprimes et les informations geometrique

    et de graphe creees pour stocker la modification. La classe PortRemoveInfo peut etre

    derivee a volonte pour stocker des informations specifiques a chaque probleme rencontre.

    PortsModif, PortsModifInfo de type vector, vector representent les informations de cles de ports modifies et les informations geometrique et

    de graphe creees pour stocker la modification. La classe PortModifInfo peut etre derivee

    a volonte pour stocker des informations specifiques a chaque probleme rencontre.

    LinksAdd, LinksAddInfo de type vector, vector representent les informations de cles de liens ajoutes et les informations geometrique et

    de graphe creees pour stocker la modification. La classe LinkAddInfo peut etre derivee a

    volonte pour stocker des informations specifiques a chaque probleme rencontre.

    LinksRemove, LinksRemoveInfo de type vector, vector representent les informations de cles de liens supprimes et les informations geometrique

    et de graphe creees pour stocker la modification. La classe LinkRemoveInfo peut etrederivee a volonte pour stocker des informations specifiques a chaque probleme rencontre.

    LinksModif, LinksModifInfo de type vector, vector representent les informations de cles de liens modifies et les informations geometrique et

    de graphe creees pour stocker la modification. La classe LinkModifInfo peut etre derivee

    a volonte pour stocker des informations specifiques a chaque probleme rencontre.

    LayersAdd, LayersAddInfo de type vector, vector representent les informations de cles de liens ajoutes et les informations geometrique et

    de graphe creees pour stocker la modification.

    LayersRemove, LayersRemoveInfo de type vector, vector

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    52/95

    CHAPITRE 9. INTERFACE DE DONNEES

    9.1.3 Stockage des modifications

    Les modifications realisees sur la donnee sont stockees automatiquement dans une structure

    de donnees adpatee a cet effet du nom de MemoryModifGraph qui contient en fait des listes de mo-

    difications primaires stockees dans une classe du nom de ModifGraph. Dans le gestionnaire, cette

    operation seffectue via des methodes de modifications non virtuelles au nom quasi identiques

    aux methodes virtuelles de modifications (sans le V du debut de chaque nom de methode).

    Ces modifications peuvent etre recuperees via les methodes Undo et Redo de la classe MemoryModifGraph

    qui renvoie les modifications a faire pour revenir sur ou refaire une operation. Il sagit dune

    operation difficile mais elle a ete implementee une fois dans une classe de manipulation de la

    donnee de maniere que lon peut qualifier de definitive.

    Il est possible de debrayer ce stockage automatique, via les methodes SetSilentModif et

    de recuperer lexistence de ce comportement via la methode IsSilentModif. Cette action va

    arreter le stockage et vider la memoire des dernieres modifications.

    Il est egalement possible de debrayer temporairement ce stockage dinformations via lamethode SetTemporarySilentModif et de recuperer lexistence de ce comportement via la

    methode IsTemporarySilentModif . Cette action va mettre le gestionnaire de donnees dans

    le mode silencieux pour enregistrer les modifications, comme dans le paragraphe precedent, a la

    difference pres que le stockage des dernieres modifications nest pas efface. Cette methode est

    utile pour effectuer des modifications successives et de stocker la modification finale quapres la

    serie.

    Pour ce dernier type doperations, la classe VMModif est equipee pour compiler une serie de

    modifications en une seule via trois methodes du nom de Compile.

    1. Une compile un vecteur de modifications dans la classe qui appelle.

    2. Une compile une liste de modifications dans la classe qui appelle.3. Une compile une modification dans la classe qui appelle.

    On peut alors soumettre cette modification au gestionnaire VManagerGraph via la methode

    SetModif.

    On peut remettre a zero le formulaire de modifications du gestionnaire via la methode

    InitModif.

    gui/in

    terfacedonnee.tex

    9.2 Classe dimplementation :VManagerGraphTest

    Plus quune implementation de la classe precedente, une organisation de linterface de donnees

    a ete proposee. Cela se base tout dabord sur une decomposition franche entre plusieurs compo-sants.

    9.2.1 Separation donnees de graphe/autres donnees

    Tout dabord, les informations de graphes dun cote et les informations geometriques ou tout

    autre dun autre cote sont completement separees. Le principe est que les cles fournies par la

    librairie de graphe servent a acceder a toutes les donnees que lon desire utiliser. On trouve donc

    plusieurs donnees :

    La donnee de graphe prend la forme dune classe du type GraphModelV. Il sagit dune

    classe qui se comporte comme un pointeur sur une classe du type GraphModel*. Elle est

    securisee par le fait que le pointeur quelle contient est intialisee a 0 dans son constructeuret que lon ne peut pas detruire par son biais le pointeur quelle contient. Le pointeur de ce

    52 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    53/95

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    54/95

    CHAPITRE 9. INTERFACE DE DONNEES

    GUI

    Structure de Graphe

    VManagerGraph

    DGManip

    DGManipTest

    Lien

    Port

    Noeud

    InfosGeometriques

    Modele

    Autres Infos

    Autre Manager

    VManagerGraphTest

    Metaprogrammation

    Systeme entree/sortie

    Manipulateur abstrait

    Orthogonal, Moleculaire, etc.

    Fig. 9.1: Organisation des donnees et de linterface de donnees

    6 BibElementPtr element;78 projet->SetHierarchicalGraph(hg);9 projet->CreateModel(element);

    10 datai->SetData(element);11 datai->SetProjetGraph(projet);12 datai->SetManipulator(manip);

    Ligne 1 on cree une donnee dinterface de type VManagerGraphTest.

    Ligne 2 on cree une donnee daffichage de type DataLayout.

    Ligne 3 on cree un manipulateur de graphes de type DGManipTest.

    Ligne 4 on cree un projet capable de creer des graphes hierarchiques et de les detruire du type

    ProjetGraph. Cette structure peut dailleurs stocker des bibliotheques de graphes.

    Ligne 5 on cree une structure du type HierarchicalGraph issue de la librairie mathematique

    de graphe.

    Ligne 6 on declare un element du type BibElementPtr qui est un pointeur sur une classe qui

    peut contenir : Un modele de graphe du type GraphModelV

    Une donnee geometrique du type DataLayout Une scene vectorielle qui permet de definir le dessin du graphe quand il est represente

    sous forme de noeuds dans un autre graphe.

    Un nom sous la forme dune chane de caracteres.

    Ligne 8 on fixe un outil de creation de graphes hierarchiques au projet de graphe projet.

    Ligne 9 on demande la creation dun nouveau modele de graphe au projet.

    Ligne 10 on fixe ce modele de graphe au gestionnaire de graphes.

    Ligne 11 on fixe le projet au gestionnaire de graphes. Celui-ci en aura besoin, lors de la montee

    et de la descente dans des graphes hierarchiques.

    Ligne 12 on fixe le manipulateur de donnees que lon desire utiliser avec ce gestionnaire de

    graphes.

    54 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    55/95

    Chapitre 10

    Interface graphique du graphe

    Lediteur de graphes existe sous trois formes :

    wxGraph est lediteur simple. Cest le noyau de tous les autres objets. Il possede donc la plus

    grande complexite.

    wxGraphScroll est compose avec un editeur simple, de deux ascenseurs (un vertical et un

    horizontal) et une roulette pour gerer le zoom.

    wxGraphEditor est un editeur splittable compose dau plus 10 ob jets de type wxGraphScroll,

    dune barre de titre pouvant gerer des petits menus contextuels et dun gestionnaire de

    calques qui est detaille dans un autre chapitre.

    Ce chapitre decrit le fonctionnement de ces trois classes.

    gui/interfacegraph.tex

    10.1 wxGraph

    Cette classe est la classe de base de linterface qui permet dinterpreter une structure de

    graphes simple composee :

    De nud qui est une structure qui peut contenir des ports. Linterface de donnees peut

    fournir une scene vectorielle de type Scene2D de representation qui est alors utilise pour le

    dessiner. Cette scene peut subir une transformation geometrique qui est egalement fournie

    par linterface de donnees. Si aucune scene nexiste pour la representation du nud celui-ci

    est represente par un carre jaune.

    Linterface de donnees informe si un noeud peut etre agrandi et de quelle maniere il peut

    letre parmi 8 possibilites, les 8 angles cardinaux principaux. Linterface informe egalement

    si un nud peut etre deplace ou pas.

    De ports qui sont les zones dattaches des liens. Les ports peuvent etre libres ou bien

    appartenir a un noeud. Dans ce cas, si le nud possede une scene vectorielle, ils ne sont

    pas dessines, la scene vectorielle en etant responsable. Les scenes vectorielles possedent la

    particularite de pouvoir posseder des zones. Ces zones peuvent etre utiliser pour reperer

    les ports.

    De la meme maniere que pour les noeuds, linterface de donnees informe si on peut agrandir

    ou deplacer les ports.

    Les liens qui permettent de relier deux ports. Les liens sont un ensemble de points qui

    partent du milieu dun port pour aller ves le milieu dun autre port. Contrairement aux

    nuds et aux ports, le comportement de deplacement des liens est regi par les comporte-ments souris et clavier de lediteur.

    Copyright c 2003 Soluscience 55

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    56/95

    CHAPITRE 10. INTERFACE GRAPHIQUE DU GRAPHE

    Par defaut, il est posible de creer un lien, dajouter des points de controle, de deplacer

    des points de controle ou de deplacer des segments entier de liaison soit librement soit

    parallelement a la position initiale.

    Plusieurs objets particulier peuvent apparatre pour aider lutilisateur dans sa demarche decreation dun graphe.

    Une palette apparat lorsque le curseur reste trop longtemp inactif. Il permet alors de choisir

    dans une palette un autre type de nuds que lon souhaite ajouter. Il suffit alors de cliquer

    sur le nud dans la palette ou appuyer sur la touche retour. A partir de l a, tous les

    ajouts de nuds seront du type choisi. Cette palette est transparente et permet de voir

    exactement laction que lon va faire.

    Les fleches permettent de faire defiler la palette pour choisir un element particulier.

    Un menu contextuel saffiche lorsque plusieurs ports se trouvent les uns au dessus des autres

    de telle maniere a ce quon puisse pas les selectionner directement pour creer une liaison.

    Ce menu va alors afficher des chanes de caracteres associees aux ports concernes fournispar linterface de donnees. La selection des items permet de voir quelles sont les liaisons

    concernees par un port.

    Un menu circulaire apparait lorsque lon laisse appuyer le bouton droit ou que lon effectue

    un drag droit trop important. Il permet dacceder a des parametres de lediteur pour

    scroller horizontalement ou verticalement, pour zoomer, pour selectionner des parametres

    daffichage. En particulier, on peut choisir si on souhaite afficher une grille et les nombres

    sur la grille pour se reperer.

    Il est possible de rendre inoperationnel ces interacteurs particuliers.

    Cet objet possede des comportements complexes qui sont decrits dans des styles de compor-

    tement clavier et souris.

    10.1.1 Comportement abstrait wxAbstractComportGraph

    Lediteur de graphe simple est dote dun comportement clavier particulierement complet et

    complexe. Il a ete decide de la batir comme un kit que lon peut reorganiser pour interpreter

    plus ou moins differemment les actions sur le clavier.

    De plus, il est dote dun comportement de souris virtuelle capable de mimer toutes les actions

    de la souris avec les quatres fleches et les touches Alt, Shift et Ctrl.

    Pour eviter de repliquer un grand nombre de methodes, les comportement souris et clavier ont

    ete implementes de maniere originale. Ils derivent tous deux de la meme classe wxAbstractComportGraph

    qui offre un panel de methodes qui representent un ensemble dactions que lon peut realiser sur

    lediteur de graphe. Pour les citer :

    Ajouter un point de controle a un lien.

    Reactualiser la position du curseur.

    Reactualiser la position du curseur pendant une phase de dragging.

    Reactualiser la position du curseur pendant une phase de dragging avec le bouton droit.

    Reactualiser laffichage du menu contextuel de choix des ports en cas de besoin.

    Reactualiser laffichage de la palette.

    Effectuer une action de dragging. Cette methode reoriente vers dautres methodes ba-

    siques en fonction du contexte, differents modes de liaison, mode de selection, mode de

    deplacement, mode de selection de taille de ports ou de nuds etc. . . Gerer un deplacement de la souris simple soit en mode normal soit en mode de liaison.

    56 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    57/95

    Gestion dun relache de bouton gauche.

    Gestion dun enfoncenement de bouton droit.

    Gestion dun relache de bouton gauche.

    Reactualisation de la taille dun port par un procede de dragging. Il faut noter que cettefonction comme beaucoup dautres possede un fonctionnement particulier. Il faut en effet

    dissocier un click bref pour ajouter un nud ou un port dun deplace qui lui seffectue

    sur des distances courtes. Dans une phase de dragging, tant que le deplacement nest

    pas suffisant on neffectue aucune operatoin de selection, de deplacement de nuds, ports

    ou liens. Si le relache intervient avant un deplacement assez long, on considere que lon

    effectue uen action de click bref qui peut saccompagner de lajout dun port ou dun nud

    par exemple. Par contre, si le deplacement savere suffisament long pendant une action de

    dragging on entre alors dans un mode different qui va permettre dagrandir ou de deplacer

    des objets et on nen ressortira que lors du relache de la souris.

    Il faut egalement noter que toutes les actions de deplacer, agrandir peuvent seffectuer soit

    en mode direct, on voit alors la modification en temps reel, soit en mode indirect ou ungrise apparat pour avoir une idee de ce qui va se passer lorsque lon relachera la souris.

    Ajout dun point dans un segment et gestion de son deplacement.

    Gestion du deplacement dun nud lors dun dragging.

    Gestion du deplacement dun port lors dun dragging.

    Gestion de lagrandissement dun nud.

    Gestion de selection de composant lors dun dragging.

    Gestion du deplacement dun segment, celui-ci restant toujours parallele a sa position ini-

    tiale, les deux points du segment se deplacant en consequence, les deux points les encadrant

    restant fixes.

    Gestion du deplacement dun segment librement, celui restant toujours de la meme taille,parralele a lorigine, les deux point encadrant restant fixes.

    Gestion de deplacement dun point de controle.

    Gestion de la creation dun lien.

    Gestion dun dragging droit. Si le depalcement est faible et court avant le relache, il y aura

    rajout de port, sinon ce sera lapparation dun menu circulaire appele egalement Marking

    Menu pour gerer des parametres de lediteur.

    Fin de deplacement dun nud pour gerer le mode indirect.

    Fin dajout dun point de controle dun lien pour gerer le mode indirect.

    Fin de dagrandissement dun port pour gerer le mode indirect.

    Fin de deplacement dun port pour gerer le mode indirect.

    Fin dagrandissement dun nud pour gerer le mode indirect. Fin dune liaison lors dun relache. Si la position de la souris est dans un port autre que

    celui du port dorigine, il y aura tentative de creation dun lien.

    Fin de deplacement dun point de controle dun lien pour gerer le mode indirect.

    Fin de deplacement dun segment celui-ci restant parralele a sa position dorigine ainsi que

    les deux segments lencadrant pour gerer le mode indirect.

    Fin de deplacement dun segment, celui-ci restant parallele a sa position dorigine, les

    segments lencadrant se deplacant librement pour gerer le mode indirect.

    Fin dune selection. Si le deplacement maximal realise est trop court, un nud est rajoute,

    sinon on arrete simplement la selection.

    Fin dune selection. Idem a la precedente sauf que lorsquun nud est cree le premier port

    libre fait demarrer un nouveau lien tant et si bien que lon cree des liens sans arret jusqua

    Copyright c 2003 Soluscience 57

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    58/95

    CHAPITRE 10. INTERFACE GRAPHIQUE DU GRAPHE

    click droit.

    Fin dun dragging droit. Si le deplacement a ete court lors du dragging, il y a creation

    dun port sinon rien.

    Fin dun liaison qui cree un nud daccroche sur le nouveau nud cree.Ces methodes sont independantes de laction reelle de lutilisateur. Le programmeur est libre

    de les enchaner comme il le souhaite lors de la venue devenement reels. Cela offre une grande

    souplesse pour programmer de nouveaux comportements, les fonctions de bases existant deja.

    En particulier, on utilise cette methode pour mimer un comportement souris avec les fleches.

    10.1.2 Comportement souris wxMouseComportGraph

    Avec la methode decrite precedemment, le comportement souris de base implemente dans

    cette classe devient triviale.

    10.1.3 Comportement clavier wxComportGraph

    Le comportement clavier est un peu plus complexe car il gere des actions specifiques :

    le copier-coller. Le copier coller est une action tres proche de la sauvegarde de fichiers dans

    le cas des graphes et il reste a limplementer.

    Les actions Undo/Redo sont implementees et sont entierement gerees par linterface de

    donnees.

    Les touches PageUp/PageDown permettent de faire defiler les pages de lediteur.

    La touche F2, ou lassociation Ctrl + permettent daugmenter le zoom.

    La touche F1, ou lassociation Ctrl - permettent de diminuer le zoom.

    Lassocitation Ctrl+P permet laffichage de la palette. Celle-ci peut safficher suivant plu-

    sieurs modes, soit lorsque la souris reste inactive trop longtemp ou par cette association,soit uniquement par cette association.

    Neanmoins, autour des actions sur les fleches un comportement permettant dobtenir toutes

    les actions de la souris a ete implemente :

    Lappui sur les fleches induit des comportements de type moving, deplacement libre de la

    souris. La meme chose avec la touche Shift enfoncee accelere ce mouvement. On peut de

    cette maniere obtenir un placement tres precis du curseur.

    Lappui sur la touche Alt equivaut au bouton gauche de la souris enfoncee lors de deplacement

    avec les touches fleches. Des quun deplacement seffectue alors avec la touche Alt relevee,

    cela equivaut a un relache de bouton gauche de la souris.

    Le meme fonctionnement est utilise avec la touche controle pour mimer laction sur lebouton droit.

    Toutefois lorsque la palette est visible, les fleches sont utilisees pour faire defiler la palette.

    Il est prevu de complexifier le comportement clavier, pour par exemple appeler une librairie

    ou un module en tapant son nom et pour bien dautres operations.

    10.1.4 Style graphique wxStyleGraph

    Le style graphique est assez universel, il y a donc peut de chances que dautres styles soient

    crees. Il gere plusieurs affichages :

    Laffichage de la grille en premier avant tout le monde.

    Laffichage de nuds. Ils sont affiches juste apres la premiere instance daffichage des liens. Laffichage des ports, apres celui des neuds.

    58 Copyright c 2003 Soluscience

  • 7/28/2019 Theorie Des Graphes (Principes Et Programmation)

    59/95

    Laffichage des liens se fait en deux fois pour gerer la complexite daffichage de ceux-ci. Les

    liens qui traversent un nud auquel ils ne sont pas lies sont affiches en dessous de ceux-ci

    tandis quun lien est au dessus dun nud auquel il est attache. Idem pour les ports.

    Trace la selection des nuds, ports et liens. Trace les modification de liens, de taille ou de place dun nud ou dun port etc. . .en mode

    indirect.

    Le curseur est invisible, le style graphique se charge de le redessiner. En effet pour le

    comportement abstrait de souris lie au clavier, le curseur ne correspond plus a la souris

    reelle. Il existe sur certaines plateformes la possibilite de commander le placement de la

    souris via la methode wx, WarpPointer de la classe wxWindow, mais ce nest pas le cas

    partout (Mac OS 9 en particulier). En contrepartie, on utilise cette astuce pour linstant.

    Trace la palette de choix delements dune librairie.

    10.1.5 Interface scrollabl