Пример #1
0
        /// <summary>
        /// Запуск алгоритма расчета
        /// </summary>
        /// <param name="beginp"></param>
        public void AlgoritmRun(PointG beginp)
        {
            if (this.PointGs.Count() == 0 || this.rebra.Count() == 0)
            {
                throw new DekstraException("Массив вершин или ребер не задан!");
            }
            else
            {
                BeginPointG = beginp;
                OneStep(beginp);
                foreach (PointG PointG in PointGs)
                {
                    PointG anotherP = GetAnotherUncheckedPointG();
                    if (anotherP != null)
                    {
                        OneStep(anotherP);
                    }
                    else
                    {
                        break;
                    }

                }
            }
        }
Пример #2
0
 /// <summary>
 /// Задаем начальную и конечную станции для движения поезда.
 /// </summary>
 /// <param name="begin"></param>
 /// <param name="end"></param>
 public Train(PointG begin, PointG end)
 {
     beginPointG = nowPointG = begin;
     endPointG = end;
     StartCoordinate = new Point(begin.X,begin.Y);
     FinishCoordinate= new Point(end.X,end.Y);
     NextCoordinate = new Point(begin.X, begin.Y);
 }
Пример #3
0
 public PointG(int value, bool ischecked, string name, int x,int y)
 {
     ValueMetka = value;
     IsChecked = ischecked;
     Name = name;
     X = x;
     Y = y;
     predPointG = new PointG();
 }
Пример #4
0
 /// <summary>
 /// Получаем ребро, соединяющее 2 входные точки
 /// </summary>
 /// <param name="Первая вершина"></param>
 /// <param name="Вторая вершина"></param>
 /// <returns></returns>
 public Rebro GetMyRebro(PointG a, PointG b)
 {
     //ищем ребро по 2 точкам
     IEnumerable<Rebro> myr = from reb in rebra
                              where
                                  (reb.FirstPointG == a & reb.SecondPointG == b) ||
                                  (reb.SecondPointG == a & reb.FirstPointG == b)
                              select reb;
     if (myr.Count() > 1 || myr.Count() == 0)
     {
         return null;
         throw new DekstraException("Не найдено ребро между соседями!");
     }
     else
     {
         return myr.First();
     }
 }
Пример #5
0
 /// <summary>
 /// Получаем маршрут.
 /// </summary>
 public void GetPath(PointG[] pointGs,Rebro[] rebros)
 {
     foreach (PointG point in pointGs)
     {
         point.ValueMetka = point == beginPointG ? 0 : 999;
         point.IsChecked = false;
     }
     DekstraAlgorim da = new DekstraAlgorim(pointGs,rebros);
     da.AlgoritmRun(beginPointG);
     path = da.MinPath1(endPointG);
     inPointG = path[path.Count - 2];
     FinishCoordinate.X = path[path.Count - 2].X;
     FinishCoordinate.Y = path[path.Count - 2].Y;
 }
Пример #6
0
 /// <summary>
 /// Поиск соседей для вершины. Для неориентированного графа ищутся все соседи.
 /// </summary>
 /// <param name="currPointG"></param>
 /// <returns></returns>
 private IEnumerable<PointG> Pred(PointG currPointG)
 {
     IEnumerable<PointG> firstPointGs = from ff in rebra
                                        where ff.FirstPointG == currPointG
                                        select ff.SecondPointG;
     IEnumerable<PointG> secondPointGs = from sp in rebra
                                         where sp.SecondPointG == currPointG
                                         select sp.FirstPointG;
     IEnumerable<PointG> totalPointGs = firstPointGs.Concat<PointG>(secondPointGs);
     return totalPointGs;
 }
Пример #7
0
 public DekstraAlgorim(PointG[] PointGsOfgrath, Rebro[] rebraOfgrath)
 {
     PointGs = PointGsOfgrath;
     rebra = rebraOfgrath;
 }
