Browse Source

Tree layout is determined by BFS rather than DFS.

pull/15/head
mkonicek 15 years ago
parent
commit
bbf3053188
  1. 47
      src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/Tree/TreeLayout.cs

47
src/AddIns/Debugger/Debugger.AddIn/Visualizers/Graph/Layout/Tree/TreeLayout.cs

@ -78,31 +78,48 @@ namespace Debugger.AddIn.Visualizers.Graph.Layout @@ -78,31 +78,48 @@ namespace Debugger.AddIn.Visualizers.Graph.Layout
void CalculateLayout(PositionedGraph positionedGraph)
{
HashSet<PositionedNode> seenNodes = new HashSet<PositionedNode>();
HashSet<PositionedEdge> treeEdges = new HashSet<PositionedEdge>();
// impose a tree structure on the graph
HashSet<PositionedEdge> treeEdges = DetermineTreeEdges(positionedGraph.Root);
// first layout pass
CalculateSubtreeSizes(positionedGraph.Root, seenNodes, treeEdges);
CalculateSubtreeSizesRecursive(positionedGraph.Root, treeEdges);
// second layout pass
CalculateNodePosRecursive(positionedGraph.Root, treeEdges, MarginTop, MarginBottom);
}
// determines which edges are tree edges, and calculates subtree size for each node
private void CalculateSubtreeSizes(PositionedNode root, HashSet<PositionedNode> seenNodes, HashSet<PositionedEdge> treeEdges)
HashSet<PositionedEdge> DetermineTreeEdges(PositionedNode root)
{
var treeEdges = new HashSet<PositionedEdge>();
var seenNodes = new HashSet<PositionedNode>();
var q = new Queue<PositionedNode>();
q.Enqueue(root);
seenNodes.Add(root);
double subtreeSize = 0;
foreach (var property in root.Properties) {
var edge = property.Edge;
if (edge != null) {
var targetNode = edge.Target;
if (!seenNodes.Contains(targetNode)) {
// when we come to a node for the first time, we declare the incoming edge a tree edge
treeEdges.Add(edge);
CalculateSubtreeSizes(targetNode, seenNodes, treeEdges);
subtreeSize += targetNode.SubtreeSize;
while (q.Count > 0) {
var node = q.Dequeue();
foreach (var property in node.Properties) {
var edge = property.Edge;
if (edge != null && edge.Target != null) {
if (!seenNodes.Contains(edge.Target)) {
treeEdges.Add(edge);
seenNodes.Add(edge.Target);
q.Enqueue(edge.Target);
}
}
}
}
return treeEdges;
}
void CalculateSubtreeSizesRecursive(PositionedNode root, HashSet<PositionedEdge> treeEdges)
{
double subtreeSize = 0;
foreach (var child in TreeChildNodes(root, treeEdges)) {
CalculateSubtreeSizesRecursive(child, treeEdges);
// just sum up the sizes of children
subtreeSize += child.SubtreeSize;
}
root.SubtreeSize = Math.Max(GetLateralSizeWithMargin(root), subtreeSize);
}

Loading…
Cancel
Save