MAR
23
Dessiner un réseau de données en PHP
23.03.2008 | | Auteur : Ayashi | Catégorie : Programmation


Si vous avez déja eu l'occasion de travailler avec des réseaux de données ( une liste d'objet et de liens entre ces objets ) vous avez du être confronté à la difficultée de les représenter graphiquement. Il existe plusieurs algorithmes plus ou moins adaptés mettant en oeuvre des modèles de forces ( électrique, magnétique, gravitationnelles,.. ) A ma connaissance, ces algorithmes n'ont pas été portés en PHP.

Le code que je vous propose ici permet de représenter des réseaux de données en utilisant une implémentation de l'algorithme de force / répulsion ( aussi appelé Spring forces ). Le rendus est effectué via la librairie GD2. Quelques images illustrent cette articles, elles ont toutes été générées par ce script.

Le modèle d'attraction / répulsion est simple à construire, il consiste à calculer les vecteurs de forces appliqués à chaques noeuds provenant de chaques autre noeuds.

Deux règles s'appliquent :
  • Deux noeuds liés subiront une force d'attraction proportionelle à la distance qui les sépare.
  • Deux noeuds appliqueront l'un par rapport à l'autre une force de répulsion inversement proportionelle à la distance qui les sépare.
Pour calculer ces vecteurs il est nécessaire de faire quelques calculs trigonométriques.

Les vecteurs sont caractérisés par un angle et une force. La force doit dépendre de la distance entre les objets. Pour environ 20 objets, les valeurs suivantes permettent d'obtenir des graphs de qualité :
Une fois tous les vecteurs calculés pour chaques noeuds, il reste à les appliquer. Les étapes calcul / déplacement doivent être répétées suffisamment de fois pour que l'équilibre des noeuds soit atteint. Dans certaines configuration cela est impossible.


Je vous invite à télécharger ce script pour essayer de jouer avec les différents paramètres ( principalement $RepulsionFactor, $RepulsionAtt, $AttractionFactor, $AttractionAtt ). Il convient des les adapter suivant le nombre de noeuds et de liaisons.

Pour télécharger ce script, cliquez ici.

Au début du script vous trouverez 3 méthodes pour générer des réseaux : "Every nodes connected to all nodes" génère un réseau ou tous les noeuds sont reliés à tous les noeuds, "All nodes connected to a single same node" génère un réseau ou tous les noeuds sont reliés à un noeud central, "All nodes with random connection to another node" probablement le plus intéressant car les connections sont aléatoires. Le nombre de noeuds est définis par la variable $MaxNodes. Vous pouvez exécuter ce script en utilisant PHP-CLI :

php -q vectors.php

Le fichier final.jpg sera alors généré dans le même répertoire.
Tags : php, gd, spring, forces | Digg!
Commentaires  | Ajouter un commentaire
Kevin Campion
18.12.08 / 21:10
Bon boulot !! Très impressionnant.Il y a quelque correction à y apporter :- pour éviter des erreur warning php (division par zéro)- pour que le script trouve le fichier myriad.ttf (chez moi cela posait problème)J'ai les sources modifiées si vous le souhaitez, contactez-moi par email ;)
Ayashi
06.10.08 / 14:44
Wow Impressionnant! (faut-il comprendre quelque chose?) Je ne connaissait pas ce logiciel (viens de regarder le site), le concept à l'air sympa mais je n'en ai pas l'utilité.
moi
04.10.08 / 22:47
c'est vraiment moyen ton blog et arrête de te faire passer pour moi chez valdo et autres je t'ai reconnu espèce de faux-c... t'as beau utiliser tor tu t'es trahi toi-même.ne m'adresse plus la parole !
_argos
03.07.08 / 3:10
Hi, your scripts are very interesting, good work.
Ernest
27.06.08 / 20:55
Hello! I barely understand french but I am really impressed with your work. I'll try your charts library in my next project. Au revoir.
Rechercher sur internet  ?  | Rechercher!
Trackback
Utilisez le lien http://www.sunyday.net/trackback-Dessiner-un-reseau-de-donnees-en-PHP pour faire un trackback vers cette article depuis votre site web. Les trackbacks sont soumis à une approbation mutuelle et susceptibles d'être supprimés si jugés indésirables.
Retrieve RSS feed. Get notified by eMail. Meteo Parser.
Computing widgets...
Jean-Damien POGOLOTTI© 2k6-2k7 | Design // Code

Qui suis-je?

Touche à tout restant bouche bée devant la complexité et la cohérence de ce monde je m'évertue à essayer d'en comprendre les rouages. En passant par la météorologie, la physique ou bien l'informatique, tout est une raison d'apprendre!
Comment les gens arrivent-il ici?
 lldp  www.sunyday.net  les  explication  en  terrestre  convertir  ntfs  google  fade  authentification  map  convertisseur  html  regex  web  line  active  des  url  mercator  conversion  menu  latitude  le  et  couche  protocole  snmp  magn%C3%A9tique  synop  SUR  metar  javascript  nuls  module  longitude  directory  coordonn%C3%A9es  +  browser  gps  la  script  d%27ozone  resize  pour  photovoltaique  ldap  adresse  dans  PAGE  champ  find  CODE  fading  ajax  php  une  image  un  regexp  sunyday  cli  anim%C3%A9  trou  avec  ad  sunyday.net  de  

Sunyday.net