我希望能够分别对节点的几个子部分应用几个力(forceX 和 forceY)。
更详细地说,我有这个 JSON 数据作为我的节点数据:
我希望的是仅对具有“Thème 1”主题属性的节点施加一些力,或者对于“Thème 2”值等其他力施加其他力。
我一直在查看源代码以检查是否可以将模拟的子部分分配给力,但我没有找到它。
我得出结论,我需要实现几个次要的,并仅应用它们各自的节点子部分,以处理我之前提到的力。以下是我在d3伪代码中想做的事情:
但是考虑到计算,我认为这并不是最优的选择。
是否有可能对模拟节点的子部分施加力而无需创建其他模拟?
实施altocumulus的第二个解决方案:
我尝试了这个解决方案,像这样:
我得出结论,过滤后的数组没有被分配给nodes,但我不知道原因。 PS:我用console.log检查了一下:nodes.filter(...)确实返回了一个填充好的数组,所以这不是问题的根源。
更详细地说,我有这个 JSON 数据作为我的节点数据:
[{
"word": "expression",
"theme": "Thème 6",
"radius": 3
}, {
"word": "théorie",
"theme": "Thème 4",
"radius": 27
}, {
"word": "relativité",
"theme": "Thème 5",
"radius": 27
}, {
"word": "renvoie",
"theme": "Thème 3",
"radius": 19
},
....
]
我希望的是仅对具有“Thème 1”主题属性的节点施加一些力,或者对于“Thème 2”值等其他力施加其他力。
我一直在查看源代码以检查是否可以将模拟的子部分分配给力,但我没有找到它。
我得出结论,我需要实现几个次要的,并仅应用它们各自的节点子部分,以处理我之前提到的力。以下是我在d3伪代码中想做的事情:
mainSimulation = d3.forceSimulation()
.nodes(allNodes)
.force("force1", aD3Force() )
.force("force2", anotherD3Force() )
cluster1Simulation = d3.forceSimulation()
.nodes(allNodes.filter( d => d.theme === "Thème 1"))
.force("subForce1", forceX( .... ) )
cluster2Simulation = d3.forceSimulation()
.nodes(allNodes.filter( d => d.theme === "Thème 2"))
.force("subForce2", forceY( .... ) )
但是考虑到计算,我认为这并不是最优的选择。
是否有可能对模拟节点的子部分施加力而无需创建其他模拟?
实施altocumulus的第二个解决方案:
我尝试了这个解决方案,像这样:
var forceInit;
Emi.nodes.centroids.forEach( (centroid,i) => {
let forceX = d3.forceX(centroid.fx);
let forceY = d3.forceY(centroid.fy);
if (!forceInit) forceInit = forceX.initialize;
let newInit = nodes => {
forceInit(nodes.filter(n => n.theme === centroid.label));
};
forceX.initialize = newInit;
forceY.initialize = newInit;
Emi.simulation.force("X" + i, forceX);
Emi.simulation.force("Y" + i, forceY);
});
我的质心数组可能会改变,这就是为什么我不得不实现一种动态的方式来实现我的子力。然而,在模拟时钟中,我最终遇到了这个错误:
09:51:55,996 TypeError: nodes.length is undefined
- force() d3.v4.js:10819
- tick/<() d3.v4.js:10559
- map$1.prototype.each() d3.v4.js:483
- tick() d3.v4.js:10558
- step() d3.v4.js:10545
- timerFlush() d3.v4.js:4991
- wake() d3.v4.js:5001
我得出结论,过滤后的数组没有被分配给nodes,但我不知道原因。 PS:我用console.log检查了一下:nodes.filter(...)确实返回了一个填充好的数组,所以这不是问题的根源。