2012-02-20 9 views
5

Estoy experimentando con el diseño dirigido a la fuerza usando D3.js. Lo que necesito es centrar el diseño por root (u otro nodo seleccionado) y devolver este nodo al centro svg (por ejemplo, lienzo) después de que se haya completado la función tick (el gráfico alfa es bajo). ¿Es posible? He encontrado un ejemplo enDisposición dirigida a la fuerza central después de marcar usando el nodo raíz (volver al centro)

http://bl.ocks.org/1080941

pero soy incapaz de tomar la raíz (cuando se utiliza aplha u otro cálculo de la función de garrapata personalizado) volver de nuevo al centro (centro de la disposición por este nodo particular).

Cualquier ayuda sería apreciada.

Respuesta

6

En realidad, yo resolvieron este como esto (similar a la anterior pero más sofisticada):

force.on("tick", function(e) { 

    node.attr("transform", function(d) { 
     //TODO move these constants to the header section 
     //center the center (root) node when graph is cooling down 
     if(d.index==0){ 
      damper = 0.1; 
      d.x = d.x + (w/2 - d.x) * (damper + 0.71) * e.alpha; 
      d.y = d.y + (h/2 - d.y) * (damper + 0.71) * e.alpha; 
     } 
     //start is initiated when importing nodes from XML 
     if(d.start === true){ 
      d.x = w/2; 
      d.y = h/2; 
      d.start = false; 
     } 

     r = d.name.length; 
     //these setting are used for bounding box, see [http://blockses.appspot.com/1129492][1] 
     d.x = Math.max(r, Math.min(w - r, d.x)); 
     d.y = Math.max(r, Math.min(h - r, d.y)); 

      return "translate("+d.x+","+d.y+")";    

    } 
    ); 

    }); 
2

tratar de cambiar el controlador de eventos vigor de esta manera:

force.on("tick", function(e) { 
nodes[0].x = w/2; 
nodes[0].y = h/2; 

var k = 0.05 * e.alpha; 
      nodes.forEach(function(o, i) { 
      o.y += (nodes[0].y - o.y) * k; 
      o.x += (nodes[0].x - o.x) * k; 
      }); 

link.attr("x1", function(d) { return d.source.x; }) 
    .attr("y1", function(d) { return d.source.y; }) 
    .attr("x2", function(d) { return d.target.x; }) 
    .attr("y2", function(d) { return d.target.y; }); 

node.attr("cx", function(d) { return d.x; }) 
    .attr("cy", function(d) { return d.y; }); 
}); 
+0

Gracias por su respuesta. Ya estoy usando esta solución y el problema es que el nodo seleccionado es arrastrable pero no regresa a las coordenadas dadas (originales) después de que se establece el gráfico. También intenté usar el valor alfa (calor) de la función de tilde de gráfico, pero ninguna de las soluciones hizo el trabajo. Necesito permitir al usuario arrastrar el gráfico y luego devolver el gráfico a la posición "fija" por algún nodo seleccionado :-) – Bery

Cuestiones relacionadas