2017-08-23 4 views
1

Salut, je suis nouveau à D3 et je ne trouve pas d'exemples de disposition de force d3 qui a des barrières qui sont des chemins. Je pense quelque chose comme ça.Une barrière de noeud est-elle possible avec la disposition de force d3?

Hour glass of circle nodes

comme cela, mais limite irrégulière, pas une boîte. https://bl.ocks.org/mbostock/1129492

+0

Relatif (D3 V4): https://stackoverflow.com/questions/39928306/d3-js-force-layout-boundary-issue-v4 cherchez-vous à le faire sur une version spécifique de D3? –

+0

Cela peut être utile aussi: détecter si le point est dans un polygone https://stackoverflow.com/questions/13279165/how-to-find-if-point-is-inside-polygon-in-d3-js –

+0

J'étais cherchant à le faire en v4 et pensant que peut-être l'un des nœuds pourrait ignorer les forces et être placé spécifiquement et dégager une charge négative, repoussant les autres nœuds. – zippyferguson

Répondre

-2

Je ne vois pas pourquoi ce n'est pas possible, le code utilisé dans l'exemple:

function tick() { 
node.attr("cx", function(d) { return d.x = Math.max(radius, Math.min(width - radius, d.x)); }) 
    .attr("cy", function(d) { return d.y = Math.max(radius, Math.min(height - radius, d.y)); }); 

définit simplement les valeurs maximales et minimales pour le centre des noeuds (cx et cy). Donc, si vous pouvez écrire une équation qui représente la forme de l'arête que vous voulez créer, vous devriez être capable de contenir les nœuds dans cette forme.

La difficulté pourrait être de refléter la forme de l'autre côté du svg.

Quelque chose comme:

function tick() { 
node.attr("cx", function(d) { return function(d){ 
d.x = Math.max(radius, Math.min(d3.select(this).attr("cy")- radius, d.x)); }} 
.attr("cy", function(d) { return d.y = Math.max(radius, Math.min(height - radius, d.y))) 
} 

Je pense qu'il faut mettre en place une ligne diagonale sur le côté droit avec un 1: 1 gradient mais évidemment pas testé et il pourrait ralentir massivement vers le bas la force.