Javascript 如何使用d3.js、force和network仅使用一个函数设置cx和cy?

Javascript 如何使用d3.js、force和network仅使用一个函数设置cx和cy?,javascript,d3.js,Javascript,D3.js,我所发现的一切都是这样来改变 .attr("cx", function(d) {var x... return x; }) .attr("cy", function(d) {var y... return y; }) 但是我有一个函数F(x,y),它返回{x:value,y:value} 因为这个F函数在计算上很昂贵,所以我不能调用它两次 我需要这样的东西: node.attr("[cx,cy]", function(d){ return F(d.x,d.y) } 只需为每个节点设

我所发现的一切都是这样来改变

  .attr("cx", function(d) {var x... return x; })
  .attr("cy", function(d) {var y... return y; })
但是我有一个函数
F(x,y)
,它返回
{x:value,y:value}

因为这个
F
函数在计算上很昂贵,所以我不能调用它两次

我需要这样的东西:

 node.attr("[cx,cy]", function(d){ return F(d.x,d.y) }
只需为每个节点设置
cx
cy
调用函数
F
一次即可。 它位于函数
tick()
中。我认为
node.attr(…)
会自动调用每个节点的函数,这就是为什么我不在
node.attr(…)
行之前执行函数
F


有什么方法可以做到这一点吗?

您可以预先计算一次值并将其存储在数据对象中:

data.forEach(function (d) {
    var result = F(d.x, d.y);
    d.computedX = result[0];
    d.computedY = result[1];
});
后来:

node.attr("cx", function(d) { return d.computedX; })
    .attr("cy", function(d) { return d.computedY; })