2015-04-07 56 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/。或者如果你想使用平移+缩放你必须调整边界的比例+平移值 –