2012-10-24 4 views
5

Dans un système I Avoir une liste de nœuds qui sont connectés comme dans un graphique normal. Nous connaissons tout le système et toutes leurs connexions et nous avons aussi un point de départ. Tous mes bords ont une direction.Dessiner un graphique à partir d'une liste de nœuds connectés

Maintenant, je veux dessiner tous ces nœuds et bords automatiquement. Le problème n'est pas le dessin réel, mais le calcul des coordonnées (x, y). Donc, fondamentalement, je voudrais dessiner tout ce graphique pour qu'il soit bien.

Mon serait quelque chose structure de données comme:

class node: 
string text 
List<edge> connections 

Il doit y avoir des algorithmes bien connus pour ce problème? Je n'ai pas pu en trouver, mais je peux utiliser les mauvais mots-clés.

Mes pensées:

Une façon serait de positionner notre startnode à (0,0), et ont une constante qui est la "distance". Ensuite, pour chaque voisin, il ajouterait la distance à la position y, et pour chaque nœud qui est voisin, mettre x = distance * n.

Mais cela va vraiment donner beaucoup de problèmes - ce n'est définitivement pas le chemin à parcourir.

Répondre

9

De loin l'approche la plus courante pour cela est d'utiliser un force-directed layout au lieu d'un déterministe. L'essentiel est que vous avez tous les nœuds se repoussent les uns les autres (anti-gravité) et ont des paires de nœuds connectés s'attirent les uns les autres. Après plusieurs itérations d'une simulation de physique, vous pouvez obtenir une mise en page raisonnable.

Il existe de nombreux algorithmes de mise en page que vous pouvez utiliser, avec des résultats très différents. Les algorithmes GraphViz fdp (Fruchterman & Reingold '91) et neato (Kamada & Kawai '89) fonctionnent, mais ils sont plutôt anciens et il existe de bien meilleures alternatives. L'algorithme Fruchterman & Reingold '91 est également disponible en Python au NetworkX.

Prefuse fournit un ForceDirectedLayout Java class qui est assez rapide et bon. Hachul & Jünger '05 détaille l'algorithme FM^3, qui semble assez bien fonctionner en pratique (Hachul & Jünger '06) et est disponible en C++ en Tulip.

Il y a des tonnes d'autres outils open source pour visualiser des graphiques, comme NodeXL (C#), un outil d'introduction qui intègre l'analyse de réseau dans Excel 2007/2010 (Disclaimer: Je suis un conseiller pour elle). D'autres outils impressionnants incluent Gephi (Java) et Cytoscape (Java), tandis que Pajek, UCINet, yEd et Tom Sawyer sont quelques alternatives exclusives.

2

En général, c'est un problème délicat, surtout si vous voulez commencer à gérer le routage des contours et rendre les choses plus belles. Vous pouvez regarder http://www.graphviz.org/ et en utilisant soit leurs outils de ligne de commande, ou en utilisant la bibliothèque graphviz pour faire votre mise en page et obtenir vos coordonnées x, y au sein de votre application.

Questions connexes