Esempio n. 1
0
        public List<CestyGraf.Hrana> NactiHrany(ref CestyGraf graf)
        {
            List<CestyGraf.Hrana> cesty = new List<CestyGraf.Hrana>();
            if (sr.BaseStream.Length == 0) {
                return cesty;
            }
            sr.BaseStream.Seek(0, SeekOrigin.Begin);

            int pocet = int.Parse(sr.ReadLine());
            string[] pom = null;
            for (int i = 0; i < pocet; i++) {
                pom = null;
                pom = sr.ReadLine().Split(';');
                CestyGraf.Hrana c = new CestyGraf.Hrana() {
                    Data = pom[0],
                    //Data = string.Format("{0}{1}", Konstanty.ABECEDA[i / Konstanty.ABECEDA.Length], Konstanty.ABECEDA[i % Konstanty.ABECEDA.Length]),
                    //Vrchol1 = graf.DejVrchol(pom[0]),
                    //Vrchol2 = graf.DejVrchol(pom[1]),

                    Vrchol1 = graf.DejVrchol(double.Parse(pom[1], Konstanty.CULTUREINFO), double.Parse(pom[2], Konstanty.CULTUREINFO)),
                    Vrchol2 = graf.DejVrchol(double.Parse(pom[3], Konstanty.CULTUREINFO), double.Parse(pom[4], Konstanty.CULTUREINFO)),
                    Metrika = double.Parse(pom[5], Konstanty.CULTUREINFO),
                    Sjizdna = bool.Parse(pom[6])

                    /*Data = string.Format("{0}{1}", Konstanty.ABECEDA[i / Konstanty.ABECEDA.Length], Konstanty.ABECEDA[i % Konstanty.ABECEDA.Length]),
                    Vrchol1 = new Point(int.Parse(pom[0]), int.Parse(pom[1])),
                    Vrchol2 = new Point(int.Parse(pom[2]), int.Parse(pom[3])),
                    Metrika = int.Parse(pom[4]),
                    Sjizdna = true
                     */
                };
                cesty.Add(c);
            }
            return cesty;
        }
Esempio n. 2
0
 public static double VypocitejVzdalenost(CestyGraf.Vrchol pocatek, CestyGraf.Vrchol konec)
 {
     double d2r = Math.PI / 180.0;
     double dlong = ((konec.Souradnice.X - pocatek.Souradnice.X)) * d2r;
     double dlat = ((konec.Souradnice.Y - pocatek.Souradnice.Y)) * d2r;
     double a = Math.Pow(Math.Sin(dlat / 2.0), 2) + Math.Cos(pocatek.Souradnice.Y * d2r) * Math.Cos(konec.Souradnice.Y * d2r) * Math.Pow(Math.Sin(dlong / 2.0), 2);
     double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
     double d = 6367 * c;
     return Math.Round(d, 2);
 }
Esempio n. 3
0
 public VyhledejBodove(List<CestyGraf.Vrchol> mesta, CestyGraf.Vrchol v)
     : this(mesta)
 {
     if (mesta.Contains(v)) {
             comboBoxMesta.SelectedItem = v;
         } else {
             textBoxX.Text = v.Souradnice.X.ToString();
             textBoxY.Text = v.Souradnice.Y.ToString();
         }
 }
Esempio n. 4
0
        public MestoPridejDialog(CestyGraf.Vrchol vrchol)
            : this()
        {
            Mesto = vrchol;

            if (Mesto != null) {
                textBoxNazev.Text = Mesto.Data;
                if (Mesto.Souradnice != null) {
                    textBoxX.Text = Mesto.Souradnice.X.ToString();
                    textBoxY.Text = Mesto.Souradnice.Y.ToString();
                }
            }
        }