Пример #8
0
        /// <summary>
        /// Метод, делающий один шаг алгоритма. Принимает на вход вершину
        /// </summary>
        /// <param name="beginPointG"></param>
        public void OneStep(PointG beginPointG)
        {
            foreach (PointG nextp in Pred(beginPointG))
            {
                if (nextp.IsChecked == false) //не отмечена
                {
                    float newmetka;
                    try
                    {
                        newmetka = beginPointG.ValueMetka + GetMyRebro(nextp, beginPointG).Weight;
                    }
                    catch (Exception)
                    {
                        newmetka = beginPointG.ValueMetka;
                    }

                    if (nextp.ValueMetka > newmetka)
                    {
                        nextp.ValueMetka = newmetka;
                        nextp.predPointG = beginPointG;
                    }
                    else
                    {

                    }
                }
            }
            beginPointG.IsChecked = true; //вычеркиваем
        }
Пример #9
0
 /// <summary>
 /// Получаем минимальный путь.
 /// </summary>
 /// <param name="end"></param>
 /// <returns>Вершина до которой проложить путь</returns>
 public List<PointG> MinPath1(PointG end)
 {
     List<PointG> listOfPointGs = new List<PointG>();
     PointG tempp = end;
     while (tempp != this.BeginPointG)
     {
         if (tempp == null)
         {
             return listOfPointGs;
         }
         listOfPointGs.Add(tempp);
         tempp = tempp.predPointG;
     }
     listOfPointGs.Add(tempp);
     return listOfPointGs;
 }
Пример #10
0
        private void Create_Click(object sender, EventArgs e)
        {
            ListStation.Clear();
            listTrain.Clear();
            threads.Clear();
            int stationCount = Convert.ToInt32(numericStationCount.Value);
            int trainCount = Convert.ToInt32(numericTrainCount.Value);
            double alfa = 0;
            double stepAlfa = 360 / stationCount * Math.PI / 180;
            int A_widht = 370;
            int B_height = 220;
            double radius;
            tops = new PointG[stationCount];
            for (int i = 0; i < stationCount; i++)
            {
                radius = B_height * A_widht /
                         Math.Sqrt(B_height * B_height * Math.Cos(alfa) * Math.Cos(alfa) +
                                   A_widht * A_widht * Math.Sin(alfa) * Math.Sin(alfa));
                ListStation.Add(new Station(new Point(Convert.ToInt32(radius * Math.Cos(alfa)), Convert.ToInt32(-radius * Math.Sin(alfa))),
                    i.ToString()));

                tops[i] = new PointG(999, false, (i).ToString(CultureInfo.InvariantCulture),
                                     Convert.ToInt32(radius * Math.Cos(alfa)), Convert.ToInt32(-radius * Math.Sin(alfa)));
                alfa += stepAlfa;
            }
            //dataGridViewTrain.Rows.Add(trainCount);
            dataGridViewTrain.Rows.Clear();
            ((DataGridViewComboBoxColumn)dataGridViewTrain.Columns[1]).Items.Clear();
            ((DataGridViewComboBoxColumn)dataGridViewTrain.Columns[2]).Items.Clear();
            //var cell = new DataGridViewComboBoxCell();
            //GridItemCollection It;
            for (int i = 0; i < stationCount; i++)
            {
                ((DataGridViewComboBoxColumn)dataGridViewTrain.Columns[1]).Items.Add(ListStation[i].name);
                ((DataGridViewComboBoxColumn)dataGridViewTrain.Columns[2]).Items.Add(ListStation[i].name);
            }
            for (int i = 0; i < trainCount; i++)
            {

                //((DataGridViewComboBoxColumn)dataGridViewTrain.Columns[1]).Items.Add(ListStation[i].name);
                //((DataGridViewComboBoxColumn)dataGridViewTrain.Columns[2]).Items.Add(ListStation[i].name);
                dataGridViewTrain.Rows.Add();
                dataGridViewTrain[0, i].Value = i + 1;
            }

            GenerateGraph();
            graphics = new GraphicsMy(this, ListStation, rebro, listTrain);
            graphics.RenderingTest();
        }
Пример #11
0
 /// <summary>
 /// Задаем ребро.
 /// </summary>
 /// <param name="first"></param>
 /// <param name="second"></param>
 /// <param name="valueOfWeight"></param>
 /// <returns></returns>
 public Rebro(PointG first, PointG second, float valueOfWeight)
 {
     FirstPointG = first;
     SecondPointG = second;
     Weight = valueOfWeight;
 }
Пример #12
0
 public PointG(int value, bool ischecked)
 {
     ValueMetka = value;
     IsChecked = ischecked;
     predPointG = new PointG();
 }