/// <summary> /// Performs the actual layout algorithm. /// </summary> /// <param name="graph">The object containing the graph data</param> /// <param name="rootNode">Root node</param> protected override void PerformLayout(GraphMapData graph, INode rootNode) { BidirectionalGraph<string, WeightedEdge<string>> bGraph = GraphSharpUtility.GetBidirectionalGraph(graph); IDictionary<string, Vector> nodePositions = GraphSharpUtility.GetNodePositions(graph); IDictionary<string, Size> nodeSizes = GraphSharpUtility.GetNodeSizes(graph); SimpleTreeLayoutParameters simpleTreeLayoutParameters = new SimpleTreeLayoutParameters(); SimpleTreeLayoutAlgorithm<string, WeightedEdge<string>, BidirectionalGraph<string, WeightedEdge<string>>> simpleTreeLayoutAlgorithm = new SimpleTreeLayoutAlgorithm<string, WeightedEdge<string>, BidirectionalGraph<string, WeightedEdge<string>>>(bGraph, nodePositions, nodeSizes, simpleTreeLayoutParameters); simpleTreeLayoutAlgorithm.Compute(); GraphSharpUtility.SetNodePositions(graph, simpleTreeLayoutAlgorithm.VertexPositions); }
/// <summary> /// Performs the actual layout algorithm. /// </summary> /// <param name="graph">The object containing the graph data</param> /// <param name="rootNode">Root node</param> protected override void PerformLayout(GraphMapData graph, INode rootNode) { BidirectionalGraph <string, WeightedEdge <string> > bGraph = GraphSharpUtility.GetBidirectionalGraph(graph); IDictionary <string, Vector> nodePositions = GraphSharpUtility.GetNodePositions(graph); IDictionary <string, Size> nodeSizes = GraphSharpUtility.GetNodeSizes(graph); SimpleTreeLayoutParameters simpleTreeLayoutParameters = new SimpleTreeLayoutParameters(); SimpleTreeLayoutAlgorithm <string, WeightedEdge <string>, BidirectionalGraph <string, WeightedEdge <string> > > simpleTreeLayoutAlgorithm = new SimpleTreeLayoutAlgorithm <string, WeightedEdge <string>, BidirectionalGraph <string, WeightedEdge <string> > >(bGraph, nodePositions, nodeSizes, simpleTreeLayoutParameters); simpleTreeLayoutAlgorithm.Compute(); GraphSharpUtility.SetNodePositions(graph, simpleTreeLayoutAlgorithm.VertexPositions); }
/// <inheritdoc /> protected override void InternalCompute() { // Separate the two sides SeparateSides( VisitedGraph, _root, out HashSet <TVertex> side1, out HashSet <TVertex> side2); // Build the temporary graph for the two sides BuildTemporaryGraphs( side1, side2, out BidirectionalGraph <TVertex, Edge <TVertex> > graph1, out BidirectionalGraph <TVertex, TEdge> graph2); VerticesInfos[_root] = DoubleTreeVertexType.Center; ComputeLayoutDirections(out LayoutDirection side1Direction, out LayoutDirection side2Direction); // SimpleTree layout on the two side var side1LayoutAlgorithm = new SimpleTreeLayoutAlgorithm <TVertex, Edge <TVertex>, BidirectionalGraph <TVertex, Edge <TVertex> > >( graph1, VerticesPositions, _verticesSizes, new SimpleTreeLayoutParameters { LayerGap = Parameters.LayerGap, VertexGap = Parameters.VertexGap, Direction = side1Direction, SpanningTreeGeneration = SpanningTreeGeneration.BFS }); var side2LayoutAlgorithm = new SimpleTreeLayoutAlgorithm <TVertex, TEdge, BidirectionalGraph <TVertex, TEdge> >( graph2, VerticesPositions, _verticesSizes, new SimpleTreeLayoutParameters { LayerGap = Parameters.LayerGap, VertexGap = Parameters.VertexGap, Direction = side2Direction, SpanningTreeGeneration = SpanningTreeGeneration.BFS }); side1LayoutAlgorithm.Compute(); side2LayoutAlgorithm.Compute(); // Merge the layouts Vector side2Translate = side1LayoutAlgorithm.VerticesPositions[_root] - side2LayoutAlgorithm.VerticesPositions[_root]; foreach (TVertex vertex in side1) { VerticesPositions[vertex] = side1LayoutAlgorithm.VerticesPositions[vertex]; } foreach (TVertex vertex in side2) { VerticesPositions[vertex] = side2LayoutAlgorithm.VerticesPositions[vertex] + side2Translate; } NormalizePositions(); }
protected override void InternalCompute() { // // Separate the two sides // HashSet <TVertex> side1, side2; SeparateSides(VisitedGraph, root, out side1, out side2); #region Build the temporary graph for the two sides // // The IN side // //on the IN side we should reverse the edges var graph1 = new BidirectionalGraph <TVertex, Edge <TVertex> >(); graph1.AddVertexRange(side1); foreach (var v in side1) { vertexInfos[v] = DoubleTreeVertexType.Backward; foreach (var e in VisitedGraph.InEdges(v)) { if (!side1.Contains(e.Source) || e.Source.Equals(e.Target)) { continue; } //reverse the edge graph1.AddEdge(new Edge <TVertex>(e.Target, e.Source)); } } // // The OUT side // var graph2 = new BidirectionalGraph <TVertex, TEdge>(); graph2.AddVertexRange(side2); foreach (var v in side2) { vertexInfos[v] = DoubleTreeVertexType.Forward; foreach (var e in VisitedGraph.OutEdges(v)) { if (!side2.Contains(e.Target) || e.Source.Equals(e.Target)) { continue; } //simply add the edge graph2.AddEdge(e); } } vertexInfos[root] = DoubleTreeVertexType.Center; #endregion LayoutDirection side2Direction = Parameters.Direction; LayoutDirection side1Direction = Parameters.Direction; switch (side2Direction) { case LayoutDirection.BottomToTop: side1Direction = LayoutDirection.TopToBottom; break; case LayoutDirection.LeftToRight: side1Direction = LayoutDirection.RightToLeft; break; case LayoutDirection.RightToLeft: side1Direction = LayoutDirection.LeftToRight; break; case LayoutDirection.TopToBottom: side1Direction = LayoutDirection.BottomToTop; break; } // // SimpleTree layout on the two side // var side1LayoutAlg = new SimpleTreeLayoutAlgorithm <TVertex, Edge <TVertex>, BidirectionalGraph <TVertex, Edge <TVertex> > >( graph1, VertexPositions, vertexSizes, new SimpleTreeLayoutParameters { LayerGap = Parameters.LayerGap, VertexGap = Parameters.VertexGap, Direction = side1Direction, SpanningTreeGeneration = SpanningTreeGeneration.BFS }); var side2LayoutAlg = new SimpleTreeLayoutAlgorithm <TVertex, TEdge, BidirectionalGraph <TVertex, TEdge> >( graph2, VertexPositions, vertexSizes, new SimpleTreeLayoutParameters { LayerGap = Parameters.LayerGap, VertexGap = Parameters.VertexGap, Direction = side2Direction, SpanningTreeGeneration = SpanningTreeGeneration.BFS }); side1LayoutAlg.Compute(); side2LayoutAlg.Compute(); // // Merge the layouts // var side2Translate = side1LayoutAlg.VertexPositions[root] - side2LayoutAlg.VertexPositions[root]; foreach (var v in side1) { VertexPositions[v] = side1LayoutAlg.VertexPositions[v]; } foreach (var v in side2) { VertexPositions[v] = side2LayoutAlg.VertexPositions[v] + side2Translate; } NormalizePositions(); }