Esempio n. 5
0
        public static LinkedList<CestyGraf.Hrana> doDijkstra(CestyGraf graf, Auto startPozice, CestyGraf.Hrana cil)
        {
            int pocetProhledanych = 0;
            Stopwatch stopky = new Stopwatch();
            stopky.Start();
            double vzdalenost = 0; ;
            LinkedList<CestyGraf.Hrana> cilovaCesta = new LinkedList<CestyGraf.Hrana>();
            DVrchol cilPosledni = new DVrchol();

            PriorityQueue<double, DVrchol, CestyGraf.IBod> otevrene = new PriorityQueue<double, DVrchol, CestyGraf.IBod>(graf.CountVrcholy());
            Dictionary<CestyGraf.IBod, DVrchol> uzavrene = new Dictionary<CestyGraf.IBod, DVrchol>(graf.CountVrcholy());

            DVrchol zkoumany = new DVrchol();
            otevrene.Enqueue(startPozice.VzdalenostOdV1, new DVrchol(startPozice.HranaPoloha.Vrchol1 as CestyGraf.Vrchol, null, startPozice.HranaPoloha, startPozice.VzdalenostOdV1), startPozice.HranaPoloha.Vrchol1.Souradnice);
            otevrene.Enqueue(startPozice.VzdalenostOdV2, new DVrchol(startPozice.HranaPoloha.Vrchol2 as CestyGraf.Vrchol, null, startPozice.HranaPoloha, startPozice.VzdalenostOdV2), startPozice.HranaPoloha.Vrchol2.Souradnice);

            while (otevrene.Count != 0) {
                zkoumany = otevrene.Dequeue().Value;
                if (uzavrene.ContainsKey(zkoumany.Data.Souradnice)) {
                    if (uzavrene[zkoumany.Data.Souradnice].MetrikaOdStartu < zkoumany.MetrikaOdStartu) {
                        // zahození horší cesty (zlepšilo o několik % procházení - méně procházených cest)
                        continue;
                    } else { // pokud by náhodou nastalo, odebrat starý vrchol (kvůli jedinečnosti): O(1)
                        uzavrene.Remove(zkoumany.Data.Souradnice);
                    }
                }
                uzavrene.Add(zkoumany.Data.Souradnice, zkoumany);

                if (zkoumany.Data == cil.Vrchol1 || zkoumany.Data == cil.Vrchol2) { // je nalezen cíl
                    if (cilPosledni.Data != null) {
                        if (cilPosledni.MetrikaOdStartu > zkoumany.MetrikaOdStartu) {
                            cilPosledni = zkoumany; // nebude pouze ukazatel, který se neustále mění?
                            Debug.WriteLine("Další výskyt: " + cilPosledni.MetrikaOdStartu + ", vrchol: " + cilPosledni.Data.Data);
                        } else {
                            Debug.WriteLine("Nepoužitý výskyt: " + zkoumany.MetrikaOdStartu + ", vrchol: " + zkoumany.Data.Data);
                        }
                    } else {
                        cilPosledni = zkoumany;
                        Debug.WriteLine("První výskyt: " + cilPosledni.MetrikaOdStartu + ", vrchol: " + cilPosledni.Data.Data);
                        //break; // pokud chceme ukončit po nalezení prvního vrcholu
                    }
                }

                foreach (CestyGraf.Hrana item in zkoumany.Data.DejHrany()) { // z zkoum. pro každou hranu přidat do otevřených koncový bod
                    if (!item.Sjizdna) {
                        continue;
                    }
                    pocetProhledanych++;
                    DVrchol v1 = new DVrchol(item.Vrchol1 as CestyGraf.Vrchol, zkoumany, item, zkoumany.MetrikaOdStartu + item.Metrika);
                    DVrchol v2 = new DVrchol(item.Vrchol2 as CestyGraf.Vrchol, zkoumany, item, zkoumany.MetrikaOdStartu + item.Metrika);

                    if (zkoumany.Data.Equals(item.Vrchol1)) {
                        otevrene.Enqueue(v2.MetrikaOdStartu, v2, v2.Data.Souradnice);
                    } else {
                        otevrene.Enqueue(v1.MetrikaOdStartu, v1, v1.Data.Souradnice);
                    }
                }
            }
            Debug.WriteLine("Poslední výskyt: " + cilPosledni.MetrikaOdStartu + ", vrchol: " + cilPosledni.Data.Data);
            while (cilPosledni.Predchudce != null) {
                vzdalenost += cilPosledni.SilniceDoPredchudce.Metrika;
                cilovaCesta.AddFirst(cilPosledni.SilniceDoPredchudce);
                cilPosledni = cilPosledni.Predchudce;
            }
            CestyGraf.Hrana hrStart = new CestyGraf.Hrana(null, startPozice.DejPolohu(), cilPosledni.Data, 0, true);

            cilovaCesta.AddFirst(hrStart);
            stopky.Stop();
            Debug.WriteLine("Milisekund: " + stopky.ElapsedMilliseconds + ", Tiků: " + stopky.ElapsedTicks + ", Prohledaných stavů celkem: " + pocetProhledanych);
            return cilovaCesta;
        }
Esempio n. 6
0
 public DVrchol(CestyGraf.Vrchol data, DVrchol predchudce, CestyGraf.Hrana silnice, double metrikaOdStartu)
     : this(data, predchudce, silnice)
 {
     this.MetrikaOdStartu = metrikaOdStartu;
 }
Esempio n. 7
0
 public DVrchol(CestyGraf.Vrchol data, DVrchol predchudce, CestyGraf.Hrana silnice)
     : this(data, predchudce)
 {
     SilniceDoPredchudce = silnice;
 }
Esempio n. 8
0
 public DVrchol(CestyGraf.Vrchol data, DVrchol predchudce)
     : this(data)
 {
     Predchudce = predchudce;
 }
Esempio n. 9
0
 public DVrchol(CestyGraf.Vrchol data)
     : this()
 {
     Data = data;
 }