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); } }
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); }
public GoNodeWrapper(SpotNode spotNode, InstructionNode instWrapper) { SpotNode = spotNode; InstWrapper = instWrapper; }
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); }