【问题标题】:What is the original radius function for circle pack?圆形包的原始半径函数是什么?
【发布时间】:2014-05-16 15:32:12
【问题描述】:

我有兴趣调整圆形包布局上的圆形半径。为此,我需要知道原始半径是如何计算的。

通过阅读d3.js source code for pack layout,似乎每个节点的默认半径函数只是valueMath.sqrt。但事实并非如此,因为我修改了D3.js original circle pack example 添加了一个.radius(function(d){return Math.sqrt(d);}),正如您在bl.ocks.org/ecerulm/f0a36710e3 看到的那样,圆的半径不一样。

【问题讨论】:

  • 需要返回值——.radius(function(d) { return Math.sqrt(d); })
  • 更正了这个问题,我已经在我的代码中使用了 return。

标签: javascript d3.js circle-pack


【解决方案1】:

d3.layout.pack() 使用Math.sqrt 作为radius 函数。但是如果radius 没有明确设置pack.nodes 将应用比例变换d3_layout_packTransform(node, x, y, k) 以使整个圆形包图表适合。这就是为什么如果你应用你自己的函数(即使它的radius(Math.sqrt)),如果你想获得与隐式半径相同的结果,你将需要应用你自己的缩放。

在下面的示例中,我将Math.sqrt 明确设置为半径函数,然后缩放以适应[diameter,diameter] 与我自己的函数pack_transform,因为d3_layout_packTranform 不可访问:

var pack = d3.layout.pack()
  .value(function(d) { return d.size; })
  .radius(Math.sqrt)
  .size([diameter - 4, diameter - 4]);

var packnodes = pack.nodes(root);
var packroot = packnodes[0];
var w = diameter, h = diameter;
function pack_transform(node, k) {
    function inner_transform(node,cx,cy,k) { 
      var children = node.children;
      node.x = cx + k * (node.x-cx);
      node.y = cy + k * ( node.y-cy);
      node.r *= k;
      if (children) {
        var i = -1, n = children.length;
        while (++i < n) inner_transform(children[i],cx,cy,  k);
      }
    }
    return inner_transform(node,node.x,node.y,k);
}
pack_transform(packroot,  1 / Math.max(2 * packroot.r / w, 2 * packroot.r / h));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2015-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多