小编Pep*_*G-a的帖子

初始化图形后,d3-force更新forceCollide的半径

这个问题是对前一个题为"初始化图形后D3强制更新参数"(初始化图形后的 D3- 强制更新参数)和@altocumulus回答的后续问题的后续跟进.

我试图在修改一些节点的半径后更新模拟力.但是,当我打电话forceCollide来考虑更改时,它不起作用.

图形首先正确启动,使用forceCollide和函数使力与半径对应:

var forceCollide = d3.forceCollide()
.radius(function(d){return d.radius;})
.iterations(2)
.strength(0.95);

var simulation = d3.forceSimulation()
.velocityDecay(velocityDecay)
.force("collide", forceCollide);
Run Code Online (Sandbox Code Playgroud)

然后我修改d.radius对象并想要forceCollide反映更改.但是,当我forceCollide再次打电话时,它不起作用:

forceCollide.radius(function(d){
d.radius;})
Run Code Online (Sandbox Code Playgroud)

有关为什么会发生这种情况的任何想法?

d3.js force-layout d3-force-directed

4
推荐指数
1
解决办法
977
查看次数

D3-初始化图形后强制更新参数

在带有强制模块的D3 v4中,如何在初始化图形后更新模拟的参数?

更确切地说,我试图改变.forceLink.forceManyBody力向图,当用户点击其中一个节点.

 var node = svg
    .append("g")
    .attr("class", "gnodes")
    .selectAll(".node")
    .data(graph.nodes)
    .enter()
    .append("g")
    .attr("class", "node")
    .on('dblclick', connectedNodes); //calls for change in simulation parameters
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经能够通过在connectedNodes函数下复制模拟来更新它:

function connectedNodes() {

//new parameters
linkDistance = 5;
fCharge = -10;

//replicates the initial simulation code
simulation = d3.forceSimulation()
    .force("link", d3.forceLink()
        .id(function(d) {return d.id;})
        .distance(linkDistance)
        )
    .force("collide", d3.forceCollide()
        .radius(function(d){return d.r + 10})
        .strength(1)
        )
    .force("charge", d3.forceManyBody()
        .strength(fCharge)
        )
    .force("center", d3.forceCenter(width / 2, height / 2));

simulation.nodes(graph.nodes).on("tick", ticked);

simulation.force("link").links(graph.links);
Run Code Online (Sandbox Code Playgroud)

虽然这是有效的,但它非常多余.有没有一种方法可以使用新参数刷新模拟?我尝试了以下但它不起作用

function connectedNodes() …
Run Code Online (Sandbox Code Playgroud)

d3.js force-layout

3
推荐指数
1
解决办法
1670
查看次数

标签 统计

d3.js ×2

force-layout ×2

d3-force-directed ×1