Exemple #1
0
        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));
                }
            }
        }
Exemple #2
0
        //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();
        }
Exemple #3
0
        //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);
        }
Exemple #4
0
        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));
            }
        }
Exemple #5
0
        //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));
                }
            }
        }
Exemple #7
0
 //clear all
 private void очиститьToolStripMenuItem_Click(object sender, EventArgs e)
 {
     if (MessageBox.Show("Удалить все элементы графа?", "Вы уверены?", MessageBoxButtons.YesNo) ==
         DialogResult.Yes)
     {
         ClearGraph();
         Drawing_panel.Refresh();
     }
 }
Exemple #8
0
        // 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();
        }
Exemple #9
0
        // 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();
        }
Exemple #10
0
 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();
 }
Exemple #11
0
        //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();
        }
Exemple #12
0
        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));
                }
            }
        }
Exemple #13
0
        //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));
                }
            }
        }
Exemple #15
0
        //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();
        }
Exemple #16
0
 private void Form1_Resize(object sender, EventArgs e)
 {
     RecalculateDrawingCoordinates();
     Drawing_panel.Refresh();
 }
Exemple #17
0
 private void исправитьНаложениеВесовToolStripMenuItem_Click(object sender, EventArgs e)
 {
     RandomizeWeightsPositions(listOfEdges);
     Drawing_panel.Refresh();
 }
Exemple #18
0
        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));
                //}
            }
        }
Exemple #19
0
        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;
            }
        }