source: Dev/branches/jQueryUI/client/d3/src/layout/bundle.js @ 249

Last change on this file since 249 was 249, checked in by hendrikvanantwerpen, 13 years ago

This one's for Subversion, because it's so close...

First widget (stripped down sequencer).
Seperated client and server code in two direcotry trees.

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.