【问题标题】:Adding Pan Zoom to d3js force directed将平移缩放添加到 d3js 强制定向
【发布时间】:2014-04-07 22:27:25
【问题描述】:

我正在慢慢地用 d3.js 做一个工作流设计器。我正在尝试从示例中添加平移/缩放行为。关于如何使它工作的任何想法?我已经让它部分工作了,非常粗糙,有可怕的抖动,但在我的挫败中我没有保存就修改了它,尽管它还是很差。

工作流程进行中

http://jsfiddle.net/3ckG5/27/

平移/缩放示例

http://bl.ocks.org/benzguo/4370043

鼠标向下

  if (!mousedown_node && !mousedown_link) {
    // allow panning if nothing is selected
    svg.call(d3.behavior.zoom().on("zoom"), rescale);
    return;
  }  

鼠标上移

  if (!mousedown_node && !mousedown_link) {
    // allow panning if nothing is selected
    force.start();
    svg.call(d3.behavior.zoom().on("zoom"), null);
    return;
  } 

附加事件

为力有向图创建背景。

var svg = d3.select('body')
  .append('svg')
  .attr('width', width)
  .attr('height', height);

调用缩放函数的行为

svg.call(d3.behavior.zoom().on("zoom", rescale))
    .on("dblclick.zoom", null)
    .on("mousemove", mousemove)
    .on("mousedown", mousedown)
    .on("mouseup", mouseup);

回调缩放事件

// rescale g
function rescale() {
  var trans=d3.event.translate;
  var scale=d3.event.scale;

  svg.attr("transform",
      "translate(" + trans + ")"
      + " scale(" + scale + ")");
}

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    您遇到的问题是您正在平移和缩放 SVG 画布,而您真正想要做的是平移和缩放包含网络的 g 元素。

    但请记住,当您缩放该 g 元素时,它会缩放其中每个元素的笔画宽度,因此您需要根据当前缩放级别重新调整您的笔画宽度(只需将所需的笔画宽度除以当前的比例值)。

    您可以在此处看到具有强制布局的有效平移和缩放功能: http://bl.ocks.org/emeeks/9357371

    【讨论】:

    • 感谢您提供这个新示例。
    • 还要感谢您整理的全面的BOOK。我已经有了我的副本 :-)
    • 嗨,谢谢你的例子。我已经调查过了,发现缺少了一些东西。在强制图的原始示例中,您可以抓取一个点并拉伸它。
    • 对不起 - 输入错误,所以我在这里继续。我的解决方案是在单击节点时将“stopPropgation()”添加到缩放和拖动事件中。这是代码:plnkr.co/edit/cxLlvIlmo1Y6vJyPs6N9?p=catalogue
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2011-07-17
    相关资源
    最近更新 更多