2012-02-20 12 views
5

Eksperymentuję z układem ukierunkowanym na siłę za pomocą D3.js. To, czego potrzebuję, to wyśrodkowanie układu według katalogu głównego (lub innego wybranego węzła) i zwrócenie tego węzła do centrum svg (na przykład na płótnie) po wykonaniu funkcji zaznaczania (wykres alfa jest niski). Czy to możliwe? Znalazłem przykład wCentralny układ sterowania siłą po zaznaczeniu za pomocą węzła głównego (powrót do centrum)

http://bl.ocks.org/1080941

ale nie jestem w stanie zrobić root (przy użyciu aplha lub inne obliczenia funkcji niestandardowej zaznaczyć) powrócić do centrum (w środku układ przez tego konkretnego węzła).

Każda pomoc zostanie doceniona.

Odpowiedz

6

Właściwie Rozwiązałem to tak (podobna do poprzedniej, ale bardziej wyrafinowany):

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

Spróbuj zmienić obsługi zdarzeń siły tak:

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

dzięki za odpowiedź. Używam już tego rozwiązania i problem polega na tym, że wybrany węzeł jest przeciągalny, ale nie powraca do zadanych (oryginalnych) współrzędnych po ustabilizowaniu się wykresu. Próbowałem również używać wartości alfa (ciepła) funkcji tick tick, ale żadne rozwiązanie nie działało. Potrzebuję umożliwić użytkownikowi przeciągnięcie wykresu, a następnie powrót wykresu do "ustalonej" pozycji przez wybrany węzeł :-) – Bery

Powiązane problemy