【问题标题】:Make two instances of d3.forceCollide() play nice together让 d3.forceCollide() 的两个实例一起玩得很好
【发布时间】:2016-11-18 06:57:53
【问题描述】:

我想要d3.forceCollide() 的两个实例。一方面,每个节点都被推开以防止重叠。在第二种情况下,只有一部分节点被推开,半径更大。

为了完成第二个力量,我调整了初始化方法来过滤传入的节点,如下所示:

function selective(force,filter){
    var init = force.initialize;
    force.initialize = function(_){return init(_.filter(filter));};
    return force;
}

var dpi = 90;  // approximate pixels per inch in SVG
var size = dpi * (1/4); // quarter-inch unit size

var universally_applied = 
    d3.forceCollide()
    .radius(size)
    .strength(1);

var selectively_applied =
        selective(
            d3.forceCollide(),
            function(d){return d.id === color;}
        )
        .radius(size*5)
        .strength(1);
}

现在,这几乎可以工作了。我创建了一个小提琴来查看它的实际效果:https://jsfiddle.net/jarrowwx/0dax43ue/38/ - 每个彩色圆圈都应该从远处排斥所有其他相同颜色的圆圈。其他所有颜色,它都会碰到并推开它。

如果我不更改定义事物的顺序,则选择性施加的力仅应用于第一种颜色(红色)。如果我在施加力之前对data 数组进行洗牌,则很难准确定义会发生什么,但力会施加到某些圆圈而不是大多数其他圆圈,即使在相同颜色中也是如此。

有什么想法,或者如何解决它?

【问题讨论】:

  • 嗯,这很有趣。该问题甚至不是由两个实例同时运行引起的,如果您注释掉universally_applied force 也会出现问题。但是,如果您另外将颜色数组限制为仅red,那么它就像预期的那样works smoothly。必须是部分施加力的问题。我已经重新检查了我的answer"Partial forces on nodes in D3.js",你采用了它,但在这种情况下它工作得很好。还在琢磨……
  • 我认为有一些关于洗牌的数据。如果我删除该步骤,它似乎每次运行都可以正常工作。
  • @Rothrock:是的,直到我把红色移到列表的末尾。
  • 如果有 20 个圆圈,其中 5 个是红色的,那么数组前 5 个元素中出现的所有红色圆圈都会正确地获得施加到它们的部分力。 6岁或以后的人没有。我认为它隐藏在如何使用 QuadTree 优化力的某个地方。它可能对输入数据的性质有一些(非显而易见的)编码假设。
  • 我看到它与前 5 个红色以上的作品一起工作,刚刚尝试了 10 个。

标签: javascript d3.js force-layout d3-force-directed


【解决方案1】:

D3 团队认为此行为是一个错误 (Isolating forces to a subset of nodes? #72),并对其进行了修复。该修复包含在 d3-force 的 1.0.4 版本中,该版本作为完整 D3 版本 4.4.0 版本的一部分提供。

使用"Partial forces on nodes in D3.js" 建议的解决方案解决了问题,代码现在按预期工作。

【讨论】:

  • 很高兴看到这个问题终于解决了!不过,我在您的答案中添加了更多详细信息,以使未来的读者更容易访问该解决方案。我自己的答案——尽管它给出了一些提示——有其缺陷,并且对任何偶然发现这一点的人都有误导。考虑到问题已经解决了,我心灰意冷地决定删除它。
  • 有趣的是,这同时发生,即当您提出问题时,Mike Bostock 已经开始着手解决问题。
猜你喜欢
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2015-04-30
  • 2011-03-16
  • 2016-11-13
  • 1970-01-01
相关资源
最近更新 更多