2012-02-20 2 views
5

Я экспериментирую с силовой направленной компоновкой, используя D3.js. То, что мне нужно, - это центр макета root (или другой выбранный узел) и вернуть этот узел в центр svg (например, canvas) после выполнения функции tick (график альфа низкий). Является ли это возможным? Я нашел пример вНаправленная ориентация центра после тика с использованием корневого узла (возврат в центр)

http://bl.ocks.org/1080941

, но я не в состоянии сделать корень (при использовании Aplha или другой расчет функции пользовательского клеща) вернуться обратно в центр (центр расположение этого конкретного узла).

Любая помощь будет оценена по достоинству.

ответ

6

На самом деле я решил это так (по аналогии с предыдущим, но более сложным):

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

Попробуйте изменить обработчик события силы, как это:

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

Спасибо за ваш ответ. Я уже использую это решение, и проблема в том, что выбранный узел перетаскивается, но после того, как график будет установлен, он не возвращается к заданным (оригинальным) координатам. Я также попытался использовать значение альфа (теплоты) функции тика графа, но ни одно из решений не выполняло работу. Мне нужно разрешить пользователю перетаскивать граф, а затем возвращать граф в «фиксированную» позицию некоторым выбранным узлом :-) – Bery