Javascript 使用D3力模拟作为纯函数

Javascript 使用D3力模拟作为纯函数,javascript,d3.js,functional-programming,d3-force-directed,Javascript,D3.js,Functional Programming,D3 Force Directed,Im使用d3力进行碰撞检测: function layout(nodesWithXY) { const simulation = forceSimulation(nodesWithXY) .force('collide', forceCollide(4.5)) .stop() .tick(300) return simulation.nodes() } 我不希望图形被设置动画,所以我只需要在300个刻度后获得节点的最终状态 但是如果我可以再次运行模拟(使用相同

Im使用d3力进行碰撞检测:

function layout(nodesWithXY) {
  const simulation = forceSimulation(nodesWithXY)
    .force('collide', forceCollide(4.5))
    .stop()
    .tick(300)

  return simulation.nodes()
}
我不希望图形被设置动画,所以我只需要在300个刻度后获得节点的最终状态

但是如果我可以再次运行模拟(使用相同的
节点和xy
)并得到相同的结果,那就太好了。这将使它更易于在react中使用

这可能吗?
e、 g.通过运行更多迭代或调整alpa和衰减值?

简言之:D3力模拟不能且不应是纯函数(即,如果传入相同参数,则始终返回相同值的函数)

原因是,模拟就像一个物理系统一样,是无序演化的,存在着不确定性。通过它的设计,一个D3力的模拟是可行的

我们可以在基本模拟中轻松演示这一点:

const nodes=d3.range(5.map)(()=>({
x:100,
y:100
}));
常量模拟=d3.forceSimulation(节点)
.力(“碰撞”,d3.力碰撞(10))
.停止
.勾选(300)
console.log(nodes.map(d=>d.x))

所以几周前,我在2016年偶然发现了Mike Bostock的这篇文章:“使用phyllotaxis,d3强制初始化现在是确定性的!在重新加载和浏览器之间是一致的。”

如果我将x和y的初始值设置为
NaN
,我将得到确定性结果。这里有一些描述:

const nodes=d3.range(5.map)(()=>({
//使用NaN来进行确定
x:楠,
y:楠
}));
常量模拟=d3.forceSimulation(节点)
.力(“碰撞”,d3.力碰撞(10))
.停止
.勾选(300)
console.log(nodes.map(d=>d.x))

不过,你可以将它包装在一个monad/functor中,这样在编写/组合它与其他函数/动作时,有效的计算会推迟到你实际运行它为止。我最后做的基本上是一个记忆函数。我存储模拟结果和参数,如果参数没有改变,我返回存储的结果。但是关于如何在js中进行确定性碰撞检测/定位,有什么建议吗?(有或没有d3)@errnesto不,我不知道有哪个图书馆能做到这一点。看起来很有趣。不过我没有试过