Graphes de noeud en php en utilisant svg

Résolu/Fermé
Onizuka95 Messages postés 6 Date d'inscription samedi 4 mars 2017 Statut Membre Dernière intervention 5 mars 2017 - Modifié par jordane45 le 4/03/2017 à 03:02
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 - 4 mars 2017 à 14:06
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 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
4 mars 2017 à 03:17
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 samedi 4 mars 2017 Statut Membre Dernière intervention 5 mars 2017
4 mars 2017 à 12:35
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 22728 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 476
Modifié par yg_be le 4/03/2017 à 13:18
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 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
4 mars 2017 à 14:06
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 samedi 4 mars 2017 Statut Membre Dernière intervention 5 mars 2017
4 mars 2017 à 14:01
Merci beaucoup yg_be, c'est exactement cela :-)
0