2015-04-07 116 views
0

我想拖動和縮放界限中的力佈局。 請檢查這個link 這裏的節點集中在佈局,但我怎麼可以在界內拖動。 我甚至嘗試過這樣的一些東西拖拽和縮放有界的力佈局d3

nodes.attr("cx", function(d) { 
    return d.x = Math.max(60, Math.min($(window).width() - 60, d.x)); 
}) 
.attr("cy", function(d) { 
    return d.y = Math.max(60, Math.min($(window).height() - 60, d.y)); 
}); 

但它不起作用。

回答

0

完成:

node.attr("transform", function(d) { 
     //Here i create a node radius so it doesnt go offscreen 
     var nodeRadius = d.weight * 2 + 12 

     //here I do checks to see if it goes offscreen 
     if(d.x<= nodeRadius){ 
      d.x = nodeRadius; 
      } 
     if(d.y<= nodeRadius){ 
      d.y = nodeRadius; 
      }7 
     if(d.x>width - nodeRadius){ 
      d.x = width - nodeRadius; 
      } 
     if(d.y>height - nodeRadius){ 
      d.y = height - nodeRadius; 
      } 

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

    }); 

這在tick function完成的,所以它會檢查每一幀。我創建了一個實際的滴答函數,因此它是可重用的。請檢查我的JSFiddle中的更改,因爲我已經做了很多。但一切似乎都很好。

更新小提琴:http://jsfiddle.net/aVhd8/177/

如果你想開始之前那麼邊界必須記住,移動到移動節點:

node.attr("transform", function(d) { 
     //Here i create a node radius so it doesnt go offscreen 
     var nodeRadius = d.weight * 2 + 12 

     //here I do checks to see if it goes offscreen 
     if(d.x<= nodeRadius-movement){ //have to take movement away as you have moved the nodes/links previously 
      d.x = nodeRadius-movement; 
      } 
     if(d.y<= nodeRadius){ 
      d.y = nodeRadius; 
      } 
     if(d.x>width - nodeRadius-movement){ 
      d.x = width - nodeRadius-movement; 
      } 
     if(d.y>height - nodeRadius){ 
      d.y = height - nodeRadius; 
      } 

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

    }); 

注意這裏我已經把movement考慮。您還需要對各環節上做到相同的:

的jsfiddle:http://jsfiddle.net/aVhd8/180/

+0

HI AJ你是天才:)。但是當我把節點放在中心時會發生什麼。希望你記得在給定的鏈接--- http://jsfiddle.net/fekkyDev/aVhd8/174/ – fekkyDEV

+0

完成之後,你所需要做的就是將移動變量考慮進去。我不能強調你需要了解你的代碼在做什麼的事實。我注意到你在這裏提出的問題很簡單,如果你考慮邏輯在做什麼。在這裏例如,你想在開始時移動你的節點?所以你把翻譯功能。但是在你的tick函數中你的邊界從這個點開始工作,節點沒有考慮前面的翻譯。希望這有助於:) –

+0

對不起,我剛剛重讀了這個問題。@ Rouby只是取消了SVG縮放調用的註釋,然後你就可以縮放/平移。與此相關的問題是,當您平移您改變力佈局的視圖時,在您移動SVG時,在tick函數中創建的邊界將關閉。調用縮放而不是縮放和平移時,您可以通過縮放來解決此問題。這個問題的另一個問題是規模不會發揮作用:http://jsfiddle.net/aVhd8/182/。或者如果你想使用平移+縮放你必須調整邊界的比例+平移值 –