代码之家  ›  专栏  ›  技术社区  ›  thatOneGuy

D3 forceX/forceY和forceCenter之间的差异

  •  1
  • thatOneGuy  · 技术社区  · 6 年前

    var simulation = d3v5.forceSimulation()
          .force('link', d3v5.forceLink().id(function (d) { return d.id; }))
          .force('charge', d3v5.forceManyBody())
          .force('center', d3v5.forceCenter(width / 2, height / 2))
    

    下面是一个代码笔示例(参见第57行): https://codepen.io/anon/pen/PdOqZK?editors=1010

    最后一行设置力中心。当我拖动节点并设置中心时,节点似乎从中心向外移动。但当我有以下情况时:

    var simulation = d3v5.forceSimulation()
          .force('link', d3v5.forceLink().id(function (d) { return d.id; }))
          .force('charge', d3v5.forceManyBody())
          .force('x', d3v5.forceX(width / 2))
          .force('y', d3v5.forceY(height / 2))
    

    下面是一个代码笔示例(参见第57行): https://codepen.io/anon/pen/gdXprR?editors=1010

    它按预期工作。如果有人能解释发生了什么就好了。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Gerardo Furtado    6 年前

    两个jsfiddle的行为都是预期的。

    这里的问题是 d3.forceCenter d3.forceX/Y 可互换的或类似的方法。 “居中” 不同的是,它们有非常不同的用途和效果。

    如果你看一下API,你会发现 d3.力中心 ...

    …均匀地平移节点,以便 全部的 节点(如果所有节点重量相等,则为质心)位于给定位置–x,y。

    因此,这里的重要概念是 . 例如,将节点移到右侧时,其他节点将移到左侧,因此质心将保持在指定的位置。这种行为的效果是,如果将一个节点拖到SVG的边缘,其他节点将在另一侧消失。

    另一方面, “定位” 不会同时影响所有节点。如API所述 d3.X/Y力 ,

    ... 而这些力可以用来定位 单个节点 ... (我的重点)