private void layoutButton_Click(object sender, RoutedEventArgs e)
        {
            var diagram = new Diagram();
            var nodes   = new Dictionary <PlanetDrawing, SpotNode>();

            // add all nodes representing planets to the diagram
            foreach (var planetDrawing in galaxyDrawing.PlanetDrawings)
            {
                var node = new SpotNode();
                diagram.AddNode(node);
                nodes[planetDrawing] = node;
            }
            // add planet links to the diagram
            foreach (var link in galaxyDrawing.LinkDrawings)
            {
                nodes[link.Planet1].AddParent(nodes[link.Planet2]);
            }
            // create the layout
            diagram.Arrange();

            // set planet positions, from their nodes
            var bounds = diagram.GetDiagramBounds();

            foreach (var kvp in nodes)
            {
                var node          = kvp.Value;
                var planetDrawing = kvp.Key;
                // get relative coordinates (0 to 1)
                var x = ((double)node.X - bounds.Left) / bounds.Width;
                var y = ((double)node.Y - bounds.Top) / bounds.Height;
                // add some space between the border and planets
                x = x * 0.8 + 0.1;
                y = y * 0.8 + 0.1;
                // set the planet position
                planetDrawing.Planet.X = x;
                planetDrawing.Planet.Y = y;
                planetDrawing.Position = new Point(x * galaxyDrawing.ImageSource.Width, y * galaxyDrawing.ImageSource.Height);
            }
        }
示例#2
0
        private void GraphDrawing_Load(object sender, EventArgs e)
        {
            List <Node> list = new List <Node>();

            for (int i = 0; i < m_model.States.Count; i++)
            {
                if (m_model.States[i] == null)
                {
                    list.Add(null);
                    continue;
                }
                Node n = new SpotNode(Color.Blue);
                list.Add(n);
                n.ID = i;
            }

            for (int i = 0; i < m_model.States.Count; i++)
            {
                if (m_model.States[i] == null)
                {
                    continue;
                }
                for (int j = 0; j < m_model.States[i].Count; j++)
                {
                    if (m_model.States[i][j] == null)
                    {
                        continue;
                    }
                    list[i].AddChild(list[m_model[i, j].sP]);
                }
            }
            di.AddNode(list[0]);

            Thread bg = new Thread(Draw);

            bg.IsBackground = true;
            bg.Start();
            Thread.Sleep(20);
        }
示例#3
0
 public GoNodeWrapper(SpotNode spotNode, InstructionNode instWrapper)
 {
     SpotNode    = spotNode;
     InstWrapper = instWrapper;
 }
示例#4
0
        protected void Setup()
        {
            diagram = new Diagram(this);
            rnd     = new Random();
            bool overrun = false;

            diagram.Arrange();

            timer          = new System.Windows.Forms.Timer();
            timer.Interval = 1000 / 20;                         // 20 times a second, in milliseconds.
            timer.Tick    += (sender, args) => pnlCloud.Invalidate(true);

            pnlCloud.Paint += (sender, args) =>
            {
                Graphics gr = args.Graphics;
                gr.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

                ++paintIteration;
                // ReduceCounts();

                if (!overrun)
                {
                    overrun = true;
                    int maxTweets = 20;

                    // We assume here that we can parse the data faster than the incoming stream hands it to us.
                    // But we put in a safety check to handle only 20 tweets.
                    while (tweetQueue.Count > 0 && (--maxTweets > 0))
                    {
                        string tweet;

                        lock (this)
                        {
                            tweet = tweetQueue.Dequeue();
                        }

                        SynchronousUpdate(tweet);
                    }

                    // gr.Clear(Color.White);
                    diagram.Iterate(Diagram.DEFAULT_DAMPING, Diagram.DEFAULT_SPRING_LENGTH, Diagram.DEFAULT_MAX_ITERATIONS);
                    diagram.Draw(gr, Rectangle.FromLTRB(12, 24, pnlCloud.Width - 12, pnlCloud.Height - 36));

                    // gr.DrawString(paintIteration.ToString() + "  " + diagram.Nodes.Count.ToString() + "  " + tweetQueue.Count.ToString() + "  " + diagram.layout.Count.ToString(), font, brushBlack, new Point(3, 3));

                    overrun = false;
                }
                else
                {
                    gr.DrawString("overrun", font, brushBlack, new Point(3, 3));
                }
            };

            pnlCloud.MouseMove  += OnMouseMove;
            pnlCloud.MouseLeave += (sender, args) =>
            {
                if (tweetForm != null)
                {
                    tweetForm.Close();
                    tweetForm = null;
                    mouseWord = String.Empty;
                }
            };

            timer.Start();

            Node node = new SpotNode(Color.Black);

            rootNode = node;
            diagram.AddNode(node);
        }