2014-06-18 63 views
0

我仍然是一个javascript和d3的新手。我想计算d3力布局节点坐标的平均值(请记住,这些节点是灵活的,即可以通过鼠标拖动来移动)。我在其中一个答案中看到了.map的用法,并尝试使用它,但似乎存在一些问题。现在我的代码片段看起来是这样的:计算d3力布局节点坐标的平均值

 function tick() { 
      var positions = finalNodeSet.map(function(d) { 
      return [d.x, d.y]; 
     }); 

     var x1 = 0; 
     var y1 = 0; 

     for(var i=0; i<positions.length; i++){ 
      x1+=positions[[i][0]]; 
      y1+=positions[[i][1]]; 
      } 

似乎positionsobject型的,它包含了所有的所有节点的坐标与每一个“滴答”。现在我想要的是只存储坐标的最终值并获得坐标的平均值。任何人都可以帮我解决这个问题吗?

link.attr("x1", function (d) { 
      return d.source.x; 
     }) 
      .attr("y1", function (d) { 
       return d.source.y; 
      }) 
      .attr("x2", function (d) { 
       return d.target.x; 
      }) 
      .attr("y2", function (d) { 
       return d.target.y; 
      }); 

     node.each(collide(.5)) 
      .attr("cx", function (d) { 
       return d.x; 
      }) 
      .attr("cy", function (d) { 
       return d.y; 
      }); 

    } 
+0

不知道'finalNodeSet'是什么。你能告诉我们你用来设置'tick'处理程序中节点位置的代码吗? –

回答

0

这为我做:我不需要X,最后两个节点的y坐标(因为他们有一个固定值),因此排除。

var positions = finalNodeSet.map(function(d) { 

      return [d.x, d.y]; 


     }); 
     var x1 = 0; 
     var y1 = 0; 
     var xbar=0; 
     var ybar=0; 

     for(var i=0; i<positions.length-2 ; i++){ 
      x1+=positions[[i]][0]; 
      y1+=positions[[i]][1]; 

      var xbar=x1/positions.length-2; 

      var ybar=y1/positions.length-2; 
      } 

      ax1=positions[positions.length-2][0]; 
      ay1=positions[positions.length-2][1]; 
      ax2=positions[positions.length-1][0]; 
      ay1=positions[positions.length-1][1];