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; }
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); }
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(); } }
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(); } } }
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; }
public DVrchol(CestyGraf.Vrchol data, DVrchol predchudce, CestyGraf.Hrana silnice, double metrikaOdStartu) : this(data, predchudce, silnice) { this.MetrikaOdStartu = metrikaOdStartu; }
public DVrchol(CestyGraf.Vrchol data, DVrchol predchudce, CestyGraf.Hrana silnice) : this(data, predchudce) { SilniceDoPredchudce = silnice; }
public DVrchol(CestyGraf.Vrchol data, DVrchol predchudce) : this(data) { Predchudce = predchudce; }
public DVrchol(CestyGraf.Vrchol data) : this() { Data = data; }