//Добавление ноды по координатам private void add_point_Click(object sender, EventArgs e) { if (coord_x.Text != "" && coord_y.Text != "" && point_name.Text != "") { S_point pnt = new S_point(new Point(Convert.ToInt32(coord_x.Text), Convert.ToInt32(coord_y.Text)), 0, point_name.Text); S_point p = delete_exist_point(pnt.pnt, grph.Nodes); if (p == null) { grph.Nodes.Add(pnt); print_graph(grph, cr_con, start_end, Canvas); coord_x.Text = ""; coord_y.Text = ""; point_name.Text = ""; } else System.Windows.Forms.MessageBox.Show("Ошибка:\n" + "Уже существует вершина с такими координатами.", "", MessageBoxButtons.OK, MessageBoxIcon.Error); } else System.Windows.Forms.MessageBox.Show("Ошибка:\n" + "Должны быть указаны имя и координаты вершины.", "", MessageBoxButtons.OK, MessageBoxIcon.Error); }
/* * Обработка клика мышкой по полю для рисования, выполняет различные действия в зависимости от режима * в режиме point проставляет по клику ноды * в режиме line создает связи между нодами * в режиме path устанавливает точки, между которыми будет рассчитываться кратчайший путь */ private void Canvas_MouseClick(object sender, MouseEventArgs e) { S_point pnt = new S_point(new Point(e.X, e.Y),0,point_name_man.Text); switch ((Canvas.Tag as String)) { case "point": S_point p = delete_exist_point(pnt.pnt, grph.Nodes); if (p == null) { grph.Nodes.Add(pnt); point_name_man.Text = ""; } else delete_node(p, grph.Lines); break; case "line": int i=0; if (grph.Nodes.Count > 1) { do { if (check_point(pnt.pnt, grph.Nodes[i].pnt)) pnt = grph.Nodes[i]; i++; } while (i < grph.Nodes.Count && pnt != grph.Nodes[i - 1]); if (pnt != grph.Nodes[i - 1]) break; if (cr_con.p1 == new Point(0, 0)) cr_con.p1 = pnt.pnt; else { if (cr_con.p1 == pnt.pnt) cr_con.p1 = new Point(0, 0); else { cr_con.p2 = pnt.pnt; cr_con.cost = calc_cost(cr_con.p1, cr_con.p2); if (!delete_exist_line(cr_con, grph.Lines)) grph.Lines.Add(cr_con); cr_con = new Connection(new Point(0, 0), new Point(0, 0), 0); } } } else System.Windows.Forms.MessageBox.Show("Ошибка:\n" + "Перед созданием граней создайте хотя бы 2 вершины графа.", "", MessageBoxButtons.OK, MessageBoxIcon.Error); break; case "path": i = 0; if (grph.Nodes.Count > 1) { do { p = grph.Nodes[i]; i++; if (check_point(p.pnt, pnt.pnt)) pnt = p; } while (pnt != p && i < grph.Nodes.Count); if (p == pnt) if (start_end.p1 == pnt.pnt || start_end.p2 == pnt.pnt) { if (start_end.p1 == pnt.pnt) start_end.p1 = new Point(0, 0); else start_end.p2 = new Point(0, 0); } else if (start_end.p1 == new Point(0, 0)) start_end.p1 = pnt.pnt; else if (start_end.p2 == new Point(0, 0)) start_end.p2 = pnt.pnt; } else System.Windows.Forms.MessageBox.Show("Ошибка:\n" + "Перед этим действием нужно создать хотя бы 2 вершины.", "", MessageBoxButtons.OK, MessageBoxIcon.Error); break; } print_graph(grph, cr_con, start_end, Canvas); }
//Функция найдет и удалит связи, которые связывают указанную вершину с другими static void delete_node(S_point _p, List<Connection> _cons) { for (int i=_cons.Count-1; i>=0; i--) if (_cons[i].p1==_p.pnt || _cons[i].p2==_p.pnt) _cons.RemoveAt(i); }