An error occurred while loading the file. Please try again.
index.js 1.87 KiB
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,
          n = children.length,
          r = padding(node) * k || 0,
      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; } }; }