J'ai un graphe dirigé par force avec des liens entre chaque noeud. Maintenant, certaines paires de nœuds ont plusieurs liaisons entre elles. J'ai trouvé cet exemple: Dessiner plusieurs bords entre deux noeuds avec d3 .
Cela a bien fonctionné, pensai-je. Mais si vous avez des nœuds fixés et faites glisser, les chemins finissent par se chevaucher. J'ai préparé une version éditée de cet exemple: http://jsfiddle.net/thatOneGuy/7HZcR/502/
Cliquez sur le bouton pour réparer les nœuds et les déplacer pour voir ce que je veux dire.
Code pour calculer la quantité d'arc:
//sort links by source, then target links.sort(function(a,b) { if (a.source > b.source) {return 1;} else if (a.source < b.source) {return -1;} else { if (a.target > b.target) {return 1;} if (a.target < b.target) {return -1;} else {return 0;} } }); //any links with duplicate source and target get an incremented 'linknum' for (var i=0; i<links.length; i++) { if (i != 0 && links[i].source == links[i-1].source && links[i].target == links[i-1].target) { links[i].linknum = links[i-1].linknum + 1; } else {links[i].linknum = 1;}; };
Est-ce que quelqu'un peut penser à une autre façon de faire cela ou à résoudre cette façon peut-être? Je pourrais avoir 3 peut-être même 4 liens entre deux noeuds.
Le code important est celui qui donne le rayon de l'arc. Je propose la fonction suivante:
path.attr("d", function(d) { var curve=2; var homogeneous=3.2; var dx = d.target.x - d.source.x, dy = d.target.y - d.source.y, dr = Math.sqrt(dx*dx+dy*dy)*(d.linknum+homogeneous)/(curve*homogeneous); //linknum is defined above return "M" + d.source.x + "," + d.source.y + "A" + dr + "," + dr + " 0 0,1 " + d.target.x + "," + d.target.y; });
La principale différence est qu'il s'échelonne linéairement avec la distance du nœud (ce qui me semble le mieux). Ensuite, il existe ces deux paramètres que j'appelle curve
et homogeneous
: vous devriez jouer avec eux jusqu'à ce que vous trouviez des valeurs appropriées.
Voir http://jsfiddle.net/7HZcR/504/
PS: le chevauchement survient lorsque le rayon donné pour l'arc est inférieur à la moitié de la distance entre les noeuds (alors le rayon est augmenté pour atteindre cette valeur et tous les arcs ont le même rayon).