Beispiel #1
0
 //Добавление ноды по координатам
 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);
 }
Beispiel #2
0
 /*
  * Обработка клика мышкой по полю для рисования, выполняет различные действия в зависимости от режима
  * в режиме 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);
 }
Beispiel #3
0
 //Функция найдет и удалит связи, которые связывают указанную вершину с другими
 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);
 }