Graphes de noeud en php en utilisant svg

Résolu
Onizuka95 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention   -  
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
j'ai un projet qui consiste a faire des graphes svg en récupérant le nombres de noeuds et d'arcs dans une base de donnée.
Voici mon code de test pour dessiner le graphe :

function graph($nb_nodes, $nb_edges, $ego){
 $pos_x = 75;
 $pos_y = 75;
 $degre = 360/$nb_nodes;
 $rotation_x = cos($degre);
 $rotation_y = sin($degre);
 $pos_x_succ = -$pos_x*$rotation_x;
 $pos_y_succ = $pos_y*$rotation_y;
 $pos_x_suc = array();
 $pos_y_suc = array();
 echo'<?xml version="1.0" encoding="UTF-8" ?>';
 echo'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">';

 echo'<svg xmlns="http://www.w3.org/2000/svg" version="1.0" width="500" height="500">';
 echo' 
   <g stroke="white" stroke-width="2">';
   $pos_x_suc[0] = -$pos_x_succ;
   $pos_y_suc[0] = $pos_y_succ;
  for($i=1;$i<=$nb_nodes;$i++) { 
   $pos_x_suc[$i] = $pos_x_suc[$i-1]+$degre;
   $pos_y_suc[$i] = $pos_y_suc[$i-1]+$degre;
   echo '<line y2="'.$pos_y_suc[$i].'" x2="'.$pos_x_suc[$i].'" y1="250" x1="250" />';
    }
    echo '</g>
    <g fill="blue" stroke="black" stroke-width="2">
      <circle cx="250" cy="250" r="30" />
     </g>';
    for($j=1;$j<=$nb_nodes;$j++) {
     $pos_x_suc[$j] = $pos_x_suc[$j-1]+$degre;
   $pos_y_suc[$j] = $pos_y_suc[$j-1]+$degre; 
   echo '<g fill="red" stroke="black" stroke-width="1"> <circle cx="'.$pos_x_suc[$j].'" cy="'.$pos_y_suc[$j].'" r="20" /> </g>';
     }
     echo '</g>
    <g font-family="Arial" font-size="10" font-weight="100" text-anchor="middle">                
       <text x="250" y="250">Ego'.$ego.'</text>';
      for($k=1;$k<=$nb_nodes;$k++) {
       $pos_x_suc[$k] = $pos_x_suc[$k-1]+$degre;
   $pos_y_suc[$k] = $pos_y_suc[$k-1]+$degre;        
         echo '<text x="'.$pos_x_suc[$k].'" y="'.$pos_y_suc[$k].'">Ego '.$k.'</text>';
      }
    echo '</g>
 </svg>';
}

EDIT : ajout du LANGAGE dans les balises de code (pour la coloration syntaxique.... )

Sur l'image ci-dessous vous pouvez voir le résultat de ce code.





Ma question :
Comment faire pour avoir des arcs de même taille mais avec un angle qui varie ?
En fonction du nombre de noeud qu'il y aura, la disposition du graphe ne sera pas la même.
Par exemple si on a 4 noeud autour du noeud principal, ils seront disposer a 90° les uns des autres par rapport au noeud principal.

Merci d'avance pour vos réponses.
A voir également:

3 réponses

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

Je n'ai pas regardé le code ... mais ta question ressemble plus à un problème de math qu'autre chose...

Je pense qu'il faut que tu détermine, avant de commencer, combien de cercles tu vas devoir dessiner.
De là ... tu peux faire une simple division : 360° / N cercles
=> ce que tu fais déjà visiblement:
 $degre = 360/$nb_nodes;


Dans ce cas... se sont les coordonnées X et Y de tes points que tu dois calculer...par rapport à ton premier points (le bleu)....

Si je ne me trompe pas ...
En partant du principe que ton cerlce bleu est le "centre" d'un autre cercle (fictif... mais qui servira à positionner les autres noeuds...)
tu peux calculer les coordonnées de chaque noeud via la formule :

x = x0 + r*cos(t)
y = y0 + r*sin(t)

(x0,y0) sont les coordonées du centre (le cercle bleu)
, r est le rayon (du cercle fictif où tu vas placer tes points) ,
et t l'angle (en radian) de chaque noeud à positionner.

Ce ne sont que des maths... je le répète.... rien à voir avec du code PHP à proprement parlé....
Bonnes recherches :-)

2
Onizuka95 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour Jordan45,
Merci pour ta réponse.

En effet, tu as raison ce ne sont que des maths lol.

Je vais tester la formule que tu m'as proposé, sinon je vais m'orienté vers un forum de maths :-)
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour, je suggère ceci, pour calculer les centres de tes cercles rouges:
$rayon=40;
$degre=2*pi()/$nb_nodes;
for($i=0;$i<$nb_nodes;$i++) { 
     $pos_x_suc[$i] = $pos_x + $rayon * cos($i*$degre);
     $pos_y_suc[$i] = $pos_y + $rayon * sin($i*$degre);
}
1
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Une jolie interprétation de la formule proposée dans ma réponse précédente....
0
Onizuka95 Messages postés 6 Date d'inscription   Statut Membre Dernière intervention  
 
Merci beaucoup yg_be, c'est exactement cela :-)
0