mirror of
https://kevinblog.sytes.net/Code/Jibo-Revival-Group/RoboCommander.git
synced 2026-06-15 22:16:01 +00:00
80 lines
1.9 KiB
JavaScript
80 lines
1.9 KiB
JavaScript
|
|
import {packEnclose} from "./siblings";
|
||
|
|
import {optional} from "../accessors";
|
||
|
|
import constant, {constantZero} from "../constant";
|
||
|
|
|
||
|
|
function defaultRadius(d) {
|
||
|
|
return Math.sqrt(d.value);
|
||
|
|
}
|
||
|
|
|
||
|
|
export default function() {
|
||
|
|
var radius = null,
|
||
|
|
dx = 1,
|
||
|
|
dy = 1,
|
||
|
|
padding = constantZero;
|
||
|
|
|
||
|
|
function pack(root) {
|
||
|
|
root.x = dx / 2, root.y = dy / 2;
|
||
|
|
if (radius) {
|
||
|
|
root.eachBefore(radiusLeaf(radius))
|
||
|
|
.eachAfter(packChildren(padding, 0.5))
|
||
|
|
.eachBefore(translateChild(1));
|
||
|
|
} else {
|
||
|
|
root.eachBefore(radiusLeaf(defaultRadius))
|
||
|
|
.eachAfter(packChildren(constantZero, 1))
|
||
|
|
.eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
|
||
|
|
.eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
|
||
|
|
}
|
||
|
|
return root;
|
||
|
|
}
|
||
|
|
|
||
|
|
pack.radius = function(x) {
|
||
|
|
return arguments.length ? (radius = optional(x), pack) : radius;
|
||
|
|
};
|
||
|
|
|
||
|
|
pack.size = function(x) {
|
||
|
|
return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
|
||
|
|
};
|
||
|
|
|
||
|
|
pack.padding = function(x) {
|
||
|
|
return arguments.length ? (padding = typeof x === "function" ? x : constant(+x), pack) : padding;
|
||
|
|
};
|
||
|
|
|
||
|
|
return pack;
|
||
|
|
}
|
||
|
|
|
||
|
|
function radiusLeaf(radius) {
|
||
|
|
return function(node) {
|
||
|
|
if (!node.children) {
|
||
|
|
node.r = Math.max(0, +radius(node) || 0);
|
||
|
|
}
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
function packChildren(padding, k) {
|
||
|
|
return function(node) {
|
||
|
|
if (children = node.children) {
|
||
|
|
var children,
|
||
|
|
i,
|
||
|
|
n = children.length,
|
||
|
|
r = padding(node) * k || 0,
|
||
|
|
e;
|
||
|
|
|
||
|
|
if (r) for (i = 0; i < n; ++i) children[i].r += r;
|
||
|
|
e = packEnclose(children);
|
||
|
|
if (r) for (i = 0; i < n; ++i) children[i].r -= r;
|
||
|
|
node.r = e + r;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
function translateChild(k) {
|
||
|
|
return function(node) {
|
||
|
|
var parent = node.parent;
|
||
|
|
node.r *= k;
|
||
|
|
if (parent) {
|
||
|
|
node.x = parent.x + k * node.x;
|
||
|
|
node.y = parent.y + k * node.y;
|
||
|
|
}
|
||
|
|
};
|
||
|
|
}
|