【问题标题】:How do I limit the panning on a force directed graph layout without axis ? D3/JS如何限制没有轴的力有向图布局上的平移? D3/JS
【发布时间】:2014-12-01 16:39:22
【问题描述】:

这里有个问题

d3.js: pan with limits

回答限制平移运动的问题。但这使用了我没有的轴。

我所拥有的是具有平移和缩放能力的力导向图。

现在我已经限制了缩放使用:

.call(d3.behavior.zoom().on("zoom", redraw).scaleExtent([0.8, 2]))

我想知道如何限制该图的平移运动,这样我就不会将网络/图拖到视口之外。

(网络可能会根据导入的JSON文件改变大小,所以我不能使用确切的数字)

inner.attr("transform","translate(" + d3.event.translate + ")" + " scale(" + d3.event.scale + ")"); 

【问题讨论】:

  • zoom 事件处理程序中,检查当前翻译是否超出了您想要限制的范围,如果超出,请不要将其应用于 SVG。
  • 那么你是怎么做到的呢? @LarsKotthoff
  • 这就是@Elijah 在他的回答中所做的。
  • 好的。我知道了。他放了“你的重绘功能的其余部分,现在在你的缩放上使用更新的翻译”。我如何将其应用于我的:“inner.attr("transform","translate(" + d3.event.translate + ")" + " scale(" + d3.event.scale + ")"); "? ? @LarsKotthoff
  • 如果您对某个答案有任何疑问,请对该答案发表评论。

标签: javascript d3.js


【解决方案1】:

没有等效的 zoom.extent。不过,您可以在重绘函数中使用 mins 和 maxes 覆盖缩放的转换。例如,如果您想将缩放限制在其原始位置的 500 像素以内:

function redraw() {

 var oldT = yourZoom.translate()
 var newT = [0,0]
 newT[0] = Math.max(-500,oldT[0]);
 newT[0] = Math.min(500,oldT[0]);
 newT[1] = Math.max(-500,oldT[0]);
 newT[1] = Math.min(500,oldT[0]);
 yourZoom.translate(newT);

//The rest of your redraw function, now using the updated translate on your zoom

}

【讨论】:

  • 我似乎无法弄清楚。我有 "inner.attr("transform","translate(" + newT + ")" + "scale("+ d3.event.scale +")"); " 但这只移动对角线但边界有效。我究竟做错了什么 ? :(@以利亚
  • 把整个东西放到 jsFiddle 或 gist.github.com 上,我们看一看就会更容易。
猜你喜欢
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
  • 2011-12-13
  • 2013-06-25
  • 2013-06-30
  • 2017-11-17
  • 1970-01-01
相关资源
最近更新 更多