Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Open sidebar
MUR Drupal
d3-library
Commits
1b47a8c9
Commit
1b47a8c9
authored
May 18, 2014
by
Mike Bostock
Browse files
Merge branch 'non-recursive-tree' into 3.4.7
parents
356d94fb
1896136d
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
470 additions
and
471 deletions
+470
-471
d3.js
d3.js
+204
-220
d3.min.js
d3.min.js
+5
-5
src/layout/cluster.js
src/layout/cluster.js
+2
-2
src/layout/hierarchy.js
src/layout/hierarchy.js
+58
-45
src/layout/pack.js
src/layout/pack.js
+5
-6
src/layout/tree.js
src/layout/tree.js
+176
-187
test/layout/tree-test.js
test/layout/tree-test.js
+20
-6
No files found.
d3.js
View file @
1b47a8c9
...
@@ -6335,41 +6335,30 @@
...
@@ -6335,41 +6335,30 @@
var
d3_layout_forceLinkDistance
=
20
,
d3_layout_forceLinkStrength
=
1
,
d3_layout_forceChargeDistance2
=
Infinity
;
var
d3_layout_forceLinkDistance
=
20
,
d3_layout_forceLinkStrength
=
1
,
d3_layout_forceChargeDistance2
=
Infinity
;
d3
.
layout
.
hierarchy
=
function
()
{
d3
.
layout
.
hierarchy
=
function
()
{
var
sort
=
d3_layout_hierarchySort
,
children
=
d3_layout_hierarchyChildren
,
value
=
d3_layout_hierarchyValue
;
var
sort
=
d3_layout_hierarchySort
,
children
=
d3_layout_hierarchyChildren
,
value
=
d3_layout_hierarchyValue
;
function
recurse
(
node
,
depth
,
nodes
)
{
function
hierarchy
(
root
)
{
var
childs
=
children
.
call
(
hierarchy
,
node
,
depth
)
;
var
stack
=
[
root
],
nodes
=
[],
node
;
node
.
depth
=
depth
;
root
.
depth
=
0
;
nodes
.
push
(
node
);
while
((
node
=
stack
.
pop
())
!=
null
)
{
if
(
childs
&&
(
n
=
childs
.
length
))
{
nodes
.
push
(
node
);
var
i
=
-
1
,
n
,
c
=
node
.
children
=
new
Array
(
n
),
v
=
0
,
j
=
depth
+
1
,
d
;
if
((
childs
=
children
.
call
(
hierarchy
,
node
,
node
.
depth
))
&&
(
n
=
childs
.
length
))
{
while
(
++
i
<
n
)
{
var
n
,
childs
,
child
;
d
=
c
[
i
]
=
recurse
(
childs
[
i
],
j
,
nodes
);
while
(
--
n
>=
0
)
{
d
.
parent
=
node
;
stack
.
push
(
child
=
childs
[
n
])
;
v
+=
d
.
valu
e
;
child
.
parent
=
nod
e
;
}
child
.
depth
=
node
.
depth
+
1
;
if
(
sort
)
c
.
sort
(
sort
);
}
if
(
value
)
node
.
value
=
v
;
if
(
value
)
node
.
value
=
0
;
}
else
{
node
.
children
=
childs
;
delete
node
.
children
;
}
else
{
if
(
value
)
{
if
(
value
)
node
.
value
=
+
value
.
call
(
hierarchy
,
node
,
node
.
depth
)
||
0
;
node
.
value
=
+
value
.
call
(
hierarchy
,
node
,
depth
)
||
0
;
delete
node
.
children
;
}
}
}
}
return
node
;
d3_layout_hierarchyVisitAfter
(
root
,
function
(
node
)
{
}
var
childs
,
parent
;
function
revalue
(
node
,
depth
)
{
if
(
sort
&&
(
childs
=
node
.
children
))
childs
.
sort
(
sort
);
var
children
=
node
.
children
,
v
=
0
;
if
(
value
&&
(
parent
=
node
.
parent
))
parent
.
value
+=
node
.
value
;
if
(
children
&&
(
n
=
children
.
length
))
{
});
var
i
=
-
1
,
n
,
j
=
depth
+
1
;
while
(
++
i
<
n
)
v
+=
revalue
(
children
[
i
],
j
);
}
else
if
(
value
)
{
v
=
+
value
.
call
(
hierarchy
,
node
,
depth
)
||
0
;
}
if
(
value
)
node
.
value
=
v
;
return
v
;
}
function
hierarchy
(
d
)
{
var
nodes
=
[];
recurse
(
d
,
0
,
nodes
);
return
nodes
;
return
nodes
;
}
}
hierarchy
.
sort
=
function
(
x
)
{
hierarchy
.
sort
=
function
(
x
)
{
...
@@ -6388,7 +6377,11 @@
...
@@ -6388,7 +6377,11 @@
return
hierarchy
;
return
hierarchy
;
};
};
hierarchy
.
revalue
=
function
(
root
)
{
hierarchy
.
revalue
=
function
(
root
)
{
revalue
(
root
,
0
);
if
(
value
)
d3_layout_hierarchyVisitAfter
(
root
,
function
(
node
)
{
var
parent
;
node
.
value
=
node
.
children
?
0
:
+
value
.
call
(
hierarchy
,
node
,
node
.
depth
)
||
0
;
if
(
parent
=
node
.
parent
)
parent
.
value
+=
node
.
value
;
});
return
root
;
return
root
;
};
};
return
hierarchy
;
return
hierarchy
;
...
@@ -6399,6 +6392,29 @@
...
@@ -6399,6 +6392,29 @@
object
.
links
=
d3_layout_hierarchyLinks
;
object
.
links
=
d3_layout_hierarchyLinks
;
return
object
;
return
object
;
}
}
function
d3_layout_hierarchyVisitBefore
(
node
,
callback
)
{
var
nodes
=
[
node
];
while
((
node
=
nodes
.
pop
())
!=
null
)
{
callback
(
node
);
if
((
children
=
node
.
children
)
&&
(
n
=
children
.
length
))
{
var
n
,
children
;
while
(
--
n
>=
0
)
nodes
.
push
(
children
[
n
]);
}
}
}
function
d3_layout_hierarchyVisitAfter
(
node
,
callback
)
{
var
nodes
=
[
node
],
nodes2
=
[];
while
((
node
=
nodes
.
pop
())
!=
null
)
{
nodes2
.
push
(
node
);
if
((
children
=
node
.
children
)
&&
(
n
=
children
.
length
))
{
var
i
=
-
1
,
n
,
children
;
while
(
++
i
<
n
)
nodes
.
push
(
children
[
i
]);
}
}
while
((
node
=
nodes2
.
pop
())
!=
null
)
{
callback
(
node
);
}
}
function
d3_layout_hierarchyChildren
(
d
)
{
function
d3_layout_hierarchyChildren
(
d
)
{
return
d
.
children
;
return
d
.
children
;
}
}
...
@@ -6714,185 +6730,6 @@
...
@@ -6714,185 +6730,6 @@
function
d3_layout_histogramRange
(
values
)
{
function
d3_layout_histogramRange
(
values
)
{
return
[
d3
.
min
(
values
),
d3
.
max
(
values
)
];
return
[
d3
.
min
(
values
),
d3
.
max
(
values
)
];
}
}
d3
.
layout
.
tree
=
function
()
{
var
hierarchy
=
d3
.
layout
.
hierarchy
().
sort
(
null
).
value
(
null
),
separation
=
d3_layout_treeSeparation
,
size
=
[
1
,
1
],
nodeSize
=
false
;
function
tree
(
d
,
i
)
{
var
nodes
=
hierarchy
.
call
(
this
,
d
,
i
),
root
=
nodes
[
0
];
function
firstWalk
(
node
,
previousSibling
)
{
var
children
=
node
.
children
,
layout
=
node
.
_tree
;
if
(
children
&&
(
n
=
children
.
length
))
{
var
n
,
firstChild
=
children
[
0
],
previousChild
,
ancestor
=
firstChild
,
child
,
i
=
-
1
;
while
(
++
i
<
n
)
{
child
=
children
[
i
];
firstWalk
(
child
,
previousChild
);
ancestor
=
apportion
(
child
,
previousChild
,
ancestor
);
previousChild
=
child
;
}
d3_layout_treeShift
(
node
);
var
midpoint
=
.
5
*
(
firstChild
.
_tree
.
prelim
+
child
.
_tree
.
prelim
);
if
(
previousSibling
)
{
layout
.
prelim
=
previousSibling
.
_tree
.
prelim
+
separation
(
node
,
previousSibling
);
layout
.
mod
=
layout
.
prelim
-
midpoint
;
}
else
{
layout
.
prelim
=
midpoint
;
}
}
else
{
if
(
previousSibling
)
{
layout
.
prelim
=
previousSibling
.
_tree
.
prelim
+
separation
(
node
,
previousSibling
);
}
}
}
function
secondWalk
(
node
,
x
)
{
node
.
x
=
node
.
_tree
.
prelim
+
x
;
var
children
=
node
.
children
;
if
(
children
&&
(
n
=
children
.
length
))
{
var
i
=
-
1
,
n
;
x
+=
node
.
_tree
.
mod
;
while
(
++
i
<
n
)
{
secondWalk
(
children
[
i
],
x
);
}
}
}
function
apportion
(
node
,
previousSibling
,
ancestor
)
{
if
(
previousSibling
)
{
var
vip
=
node
,
vop
=
node
,
vim
=
previousSibling
,
vom
=
node
.
parent
.
children
[
0
],
sip
=
vip
.
_tree
.
mod
,
sop
=
vop
.
_tree
.
mod
,
sim
=
vim
.
_tree
.
mod
,
som
=
vom
.
_tree
.
mod
,
shift
;
while
(
vim
=
d3_layout_treeRight
(
vim
),
vip
=
d3_layout_treeLeft
(
vip
),
vim
&&
vip
)
{
vom
=
d3_layout_treeLeft
(
vom
);
vop
=
d3_layout_treeRight
(
vop
);
vop
.
_tree
.
ancestor
=
node
;
shift
=
vim
.
_tree
.
prelim
+
sim
-
vip
.
_tree
.
prelim
-
sip
+
separation
(
vim
,
vip
);
if
(
shift
>
0
)
{
d3_layout_treeMove
(
d3_layout_treeAncestor
(
vim
,
node
,
ancestor
),
node
,
shift
);
sip
+=
shift
;
sop
+=
shift
;
}
sim
+=
vim
.
_tree
.
mod
;
sip
+=
vip
.
_tree
.
mod
;
som
+=
vom
.
_tree
.
mod
;
sop
+=
vop
.
_tree
.
mod
;
}
if
(
vim
&&
!
d3_layout_treeRight
(
vop
))
{
vop
.
_tree
.
thread
=
vim
;
vop
.
_tree
.
mod
+=
sim
-
sop
;
}
if
(
vip
&&
!
d3_layout_treeLeft
(
vom
))
{
vom
.
_tree
.
thread
=
vip
;
vom
.
_tree
.
mod
+=
sip
-
som
;
ancestor
=
node
;
}
}
return
ancestor
;
}
d3_layout_treeVisitAfter
(
root
,
function
(
node
,
previousSibling
)
{
node
.
_tree
=
{
ancestor
:
node
,
prelim
:
0
,
mod
:
0
,
change
:
0
,
shift
:
0
,
number
:
previousSibling
?
previousSibling
.
_tree
.
number
+
1
:
0
};
});
firstWalk
(
root
);
secondWalk
(
root
,
-
root
.
_tree
.
prelim
);
var
left
=
d3_layout_treeSearch
(
root
,
d3_layout_treeLeftmost
),
right
=
d3_layout_treeSearch
(
root
,
d3_layout_treeRightmost
),
deep
=
d3_layout_treeSearch
(
root
,
d3_layout_treeDeepest
),
x0
=
left
.
x
-
separation
(
left
,
right
)
/
2
,
x1
=
right
.
x
+
separation
(
right
,
left
)
/
2
,
y1
=
deep
.
depth
||
1
;
d3_layout_treeVisitAfter
(
root
,
nodeSize
?
function
(
node
)
{
node
.
x
*=
size
[
0
];
node
.
y
=
node
.
depth
*
size
[
1
];
delete
node
.
_tree
;
}
:
function
(
node
)
{
node
.
x
=
(
node
.
x
-
x0
)
/
(
x1
-
x0
)
*
size
[
0
];
node
.
y
=
node
.
depth
/
y1
*
size
[
1
];
delete
node
.
_tree
;
});
return
nodes
;
}
tree
.
separation
=
function
(
x
)
{
if
(
!
arguments
.
length
)
return
separation
;
separation
=
x
;
return
tree
;
};
tree
.
size
=
function
(
x
)
{
if
(
!
arguments
.
length
)
return
nodeSize
?
null
:
size
;
nodeSize
=
(
size
=
x
)
==
null
;
return
tree
;
};
tree
.
nodeSize
=
function
(
x
)
{
if
(
!
arguments
.
length
)
return
nodeSize
?
size
:
null
;
nodeSize
=
(
size
=
x
)
!=
null
;
return
tree
;
};
return
d3_layout_hierarchyRebind
(
tree
,
hierarchy
);
};
function
d3_layout_treeSeparation
(
a
,
b
)
{
return
a
.
parent
==
b
.
parent
?
1
:
2
;
}
function
d3_layout_treeLeft
(
node
)
{
var
children
=
node
.
children
;
return
children
&&
children
.
length
?
children
[
0
]
:
node
.
_tree
.
thread
;
}
function
d3_layout_treeRight
(
node
)
{
var
children
=
node
.
children
,
n
;
return
children
&&
(
n
=
children
.
length
)
?
children
[
n
-
1
]
:
node
.
_tree
.
thread
;
}
function
d3_layout_treeSearch
(
node
,
compare
)
{
var
children
=
node
.
children
;
if
(
children
&&
(
n
=
children
.
length
))
{
var
child
,
n
,
i
=
-
1
;
while
(
++
i
<
n
)
{
if
(
compare
(
child
=
d3_layout_treeSearch
(
children
[
i
],
compare
),
node
)
>
0
)
{
node
=
child
;
}
}
}
return
node
;
}
function
d3_layout_treeRightmost
(
a
,
b
)
{
return
a
.
x
-
b
.
x
;
}
function
d3_layout_treeLeftmost
(
a
,
b
)
{
return
b
.
x
-
a
.
x
;
}
function
d3_layout_treeDeepest
(
a
,
b
)
{
return
a
.
depth
-
b
.
depth
;
}
function
d3_layout_treeVisitAfter
(
node
,
callback
)
{
function
visit
(
node
,
previousSibling
)
{
var
children
=
node
.
children
;
if
(
children
&&
(
n
=
children
.
length
))
{
var
child
,
previousChild
=
null
,
i
=
-
1
,
n
;
while
(
++
i
<
n
)
{
child
=
children
[
i
];
visit
(
child
,
previousChild
);
previousChild
=
child
;
}
}
callback
(
node
,
previousSibling
);
}
visit
(
node
,
null
);
}
function
d3_layout_treeShift
(
node
)
{
var
shift
=
0
,
change
=
0
,
children
=
node
.
children
,
i
=
children
.
length
,
child
;
while
(
--
i
>=
0
)
{
child
=
children
[
i
].
_tree
;
child
.
prelim
+=
shift
;
child
.
mod
+=
shift
;
shift
+=
child
.
shift
+
(
change
+=
child
.
change
);
}
}
function
d3_layout_treeMove
(
ancestor
,
node
,
shift
)
{
ancestor
=
ancestor
.
_tree
;
node
=
node
.
_tree
;
var
change
=
shift
/
(
node
.
number
-
ancestor
.
number
);
ancestor
.
change
+=
change
;
node
.
change
-=
change
;
node
.
shift
+=
shift
;
node
.
prelim
+=
shift
;
node
.
mod
+=
shift
;
}
function
d3_layout_treeAncestor
(
vim
,
node
,
ancestor
)
{
return
vim
.
_tree
.
ancestor
.
parent
==
node
.
parent
?
vim
.
_tree
.
ancestor
:
ancestor
;
}
d3
.
layout
.
pack
=
function
()
{
d3
.
layout
.
pack
=
function
()
{
var
hierarchy
=
d3
.
layout
.
hierarchy
().
sort
(
d3_layout_packSort
),
padding
=
0
,
size
=
[
1
,
1
],
radius
;
var
hierarchy
=
d3
.
layout
.
hierarchy
().
sort
(
d3_layout_packSort
),
padding
=
0
,
size
=
[
1
,
1
],
radius
;
function
pack
(
d
,
i
)
{
function
pack
(
d
,
i
)
{
...
@@ -6900,17 +6737,17 @@
...
@@ -6900,17 +6737,17 @@
return
radius
;
return
radius
;
};
};
root
.
x
=
root
.
y
=
0
;
root
.
x
=
root
.
y
=
0
;
d3_layout_
tree
VisitAfter
(
root
,
function
(
d
)
{
d3_layout_
hierarchy
VisitAfter
(
root
,
function
(
d
)
{
d
.
r
=
+
r
(
d
.
value
);
d
.
r
=
+
r
(
d
.
value
);
});
});
d3_layout_
tree
VisitAfter
(
root
,
d3_layout_packSiblings
);
d3_layout_
hierarchy
VisitAfter
(
root
,
d3_layout_packSiblings
);
if
(
padding
)
{
if
(
padding
)
{
var
dr
=
padding
*
(
radius
?
1
:
Math
.
max
(
2
*
root
.
r
/
w
,
2
*
root
.
r
/
h
))
/
2
;
var
dr
=
padding
*
(
radius
?
1
:
Math
.
max
(
2
*
root
.
r
/
w
,
2
*
root
.
r
/
h
))
/
2
;
d3_layout_
tree
VisitAfter
(
root
,
function
(
d
)
{
d3_layout_
hierarchy
VisitAfter
(
root
,
function
(
d
)
{
d
.
r
+=
dr
;
d
.
r
+=
dr
;
});
});
d3_layout_
tree
VisitAfter
(
root
,
d3_layout_packSiblings
);
d3_layout_
hierarchy
VisitAfter
(
root
,
d3_layout_packSiblings
);
d3_layout_
tree
VisitAfter
(
root
,
function
(
d
)
{
d3_layout_
hierarchy
VisitAfter
(
root
,
function
(
d
)
{
d
.
r
-=
dr
;
d
.
r
-=
dr
;
});
});
}
}
...
@@ -7047,11 +6884,158 @@
...
@@ -7047,11 +6884,158 @@
c
.
y
=
a
.
y
;
c
.
y
=
a
.
y
;
}
}
}
}
d3
.
layout
.
tree
=
function
()
{
var
hierarchy
=
d3
.
layout
.
hierarchy
().
sort
(
null
).
value
(
null
),
separation
=
d3_layout_treeSeparation
,
size
=
[
1
,
1
],
nodeSize
=
null
;
function
tree
(
d
,
i
)
{
var
nodes
=
hierarchy
.
call
(
this
,
d
,
i
),
root0
=
nodes
[
0
],
root1
=
wrapTree
(
root0
);
d3_layout_hierarchyVisitAfter
(
root1
,
firstWalk
),
root1
.
parent
.
m
=
-
root1
.
z
;
d3_layout_hierarchyVisitBefore
(
root1
,
secondWalk
);
if
(
nodeSize
)
d3_layout_hierarchyVisitBefore
(
root0
,
sizeNode
);
else
{
var
left
=
root0
,
right
=
root0
,
bottom
=
root0
;
d3_layout_hierarchyVisitBefore
(
root0
,
function
(
node
)
{
if
(
node
.
x
<
left
.
x
)
left
=
node
;
if
(
node
.
x
>
right
.
x
)
right
=
node
;
if
(
node
.
depth
>
bottom
.
depth
)
bottom
=
node
;
});
var
tx
=
separation
(
left
,
right
)
/
2
-
left
.
x
,
kx
=
size
[
0
]
/
(
right
.
x
+
separation
(
right
,
left
)
/
2
+
tx
),
ky
=
size
[
1
]
/
(
bottom
.
depth
||
1
);
d3_layout_hierarchyVisitBefore
(
root0
,
function
(
node
)
{
node
.
x
=
(
node
.
x
+
tx
)
*
kx
;
node
.
y
=
node
.
depth
*
ky
;
});
}
return
nodes
;
}
function
wrapTree
(
root0
)
{
var
root1
=
{
A
:
null
,
children
:
[
root0
]
},
queue
=
[
root1
],
node1
;
while
((
node1
=
queue
.
pop
())
!=
null
)
{
for
(
var
children
=
node1
.
children
,
child
,
i
=
0
,
n
=
children
.
length
;
i
<
n
;
++
i
)
{
queue
.
push
((
children
[
i
]
=
child
=
{
_
:
children
[
i
],
parent
:
node1
,
children
:
(
child
=
children
[
i
].
children
)
&&
child
.
slice
()
||
[],
A
:
null
,
a
:
null
,
z
:
0
,
m
:
0
,
c
:
0
,
s
:
0
,
t
:
null
,
i
:
i
}).
a
=
child
);
}
}
return
root1
.
children
[
0
];
}
function
firstWalk
(
v
)
{
var
children
=
v
.
children
,
siblings
=
v
.
parent
.
children
,
w
=
v
.
i
?
siblings
[
v
.
i
-
1
]
:
null
;
if
(
children
.
length
)
{
d3_layout_treeShift
(
v
);
var
midpoint
=
(
children
[
0
].
z
+
children
[
children
.
length
-
1
].
z
)
/
2
;
if
(
w
)
{
v
.
z
=
w
.
z
+
separation
(
v
.
_
,
w
.
_
);
v
.
m
=
v
.
z
-
midpoint
;
}
else
{
v
.
z
=
midpoint
;
}
}
else
if
(
w
)
{
v
.
z
=
w
.
z
+
separation
(
v
.
_
,
w
.
_
);
}
v
.
parent
.
A
=
apportion
(
v
,
w
,
v
.
parent
.
A
||
siblings
[
0
]);
}
function
secondWalk
(
v
)
{
v
.
_
.
x
=
v
.
z
+
v
.
parent
.
m
;
v
.
m
+=
v
.
parent
.
m
;
}
function
apportion
(
v
,
w
,
ancestor
)
{
if
(
w
)
{
var
vip
=
v
,
vop
=
v
,
vim
=
w
,
vom
=
vip
.
parent
.
children
[
0
],
sip
=
vip
.
m
,
sop
=
vop
.
m
,
sim
=
vim
.
m
,
som
=
vom
.
m
,
shift
;
while
(
vim
=
d3_layout_treeRight
(
vim
),
vip
=
d3_layout_treeLeft
(
vip
),
vim
&&
vip
)
{
vom
=
d3_layout_treeLeft
(
vom
);
vop
=
d3_layout_treeRight
(
vop
);
vop
.
a
=
v
;
shift
=
vim
.
z
+
sim
-
vip
.
z
-
sip
+
separation
(
vim
.
_
,
vip
.
_
);
if
(
shift
>
0
)
{
d3_layout_treeMove
(
d3_layout_treeAncestor
(
vim
,
v
,
ancestor
),
v
,
shift
);
sip
+=
shift
;
sop
+=
shift
;
}
sim
+=
vim
.
m
;
sip
+=
vip
.
m
;
som
+=
vom
.
m
;
sop
+=
vop
.
m
;
}
if
(
vim
&&
!
d3_layout_treeRight
(
vop
))
{
vop
.
t
=
vim
;
vop
.
m
+=
sim
-
sop
;
}
if
(
vip
&&
!
d3_layout_treeLeft
(
vom
))
{
vom
.
t
=
vip
;
vom
.
m
+=
sip
-
som
;
ancestor
=
v
;
}
}
return
ancestor
;
}
function
sizeNode
(
node
)
{
node
.
x
*=
size
[
0
];
node
.
y
=
node
.
depth
*
size
[
1
];
}
tree
.
separation
=
function
(
x
)
{
if
(
!
arguments
.
length
)
return
separation
;
separation
=
x
;
return
tree
;
};
tree
.
size
=
function
(
x
)
{
if
(
!
arguments
.
length
)
return
nodeSize
?
null
:
size
;
nodeSize
=
(
size
=
x
)
==
null
?
sizeNode
:
null
;
return
tree
;
};
tree
.
nodeSize
=
function
(
x
)
{
if
(
!
arguments
.
length
)
return
nodeSize
?
size
:
null
;
nodeSize
=
(
size
=
x
)
==
null
?
null
:
sizeNode
;
return
tree
;
};
return
d3_layout_hierarchyRebind
(
tree
,
hierarchy
);
};
function
d3_layout_treeSeparation
(
a
,
b
)
{
return
a
.
parent
==
b
.
parent
?
1
:
2
;
}
function
d3_layout_treeLeft
(
v
)
{
var
children
=
v
.
children
;
return
children
.
length
?
children
[
0
]
:
v
.
t
;
}
function
d3_layout_treeRight
(
v
)
{
var
children
=
v
.
children
,
n
;
return
(
n
=
children
.
length
)
?
children
[
n
-
1
]
:
v
.
t
;
}
function
d3_layout_treeMove
(
wm
,
wp
,
shift
)
{
var
change
=
shift
/
(
wp
.
i
-
wm
.
i
);
wp
.
c
-=
change
;
wp
.
s
+=
shift
;
wm
.
c
+=
change
;
wp
.
z
+=
shift
;
wp
.
m
+=
shift
;
}
function
d3_layout_treeShift
(
v
)
{
var
shift
=
0
,
change
=
0
,
children
=
v
.
children
,
i
=
children
.
length
,
w
;
while
(
--
i
>=
0
)
{
w
=
children
[
i
];
w
.
z
+=
shift
;
w
.
m
+=
shift
;
shift
+=
w
.
s
+
(
change
+=
w
.
c
);
}
}
function
d3_layout_treeAncestor
(
vim
,
v
,
ancestor
)
{
return
vim
.
a
.
parent
===
v
.
parent
?
vim
.
a
:
ancestor
;
}
d3
.
layout
.
cluster
=
function
()
{
d3
.
layout
.
cluster
=
function
()
{
var
hierarchy
=
d3
.
layout
.
hierarchy
().
sort
(
null
).
value
(
null
),
separation
=
d3_layout_treeSeparation
,
size
=
[
1
,
1
],
nodeSize
=
false
;
var
hierarchy
=
d3
.
layout
.
hierarchy
().
sort
(
null
).
value
(
null
),
separation
=
d3_layout_treeSeparation
,
size
=
[
1
,
1
],
nodeSize
=
false
;
function
cluster
(
d
,
i
)
{
function
cluster
(
d
,
i
)
{
var
nodes
=
hierarchy
.
call
(
this
,
d
,
i
),
root
=
nodes
[
0
],
previousNode
,
x
=
0
;
var
nodes
=
hierarchy
.
call
(
this
,
d
,
i
),
root
=
nodes
[
0
],
previousNode
,
x
=
0
;
d3_layout_
tree
VisitAfter
(
root
,
function
(
node
)
{
d3_layout_
hierarchy
VisitAfter
(
root
,
function
(
node
)
{
var
children
=
node
.
children
;
var
children
=
node
.
children
;
if
(
children
&&
children
.
length
)
{
if
(
children
&&
children
.
length
)
{
node
.
x
=
d3_layout_clusterX
(
children
);
node
.
x
=
d3_layout_clusterX
(
children
);
...
@@ -7063,7 +7047,7 @@
...
@@ -7063,7 +7047,7 @@
}
}
});
});
var
left
=
d3_layout_clusterLeft
(
root
),
right
=
d3_layout_clusterRight
(
root
),
x0
=
left
.
x
-
separation
(
left
,
right
)
/
2
,
x1
=
right
.
x
+
separation
(
right
,
left
)
/
2
;
var
left
=
d3_layout_clusterLeft
(
root
),
right
=
d3_layout_clusterRight
(
root
),
x0
=
left
.
x
-
separation
(
left
,
right
)
/
2
,
x1
=
right
.
x
+
separation
(
right
,
left
)
/
2
;
d3_layout_
tree
VisitAfter
(
root
,
nodeSize
?
function
(
node
)
{
d3_layout_
hierarchy
VisitAfter
(
root
,
nodeSize
?
function
(
node
)
{
node
.
x
=
(
node
.
x
-
root
.
x
)
*
size
[
0
];
node
.
x
=
(
node
.
x
-
root
.
x
)
*
size
[
0
];
node
.
y
=
(
root
.
y
-
node
.
y
)
*
size
[
1
];
node
.
y
=
(
root
.
y
-
node
.
y
)
*
size
[
1
];
}
:
function
(
node
)
{
}
:
function
(
node
)
{
...
...
d3.min.js
View file @
1b47a8c9
This source diff could not be displayed because it is too large. You can
view the blob
instead.
src/layout/cluster.js
View file @
1b47a8c9
...
@@ -18,7 +18,7 @@ d3.layout.cluster = function() {
...
@@ -18,7 +18,7 @@ d3.layout.cluster = function() {
x
=
0
;
x
=
0
;
// First walk, computing the initial x & y values.
// First walk, computing the initial x & y values.
d3_layout_
tree
VisitAfter
(
root
,
function
(
node
)
{
d3_layout_
hierarchy
VisitAfter
(
root
,
function
(
node
)
{
var
children
=
node
.
children
;
var
children
=
node
.
children
;
if
(
children
&&
children
.
length
)
{
if
(
children
&&
children
.
length
)
{
node
.
x
=
d3_layout_clusterX
(
children
);
node
.
x
=
d3_layout_clusterX
(
children
);
...
@@ -37,7 +37,7 @@ d3.layout.cluster = function() {
...
@@ -37,7 +37,7 @@ d3.layout.cluster = function() {
x1
=
right
.
x
+
separation
(
right
,
left
)
/
2
;
x1
=
right
.
x
+
separation
(
right
,
left
)
/
2
;
// Second walk, normalizing x & y to the desired size.
// Second walk, normalizing x & y to the desired size.
d3_layout_
tree
VisitAfter
(
root
,
nodeSize
?
function
(
node
)
{
d3_layout_
hierarchy
VisitAfter
(
root
,
nodeSize
?
function
(
node
)
{
node
.
x
=
(
node
.
x
-
root
.
x
)
*
size
[
0
];
node
.
x
=
(
node
.
x
-
root
.
x
)
*
size
[
0
];
node
.
y
=
(
root
.
y
-
node
.
y
)
*
size
[
1
];
node
.
y
=
(
root
.
y
-
node
.
y
)
*
size
[
1
];
}
:
function
(
node
)
{
}
:
function
(
node
)
{
...
...
src/layout/hierarchy.js
View file @
1b47a8c9
...
@@ -7,54 +7,36 @@ d3.layout.hierarchy = function() {
...
@@ -7,54 +7,36 @@ d3.layout.hierarchy = function() {
children
=
d3_layout_hierarchyChildren
,
children
=
d3_layout_hierarchyChildren
,
value
=
d3_layout_hierarchyValue
;
value
=
d3_layout_hierarchyValue
;
// Recursively compute the node depth and value.
function
hierarchy
(
root
)
{
// Also converts to a standard hierarchy structure.
var
stack
=
[
root
],
function
recurse
(
node
,
depth
,
nodes
)
{
nodes
=
[],
var
childs
=
children
.
call
(
hierarchy
,
node
,
depth
);
node
;
node
.
depth
=
depth
;
nodes
.
push
(
node
);
root
.
depth
=
0
;
if
(
childs
&&
(
n
=
childs
.
length
))
{
var
i
=
-
1
,
while
((
node
=
stack
.
pop
())
!=
null
)
{
n
,
nodes
.
push
(
node
);
c
=
node
.
children
=
new
Array
(
n
),
if
((
childs
=
children
.
call
(
hierarchy
,
node
,
node
.
depth
))
&&
(
n
=
childs
.
length
))
{
v
=
0
,
var
n
,
childs
,
child
;
j
=
depth
+
1
,
while
(
--
n
>=
0
)
{
d
;
stack
.
push
(
child
=
childs
[
n
]);
while
(
++
i
<
n
)
{
child
.
parent
=
node
;
d
=
c
[
i
]
=
recurse
(
childs
[
i
],
j
,
nodes
);
child
.
depth
=
node
.
depth
+
1
;
d
.
parent
=
node
;
}
v
+=
d
.
value
;
if
(
value
)
node
.
value
=
0
;
}
node
.
children
=
childs
;
if
(
sort
)
c
.
sort
(
sort
);