+94
@@ -0,0 +1,94 @@
|
||||
import roundNode from "./round.js";
|
||||
import squarify from "./squarify.js";
|
||||
import {required} from "../accessors.js";
|
||||
import constant, {constantZero} from "../constant.js";
|
||||
|
||||
export default function() {
|
||||
var tile = squarify,
|
||||
round = false,
|
||||
dx = 1,
|
||||
dy = 1,
|
||||
paddingStack = [0],
|
||||
paddingInner = constantZero,
|
||||
paddingTop = constantZero,
|
||||
paddingRight = constantZero,
|
||||
paddingBottom = constantZero,
|
||||
paddingLeft = constantZero;
|
||||
|
||||
function treemap(root) {
|
||||
root.x0 =
|
||||
root.y0 = 0;
|
||||
root.x1 = dx;
|
||||
root.y1 = dy;
|
||||
root.eachBefore(positionNode);
|
||||
paddingStack = [0];
|
||||
if (round) root.eachBefore(roundNode);
|
||||
return root;
|
||||
}
|
||||
|
||||
function positionNode(node) {
|
||||
var p = paddingStack[node.depth],
|
||||
x0 = node.x0 + p,
|
||||
y0 = node.y0 + p,
|
||||
x1 = node.x1 - p,
|
||||
y1 = node.y1 - p;
|
||||
if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
|
||||
if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
|
||||
node.x0 = x0;
|
||||
node.y0 = y0;
|
||||
node.x1 = x1;
|
||||
node.y1 = y1;
|
||||
if (node.children) {
|
||||
p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
|
||||
x0 += paddingLeft(node) - p;
|
||||
y0 += paddingTop(node) - p;
|
||||
x1 -= paddingRight(node) - p;
|
||||
y1 -= paddingBottom(node) - p;
|
||||
if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
|
||||
if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
|
||||
tile(node, x0, y0, x1, y1);
|
||||
}
|
||||
}
|
||||
|
||||
treemap.round = function(x) {
|
||||
return arguments.length ? (round = !!x, treemap) : round;
|
||||
};
|
||||
|
||||
treemap.size = function(x) {
|
||||
return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
|
||||
};
|
||||
|
||||
treemap.tile = function(x) {
|
||||
return arguments.length ? (tile = required(x), treemap) : tile;
|
||||
};
|
||||
|
||||
treemap.padding = function(x) {
|
||||
return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
|
||||
};
|
||||
|
||||
treemap.paddingInner = function(x) {
|
||||
return arguments.length ? (paddingInner = typeof x === "function" ? x : constant(+x), treemap) : paddingInner;
|
||||
};
|
||||
|
||||
treemap.paddingOuter = function(x) {
|
||||
return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
|
||||
};
|
||||
|
||||
treemap.paddingTop = function(x) {
|
||||
return arguments.length ? (paddingTop = typeof x === "function" ? x : constant(+x), treemap) : paddingTop;
|
||||
};
|
||||
|
||||
treemap.paddingRight = function(x) {
|
||||
return arguments.length ? (paddingRight = typeof x === "function" ? x : constant(+x), treemap) : paddingRight;
|
||||
};
|
||||
|
||||
treemap.paddingBottom = function(x) {
|
||||
return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant(+x), treemap) : paddingBottom;
|
||||
};
|
||||
|
||||
treemap.paddingLeft = function(x) {
|
||||
return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant(+x), treemap) : paddingLeft;
|
||||
};
|
||||
|
||||
return treemap;
|
||||
}
|
||||
Reference in New Issue
Block a user