Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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();
        }