|
4410 | 4410 | } |
4411 | 4411 | var d3_layout_hierarchyInline = false; |
4412 | 4412 | d3.layout.pack = function() { |
4413 | | - var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), size = [ 1, 1 ]; |
| 4413 | + var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ]; |
4414 | 4414 | function pack(d, i) { |
4415 | 4415 | var nodes = hierarchy.call(this, d, i), root = nodes[0]; |
4416 | 4416 | root.x = 0; |
4417 | 4417 | root.y = 0; |
4418 | | - d3_layout_packTree(root); |
4419 | | - var w = size[0], h = size[1], k = 1 / Math.max(2 * root.r / w, 2 * root.r / h); |
4420 | | - d3_layout_packTransform(root, w / 2, h / 2, k); |
| 4418 | + d3_layout_treeVisitAfter(root, function(d) { |
| 4419 | + d.r = Math.sqrt(d.value); |
| 4420 | + }); |
| 4421 | + d3_layout_treeVisitAfter(root, d3_layout_packSiblings); |
| 4422 | + var w = size[0], h = size[1], k = Math.max(2 * root.r / w, 2 * root.r / h); |
| 4423 | + if (padding > 0) { |
| 4424 | + var dr = padding * k / 2; |
| 4425 | + d3_layout_treeVisitAfter(root, function(d) { |
| 4426 | + d.r += dr; |
| 4427 | + }); |
| 4428 | + d3_layout_treeVisitAfter(root, d3_layout_packSiblings); |
| 4429 | + d3_layout_treeVisitAfter(root, function(d) { |
| 4430 | + d.r -= dr; |
| 4431 | + }); |
| 4432 | + k = Math.max(2 * root.r / w, 2 * root.r / h); |
| 4433 | + } |
| 4434 | + d3_layout_packTransform(root, w / 2, h / 2, 1 / k); |
4421 | 4435 | return nodes; |
4422 | 4436 | } |
4423 | 4437 | pack.size = function(x) { |
4424 | 4438 | if (!arguments.length) return size; |
4425 | 4439 | size = x; |
4426 | 4440 | return pack; |
4427 | 4441 | }; |
| 4442 | + pack.padding = function(_) { |
| 4443 | + if (!arguments.length) return padding; |
| 4444 | + padding = +_; |
| 4445 | + return pack; |
| 4446 | + }; |
4428 | 4447 | return d3_layout_hierarchyRebind(pack, hierarchy); |
4429 | 4448 | }; |
4430 | 4449 | function d3_layout_packSort(a, b) { |
|
4445 | 4464 | var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r; |
4446 | 4465 | return dr * dr - dx * dx - dy * dy > .001; |
4447 | 4466 | } |
4448 | | - function d3_layout_packCircle(nodes) { |
4449 | | - var xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, n = nodes.length, a, b, c, j, k; |
| 4467 | + function d3_layout_packSiblings(node) { |
| 4468 | + if (!(nodes = node.children) || !(n = nodes.length)) return; |
| 4469 | + var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n; |
4450 | 4470 | function bound(node) { |
4451 | 4471 | xMin = Math.min(node.x - node.r, xMin); |
4452 | 4472 | xMax = Math.max(node.x + node.r, xMax); |
|
4471 | 4491 | a._pack_prev = c; |
4472 | 4492 | d3_layout_packInsert(c, b); |
4473 | 4493 | b = a._pack_next; |
4474 | | - for (var i = 3; i < n; i++) { |
| 4494 | + for (i = 3; i < n; i++) { |
4475 | 4495 | d3_layout_packPlace(a, b, c = nodes[i]); |
4476 | 4496 | var isect = 0, s1 = 1, s2 = 1; |
4477 | 4497 | for (j = b._pack_next; j !== b; j = j._pack_next, s1++) { |
|
4499 | 4519 | } |
4500 | 4520 | } |
4501 | 4521 | var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0; |
4502 | | - for (var i = 0; i < n; i++) { |
4503 | | - var node = nodes[i]; |
4504 | | - node.x -= cx; |
4505 | | - node.y -= cy; |
4506 | | - cr = Math.max(cr, node.r + Math.sqrt(node.x * node.x + node.y * node.y)); |
| 4522 | + for (i = 0; i < n; i++) { |
| 4523 | + c = nodes[i]; |
| 4524 | + c.x -= cx; |
| 4525 | + c.y -= cy; |
| 4526 | + cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y)); |
4507 | 4527 | } |
| 4528 | + node.r = cr; |
4508 | 4529 | nodes.forEach(d3_layout_packUnlink); |
4509 | | - return cr; |
4510 | 4530 | } |
4511 | 4531 | function d3_layout_packLink(node) { |
4512 | 4532 | node._pack_next = node._pack_prev = node; |
|
4515 | 4535 | delete node._pack_next; |
4516 | 4536 | delete node._pack_prev; |
4517 | 4537 | } |
4518 | | - function d3_layout_packTree(node) { |
4519 | | - var children = node.children; |
4520 | | - if (children && children.length) { |
4521 | | - children.forEach(d3_layout_packTree); |
4522 | | - node.r = d3_layout_packCircle(children); |
4523 | | - } else { |
4524 | | - node.r = Math.sqrt(node.value); |
4525 | | - } |
4526 | | - } |
4527 | 4538 | function d3_layout_packTransform(node, x, y, k) { |
4528 | 4539 | var children = node.children; |
4529 | 4540 | node.x = x += k * node.x; |
|
0 commit comments