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. |
---|
5 | d3.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 | |
---|
15 | function 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 | |
---|
32 | function 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 | |
---|
44 | function 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.