d3.js D3:在力定向树中,当父节点被拖动时,如何阻止子节点被吸引向中心?

nom7f22z  于 2022-11-12  发布在  其他
关注(0)|答案(1)|浏览(217)

我已经使用d3.jsv7构建了一个强制定向树布局。
这是我目前掌握的情况。

当我把一个节点拖向边缘时,子节点似乎被吸引到了中心,比如:

相反,我希望“负载平衡”的子节点如下所示:

以下是我设置模拟的方法:

const simulation = d3
  .forceSimulation()
  .force(
    "link",
    d3
      .forceLink()
      .id((d) => d.id)
      .distance(100)
      .strength(1)
  )
  .force("charge", d3.forceManyBody().strength(-500))
  .force("x", d3.forceX())
  .force("y", d3.forceY())
  .alphaDecay(0.05);

  simulation.on("tick", () => {
    link
      .attr("x1", (d) => d.source.x)
      .attr("y1", (d) => d.source.y)
      .attr("x2", (d) => d.target.x)
      .attr("y2", (d) => d.target.y);

    node.attr("transform", function (d) {
      return "translate(" + d.x + "," + d.y + ")";
    });
  });

我已经为这个here创建了一个工作Codepen,供您使用我所说的内容。
我试过将节点和连杆的力改变为不同的值,但效果不佳。我也试过禁用center力,但如果我这样做,模拟将不会出现在屏幕上。

.force("center").strength(0)

有什么方法可以达到我的要求吗?任何帮助都是感激不尽的。

unftdfkk

unftdfkk1#

控制其他节点行为的一种方法是在拖动函数中修复它们。我已经在代码中添加了一个函数,用于修复其他节点,并不允许它们在拖动过程中移动。
第一个

相关问题