gpt4 book ai didi

javascript - circle pack 的原始半径函数是什么?

转载 作者:行者123 更新时间:2023-11-29 22:01:09 25 4
gpt4 key购买 nike

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

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

最佳答案

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

在下面的示例中,我明确地将 Math.sqrt 设置为半径函数,然后使用我自己的函数 pack_transform 进行缩放以适应 [diameter,diameter] 因为 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));

关于javascript - circle pack 的原始半径函数是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23699226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com