public override void Generate(int nodeCount, NodeHolder nodeHolder, EdgeHolder edgeHolder, string SelectedAlgorithm) { var arg = new PaintEventArgs(Drawing_panel.CreateGraphics(), new Rectangle()); for (int i = 0; i < nodeCount; i++) { var interval = (Drawing_panel.Width - 80) / (nodeCount - 1); var p = new Point(40 + (interval * i), Drawing_panel.Height / 2); if (!nodeHolder.AnyIntersecting(p)) { var node = NodeFactory.Create(SelectedAlgorithm, nodeHolder.NodeCount, new WinformsNodeVisualiser(arg, p.X, p.Y, nodeHolder.NodeCount, ParentForm), ParentForm.cb_selfStab.Checked, nodeHolder); nodeHolder.AddNode(node); } else { MessageBox.Show("Nodes do not fit in screen"); break; } } ; for (int i = 0; i < nodeCount; i++) { if (i != nodeCount - 1) { var node1 = nodeHolder.GetNodeAt(i); var node2 = nodeHolder.GetNodeAt(i + 1); edgeHolder.AddEgde(new WinformsEdge(arg, node1, node2)); } } }
//adding edge private void btn_add_edge_Click(object sender, EventArgs e) { _selectedVerticle = null; foreach (var ve in listOfVerticles) { ve.isSelected = false; } Drawing_panel.Invalidate(); var aef = new AddEdgeForm { Verticles = listOfVerticles, Edges = listOfEdges }; if (listOfVerticles.Count < 2) { MessageBox.Show("В графе менее 2 вершин, создать ребро нельзя.", "Ошибка!"); return; } aef.ShowDialog(); if (aef.DialogResult != DialogResult.OK) { return; } listOfEdges.Add(aef.Return); listOfVerticles.Find(x => x.Equals(aef.Return.A)).connections++; listOfVerticles.Find(x => x.Equals(aef.Return.B)).connections++; RenewLists(); RandomizeWeightsPositions(listOfEdges); Drawing_panel.Refresh(); }
//graph autogeneration private void bibaToolStripMenuItem_Click(object sender, EventArgs e) { _selectedVerticle = null; foreach (var ve in listOfVerticles) { ve.isSelected = false; } Drawing_panel.Invalidate(); var ggForm = new GraphGenerateForm(); if (ggForm.ShowDialog() == DialogResult.OK) { ClearGraph(); GenerateGraph(ggForm.Count, ggForm.GenerateEdges); } Drawing_panel.Refresh(); if (ggForm.Count <= 10 || WindowState == FormWindowState.Maximized) { return; } if (MessageBox.Show("Развернуть окно для лучшего отображения графа?", "Большой граф", MessageBoxButtons.YesNo) == DialogResult.Yes) { WindowState = FormWindowState.Maximized; } AddVerticle_btn.Enabled = (listOfVerticles.Count < 15); }
public override void Generate(int nodeCount, NodeHolder nodeHolder, EdgeHolder edgeHolder, string SelectedAlgorithm) { var arg = new PaintEventArgs(Drawing_panel.CreateGraphics(), new Rectangle()); var radius = (Math.Min(Drawing_panel.Height, Drawing_panel.Width) - 80) / 2; var origin = new Point(Drawing_panel.Width / 2, Drawing_panel.Height / 2); for (int i = 0; i < nodeCount; i++) { var angle = 360 / (float)(nodeCount - 1) * i; var p = i == 0 ? origin : PointOnCircle(radius, angle, origin); if (!nodeHolder.AnyIntersecting(p)) { var node = NodeFactory.Create(SelectedAlgorithm, nodeHolder.NodeCount, new WinformsNodeVisualiser(arg, p.X, p.Y, nodeHolder.NodeCount, ParentForm), ParentForm.cb_selfStab.Checked, nodeHolder); nodeHolder.AddNode(node); } else { i--; } } ; for (int i = 0; i < nodeCount; i++) { var node1 = nodeHolder.GetNodeAt(0); var node2 = nodeHolder.GetNodeAt(i); edgeHolder.AddEgde(new WinformsEdge(arg, node1, node2)); } }
//starting Prim method private void методПримаToolStripMenuItem_Click(object sender, EventArgs e) { _selectedVerticle = null; if (!GraphIsConnected(true)) { return; } foreach (var ve in listOfVerticles) { ve.isSelected = false; } Drawing_panel.Invalidate(); Drawing_panel.Refresh(); var pForm = new PrimsMethodForm { Verticles = listOfVerticles, Edges = listOfEdges }; pForm.Size = Size; pForm.WindowState = WindowState; pForm.ShowDialog(); foreach (var edge in listOfEdges) { edge.condition = Condition.Waiting; } RecalculateDrawingCoordinates(); }
public override void Generate(int nodeCount, NodeHolder nodeHolder, EdgeHolder edgeHolder, string SelectedAlgorithm) { var arg = new PaintEventArgs(Drawing_panel.CreateGraphics(), new Rectangle()); var queue = new Queue <int>(); var totalHeight = Math.Floor(Math.Log(nodeCount, 2)) + 1; var verticalInterval = (int)((Drawing_panel.Height - 80) / (totalHeight - 1)); for (int i = 0; i < nodeCount; i++) { var currentDepth = (int)Math.Floor(Math.Log(i + 1, 2)); var horizontalInterval = (int)((Drawing_panel.Width) / (Math.Pow(2, currentDepth) + 1)); var currentIndex = (int)(i - (Math.Pow(2, currentDepth) - 1) + 1); Console.WriteLine("i: {0}, depth: {1}, currentIndex: {2}", i, currentDepth, currentIndex); var p = new Point((currentIndex) * horizontalInterval, (currentDepth) * verticalInterval + 40); if (!nodeHolder.AnyIntersecting(p)) { var node = NodeFactory.Create(SelectedAlgorithm, nodeHolder.NodeCount, new WinformsNodeVisualiser(arg, p.X, p.Y, nodeHolder.NodeCount, ParentForm), ParentForm.cb_selfStab.Checked, nodeHolder); nodeHolder.AddNode(node); } else { throw new Exception("Reached to screen limits"); } } ; for (int i = 1; i < nodeCount; i++) { queue.Enqueue(i); } for (int i = 0; i < nodeCount; i++) { var parent = nodeHolder.GetNodeAt(i); for (int j = 0; j < 2; j++) { if (!queue.Any()) { break; } var firstChildId = queue.Dequeue(); var child = nodeHolder.GetNodeAt(firstChildId); edgeHolder.AddEgde(new WinformsEdge(arg, parent, child)); } } }
//clear all private void очиститьToolStripMenuItem_Click(object sender, EventArgs e) { if (MessageBox.Show("Удалить все элементы графа?", "Вы уверены?", MessageBoxButtons.YesNo) == DialogResult.Yes) { ClearGraph(); Drawing_panel.Refresh(); } }
// about private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e) { _selectedVerticle = null; foreach (var ve in listOfVerticles) { ve.isSelected = false; } Drawing_panel.Invalidate(); var abForm = new AboutForm(); abForm.ShowDialog(); }
// help private void помощьToolStripMenuItem_Click(object sender, EventArgs e) { _selectedVerticle = null; foreach (var ve in listOfVerticles) { ve.isSelected = false; } Drawing_panel.Invalidate(); var hForm = new HelpForm(); hForm.ShowDialog(); }
private void lb_verticle_SelectedIndexChanged(object sender, EventArgs e) { if (_selectedVerticle != null) { _selectedVerticle.isSelected = false; } if (lb_verticle.SelectedIndex == -1) { return; } _selectedVerticle = listOfVerticles[lb_verticle.SelectedIndex]; _selectedVerticle.isSelected = true; Drawing_panel.Invalidate(); }
//adding verticle private void AddVerticle_btn_Click(object sender, EventArgs e) { if (listOfVerticles.Count >= 15) { AddVerticle_btn.Enabled = false; return; } var newvwrt = new Verticle("V" + ++_maxVertNum); listOfVerticles.Add(newvwrt); RecalculateDrawingCoordinates(); RandomizeWeightsPositions(listOfEdges); RenewLists(); Drawing_panel.Refresh(); }
public override void Generate(int nodeCount, NodeHolder nodeHolder, EdgeHolder edgeHolder, string SelectedAlgorithm) { var arg = new PaintEventArgs(Drawing_panel.CreateGraphics(), new Rectangle()); var horizontalInterval = (Drawing_panel.Width - 80) / 3; var verticalInterval = (Drawing_panel.Height - 80) / ((nodeCount / 2) - (nodeCount % 2 == 0 ? 1 : 0)); for (int i = 0; i < nodeCount; i++) { var x = i < nodeCount / 2 ? 40 + horizontalInterval : 40 + (horizontalInterval * 2); var y = 40 + (verticalInterval * (i < (nodeCount / 2) ? i : i - (nodeCount / 2))); var p = new Point(x, y); if (!nodeHolder.AnyIntersecting(p)) { var node = NodeFactory.Create(SelectedAlgorithm, nodeHolder.NodeCount, new WinformsNodeVisualiser(arg, p.X, p.Y, nodeHolder.NodeCount, ParentForm), ParentForm.cb_selfStab.Checked, nodeHolder); nodeHolder.AddNode(node); } else { i--; } } ; for (int i = 0; i < nodeCount / 2; i++) { for (int j = nodeCount / 2; j < nodeCount; j++) { var node1 = nodeHolder.GetNodeAt(i); var node2 = nodeHolder.GetNodeAt(j); edgeHolder.AddEgde(new WinformsEdge(arg, node1, node2)); } } }
//delete edge private void удалитьToolStripMenuItem1_Click(object sender, EventArgs e) { if (MessageBox.Show("Удaлить ребро?", "Вы уверены?", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; } var del = listOfEdges[lb_edges.SelectedIndex]; listOfEdges.Remove(del); del.A.connections--; del.B.connections--; if (_selectedVerticle != null) { _selectedVerticle.isSelected = false; } _selectedVerticle = null; RenewLists(); RecalculateDrawingCoordinates(); Drawing_panel.Refresh(); }
public override void Generate(int nodeCount, NodeHolder nodeHolder, EdgeHolder edgeHolder, string SelectedAlgorithm) { var arg = new PaintEventArgs(Drawing_panel.CreateGraphics(), new Rectangle()); nodeCount = DeserializationContext.Nodes.Count; for (int i = 0; i < nodeCount; i++) { var _node = DeserializationContext.Nodes[i]; var node = NodeFactory.Create(SelectedAlgorithm, _node.Id, new WinformsNodeVisualiser(arg, _node._Position.X, _node._Position.Y, nodeHolder.NodeCount, ParentForm), ParentForm.cb_selfStab.Checked, nodeHolder, _node._PredefinedState); nodeHolder.AddNode(node); } ; for (int i = 0; i < nodeCount; i++) { for (int j = i; j < nodeCount; j++) { if (i == j) { continue; } if (!DeserializationContext.Nodes[i]._Neighbours.Contains(j)) { continue; } var node1 = nodeHolder.GetNodeAt(i); var node2 = nodeHolder.GetNodeAt(j); edgeHolder.AddEgde(new WinformsEdge(arg, node1, node2)); } } }
//delete verticle private void удалитьToolStripMenuItem_Click(object sender, EventArgs e) { if (MessageBox.Show("Удaлить вершину?", "Вы уверены?", MessageBoxButtons.YesNo) != DialogResult.Yes) { return; } listOfVerticles.Remove(_selectedVerticle); while (_selectedVerticle.connections > 0) { var del = listOfEdges.First(x => Equals(x.A, _selectedVerticle) || Equals(x.B, _selectedVerticle)); del.A.connections--; del.B.connections--; listOfEdges.Remove(del); } _selectedVerticle.isSelected = false; _selectedVerticle = null; AddVerticle_btn.Enabled = true; RenewLists(); RecalculateDrawingCoordinates(); Drawing_panel.Refresh(); }
private void Form1_Resize(object sender, EventArgs e) { RecalculateDrawingCoordinates(); Drawing_panel.Refresh(); }
private void исправитьНаложениеВесовToolStripMenuItem_Click(object sender, EventArgs e) { RandomizeWeightsPositions(listOfEdges); Drawing_panel.Refresh(); }
public override void Generate(int nodeCount, NodeHolder nodeHolder, EdgeHolder edgeHolder, string SelectedAlgorithm) { var arg = new PaintEventArgs(Drawing_panel.CreateGraphics(), new Rectangle()); var radius = (Math.Min(Drawing_panel.Height, Drawing_panel.Width) - 80) / 2; var origin = new Point(Drawing_panel.Width / 2, Drawing_panel.Height / 2); var randomizer = new Random(); for (int i = 0; i < nodeCount; i++) { var angle = 360 / (float)nodeCount * i; var p = PointOnCircle(radius, angle, origin); if (!nodeHolder.AnyIntersecting(p)) { var node = NodeFactory.Create(SelectedAlgorithm, nodeHolder.NodeCount, new WinformsNodeVisualiser(arg, p.X, p.Y, nodeHolder.NodeCount, ParentForm), ParentForm.cb_selfStab.Checked, nodeHolder, randomizer.Next(0, 3)); nodeHolder.AddNode(node); } else { i--; } } ; //for (int i = 0; i < nodeCount; i++) //{ // var p = new Point(randomizer.Next(40, Drawing_panel.Width - 40), randomizer.Next(40, Drawing_panel.Height - 40)); // if (!nodeHolder.AnyIntersecting(p)) // { // var node = NodeFactory.Create(SelectedAlgorithm, nodeHolder.NodeCount, new WinformsNodeVisualiser(arg, p.X, p.Y, nodeHolder.NodeCount, ParentForm), ParentForm.cb_selfStab.Checked, nodeHolder); // nodeHolder.AddNode(node); // } // else // { // i--; // } //}; for (int i = 0; i < nodeCount; i++) { if (i != nodeCount - 1) { var node1 = nodeHolder.GetNodeAt(i); var node2 = nodeHolder.GetNodeAt(i + 1); edgeHolder.AddEgde(new WinformsEdge(arg, node1, node2)); } } foreach (var node1 in nodeHolder.GetCopyList()) { for (int i = 0; i < Grade; i++) { if (node1.Neighbours.Count >= Grade) { break; } var nextNodeId = randomizer.Next(0, nodeCount); while (nextNodeId == node1.Id || node1.IsNeigbourOf(nextNodeId)) { nextNodeId = randomizer.Next(0, nodeCount); } edgeHolder.AddEgde(new WinformsEdge(arg, node1, nodeHolder.GetNodeById(nextNodeId))); } //foreach (var node2 in nodeHolder.GetCopyList().Where(n => n != node1)) //{ // if (randomizer.Next() % 100 > 10) continue; // if (node1.Neighbours.ContainsKey(node2.Id)) continue; // edgeHolder.AddEgde(new WinformsEdge(arg, node1, node2)); //} } }
private void Drawing_panel_MouseDown(object sender, MouseEventArgs e) { if (lb_verticle.SelectedIndex != -1) { lb_verticle.SetSelected(lb_verticle.SelectedIndex, false); } if (lb_edges.SelectedIndex != -1) { lb_edges.SetSelected(lb_edges.SelectedIndex, false); } if (e.Button != MouseButtons.Left) { wwClick = WhereWasClick.DrawingPanel; return; } Verticle select = null; foreach (var verticle in listOfVerticles) { int dx = e.X - verticle.point.X, dy = e.Y - verticle.point.Y; if (!(Math.Sqrt(dx * dx + dy * dy) <= verticleRadius)) { continue; } select = verticle; break; } if (Equals(_selectedVerticle, select) || select == null) { if (_selectedVerticle != null) { _selectedVerticle.isSelected = false; _selectedVerticle = null; Drawing_panel.Invalidate(); } return; } if (_selectedVerticle == null) { _selectedVerticle = select; if (_selectedVerticle != null) { _selectedVerticle.isSelected = true; } Drawing_panel.Invalidate(); } else { if (listOfEdges.Any(ed => Equals(ed.A, select) && Equals(ed.B, _selectedVerticle) || Equals(ed.A, _selectedVerticle) && Equals(ed.B, select))) { return; } var aef = new AddEdgeForm { Verticles = listOfVerticles, Edges = listOfEdges, SetDefaultVerticles = true, Va = _selectedVerticle, Vb = select }; aef.ShowDialog(); if (aef.DialogResult != DialogResult.OK) { if (_selectedVerticle != null) { _selectedVerticle.isSelected = false; } _selectedVerticle.isSelected = false; _selectedVerticle = null; Drawing_panel.Invalidate(); return; } listOfEdges.Add(aef.Return); listOfVerticles.Find(x => x.Equals(aef.Return.A)).connections++; listOfVerticles.Find(x => x.Equals(aef.Return.B)).connections++; RandomizeWeightsPositions(listOfEdges); RenewLists(); if (_selectedVerticle != null) { _selectedVerticle.isSelected = false; } Drawing_panel.Refresh(); _selectedVerticle = null; } }