Dessiner plusieurs liens entre des nœuds fixes

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).