source: Dev/trunk/d3/src/layout/bundle.js @ 76

Last change on this file since 76 was 76, checked in by fpvanagthoven, 14 years ago

d3

File size: 1.5 KB
Line 
1// Implements hierarchical edge bundling using Holten's algorithm. For each
2// input link, a path is computed that travels through the tree, up the parent
3// hierarchy to the least common ancestor, and then back down to the destination
4// node. Each path is simply an array of nodes.
5d3.layout.bundle = function() {
6  return function(links) {
7    var paths = [],
8        i = -1,
9        n = links.length;
10    while (++i < n) paths.push(d3_layout_bundlePath(links[i]));
11    return paths;
12  };
13};
14
15function d3_layout_bundlePath(link) {
16  var start = link.source,
17      end = link.target,
18      lca = d3_layout_bundleLeastCommonAncestor(start, end),
19      points = [start];
20  while (start !== lca) {
21    start = start.parent;
22    points.push(start);
23  }
24  var k = points.length;
25  while (end !== lca) {
26    points.splice(k, 0, end);
27    end = end.parent;
28  }
29  return points;
30}
31
32function d3_layout_bundleAncestors(node) {
33  var ancestors = [],
34      parent = node.parent;
35  while (parent != null) {
36    ancestors.push(node);
37    node = parent;
38    parent = parent.parent;
39  }
40  ancestors.push(node);
41  return ancestors;
42}
43
44function d3_layout_bundleLeastCommonAncestor(a, b) {
45  if (a === b) return a;
46  var aNodes = d3_layout_bundleAncestors(a),
47      bNodes = d3_layout_bundleAncestors(b),
48      aNode = aNodes.pop(),
49      bNode = bNodes.pop(),
50      sharedNode = null;
51  while (aNode === bNode) {
52    sharedNode = aNode;
53    aNode = aNodes.pop();
54    bNode = bNodes.pop();
55  }
56  return sharedNode;
57}
Note: See TracBrowser for help on using the repository browser.