public void CircleGraphDownwardConstraintTests()
        {
            GeometryGraph graph      = GraphGenerator.GenerateCircle(6);
            ISet <Node>   avoidNodes = new HashSet <Node>(graph.Nodes);

            Node firstNode = graph.Nodes.First();
            Node lastNode  = graph.Nodes.Last();

            //add some non-cyclic nodes
            Node node1 = GraphGenerator.CreateNode(graph.Nodes.Count);
            Node node2 = GraphGenerator.CreateNode(graph.Nodes.Count + 1);

            graph.Nodes.Add(node1);
            graph.Nodes.Add(node2);
            graph.Edges.Add(GraphGenerator.CreateEdge(firstNode, node1));
            graph.Edges.Add(GraphGenerator.CreateEdge(node2, lastNode));

            GraphGenerator.SetRandomNodeShapes(graph, random);
            LayoutAndValidate(graph, 2.5, avoidNodes);
        }
Пример #2
0
        static GeometryGraph GenerateGraphWithGroups(Random random, int multiplier)
        {
            int clusterCount = (2 + random.Next(5)) * multiplier;
            int nodeCount    = (clusterCount + random.Next(20)) * multiplier;
            int edgeCount    = (10 + random.Next(20)) * multiplier;

            //tree of clusters
            var           parent = GenerateClusterTree(clusterCount, random);
            GeometryGraph graph  = new GeometryGraph();

            //create nodes
            for (int i = 0; i < nodeCount; i++)
            {
                Node node = GraphGenerator.CreateNode(i);
                graph.Nodes.Add(node);
            }

            //create clusters
            var clusters = new Cluster[clusterCount];

            for (int i = 0; i < clusterCount; i++)
            {
                clusters[i] = new Cluster();
                clusters[i].BoundaryCurve       = CurveFactory.CreateRectangle(30, 30, new Point(15, 15));
                clusters[i].RectangularBoundary = new RectangularClusterBoundary {
                    LeftMargin = 5, RightMargin = 5, BottomMargin = 5, TopMargin = 5
                };
            }

            //set cluster hiearchy
            graph.RootCluster = clusters[0];
            for (int i = 1; i < clusterCount; i++)
            {
                clusters[parent[i]].AddChild(clusters[i]);
            }

            //put nodes to clusters
            for (int i = 0; i < nodeCount; i++)
            {
                clusters[random.Next(clusterCount)].AddChild(graph.Nodes[i]);
            }

            for (int i = 0; i < clusterCount; i++)
            {
                if (clusters[i].Nodes.Count() == 0 && clusters[i].Clusters.Count() == 0)
                {
                    Node node = GraphGenerator.CreateNode(i);
                    graph.Nodes.Add(node);
                    clusters[i].AddChild(node);
                    nodeCount++;
                }
            }

            //adding edges
            for (int i = 0; i < edgeCount; i++)
            {
                int  s     = random.Next(nodeCount + clusterCount - 1);
                Node snode = (s < nodeCount ? graph.Nodes[s] : clusters[s - nodeCount + 1]);
                int  t     = random.Next(nodeCount + clusterCount - 1);
                Node tnode = (t < nodeCount ? graph.Nodes[t] : clusters[t - nodeCount + 1]);

                if (EdgeIsValid(snode, tnode))
                {
                    var edge = new Edge(snode, tnode);
                    edge.LineWidth = 0.5 + 3 * random.NextDouble();
                    graph.Edges.Add(edge);
                }
                else
                {
                    i--;
                }
            }

            SetupPorts(graph);
            return(graph);
        }