/// <summary> /// Obsluhuje udalost kliku na bod v mape (zastavka, odpocivadlo nebo krizovatka). /// Vyuziva se na urceni pocatecniho a koncoveho vrcholu pro vyhledavani nejkratsi trasy v mape /// nebo pro pridani nove cesty do mapy. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void OnEllipseMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var dot = (Ellipse)sender; string klicVrcholu = dot.Name.Replace("_", " "); DataVrcholu hledanyVrcholvMape = mapa.NajdiVrcholSemA(klicVrcholu); if (hledanyVrcholvMape != null) { if (urcenPocatecniBod) { pocatek = hledanyVrcholvMape; urcenPocatecniBod = false; urcenKonecnyBod = true; //sdelim ye obsah v Label1 je typu textblock a tim dosahnu zalamovani textu vLabel1 NastavTextLabelu("Pocateční bod je " + pocatek.ToString() + ".\n Vyber cíl."); } else if (urcenKonecnyBod) { konec = hledanyVrcholvMape; urcenKonecnyBod = false; NastavTextLabelu("Pocatecni bod je: " + pocatek.ToString() + ".\n" + "Konečný bod je: " + konec.ToString() + ". Hledám nejkratší cestu..."); Cesta cesta = mapa.NajdiCestu(pocatek.NazevVrcholu, konec.NazevVrcholu); if (cesta == null) { NastavTextLabelu("Cestu se nepodařilo nalézt."); return; } string vypisCesty = "Počáteční bod je " + pocatek.ToString() + ". \n" + "Konecny bod je " + konec.ToString() + ". \n"; foreach (DataHran h in cesta.NavstiveneHrany) { h.OznaceniHrany = true; vypisCesty += "(" + h.PocatekHrany + ", " + h.KonecHrany + "), "; } VykresliMapu(); NastavTextLabelu(vypisCesty); } // pro ulozeni pocatecniho vrcholu cesty, vytvoreni a vykresleni hrany else if (stisknutoVytvorCestu) { if (pocatek == null) { pocatek = hledanyVrcholvMape; NastavTextLabelu("Vyberte konečný bod."); } else { konec = hledanyVrcholvMape; DataHran novaHrana = mapa.VytvorHranu(pocatek.NazevVrcholu, konec.NazevVrcholu, (short)SpocitejDelkuHrany(pocatek, konec)); KresliSilnici(novaHrana); stisknutoVytvorCestu = false; NastavTextLabelu("Cesta byla vytvořena."); } } } }
/// <summary> /// Vykresluje 1 cestu na mapě. /// </summary> /// <param name="lesniStezka">nese <c>DataHran<c> potřebné k vytvoření hrany</param> private void KresliSilnici(DataHran lesniStezka) { //default je hyr Brush barvaStezky = Brushes.Beige; if (lesniStezka.OznaceniHrany) { barvaStezky = Brushes.Black; } else if (!lesniStezka.JeFunkcniCesta) { barvaStezky = Brushes.DarkGray; } DataVrcholu pocatekHrany = mapa.NajdiVrcholSemA(lesniStezka.PocatekHrany); DataVrcholu konecHrany = mapa.NajdiVrcholSemA(lesniStezka.KonecHrany); Line myline = new Line { // Name = String.Format("{0}__{1}", lesniStezka.PocatekHrany, lesniStezka.KonecHrany), Stroke = barvaStezky, StrokeThickness = 10, X1 = pocatekHrany.XSouradniceVrcholu + 4, Y1 = pocatekHrany.YSouradniceVrcholu + 4, X2 = konecHrany.XSouradniceVrcholu + 4, Y2 = konecHrany.YSouradniceVrcholu + 4 }; myline.Opacity = 0.9; myline.MouseLeftButtonDown += OnLineMouseLeftButtonDown; canvasElem.Children.Add(myline); float xLabel = pocatekHrany.XSouradniceVrcholu + (konecHrany.XSouradniceVrcholu - pocatekHrany.XSouradniceVrcholu) * 1 / 2; float yLabel = pocatekHrany.YSouradniceVrcholu + (konecHrany.YSouradniceVrcholu - pocatekHrany.YSouradniceVrcholu) * 1 / 2; TextBlock TB = new TextBlock(); TB.Text = $"{lesniStezka.DelkaHrany} min"; BitmapCacheBrush bcb = new BitmapCacheBrush(TB); TB.Margin = new Thickness(xLabel - 10, yLabel + 5, 0, 0); TB.FontSize = 10; Canvas.SetZIndex(TB, 20); canvasElem.Children.Add(TB); //if (lesniStezka.JeFunkcniCesta == false) //{ // Ellipse currentDot = new Ellipse(); // currentDot.Stroke = new SolidColorBrush(Colors.Red); // currentDot.StrokeThickness = 1; // Canvas.SetZIndex(currentDot, 10); // currentDot.Height = 10; // currentDot.Width = 10; // currentDot.Fill = new SolidColorBrush(Colors.Red); // currentDot.Margin = new Thickness(xLabel, yLabel, 0, 0); // canvasElem.Children.Add(currentDot); //} }
/// <summary> /// Zahajuje přidávání nové cesty /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void PridejCestuButton_Click(object sender, RoutedEventArgs e) { ResetujAkce(); // nastaveni pomocne promene na true v if else v metode OnEllipseMouseLeftButtonDow stisknutoVytvorCestu = true; pocatek = null; konec = null; NastavTextLabelu("Vyberte počáteční bod."); // ((TextBlock)label1.Content).Text = "Vyberte počáteční bod."; }
/// <summary> /// Vyresetuje uzivatelske rozhrani do zakladniho stavu. /// </summary> private void ResetujAkce() { SmazNalezenouCestu(); SkrytPrvkyVytvorBod(); urcenPocatecniBod = false; urcenKonecnyBod = false; stisknutoVytvorVrchol = false; stisknutoVytvorCestu = false; pocatek = null; konec = null; }
/// <summary> /// Vypočítá vzdálenost bodů dvou vrcholů. /// </summary> /// <param name="zacatekHrany">Počátecní bod hrany</param> /// <param name="konecHrany">Konečný bod hrany</param> /// <returns>Délku hrany ve formátu double.</returns> private double SpocitejDelkuHrany(DataVrcholu zacatekHrany, DataVrcholu konecHrany) { double delkaHrany = 0; double xa = zacatekHrany.XSouradniceVrcholu; double ya = zacatekHrany.YSouradniceVrcholu; double xb = konecHrany.XSouradniceVrcholu; double yb = konecHrany.YSouradniceVrcholu; //(int)Math.Round(Sqrt) delkaHrany = Math.Abs(Math.Sqrt(((xb - xa) * (xb - xa)) + ((yb - ya) * (yb - ya)))); return(delkaHrany); }
private void OdeberKlicButton_Click(object sender, RoutedEventArgs e) { string klic = NazevKliceTextBox.Text; try { DataVrcholu odebiranyVrchol = mapa.OdeberVrcholSemC(klic); NastavTextLabelu("Byl odebrán klíč: " + odebiranyVrchol.NazevVrcholu); } catch (Exception ex) { NastavTextLabelu(ex.Message); } }
private void ZobrazVysledekHledanidoLabelu1(DataVrcholu dv) { int pocetBloku = mapa.VratPocetBlokuVSouboru(); List <int> prosleBloky = mapa.VratPocetProjitychBloku(); string zprava = "Počet navštívených bloků: " + prosleBloky.Count + "\n Počet bloků v souboru:" + pocetBloku; zprava += "\n Navštívené bloky: "; foreach (int b in prosleBloky) { zprava += b + ", "; } zprava += "\n Nalezen klíč: " + dv.NazevVrcholu; NastavTextLabelu(zprava); }
private void HledejKlicInterpolacne_Click(object sender, RoutedEventArgs e) { string klic = NazevKliceTextBox.Text; try { DataVrcholu hledanyVrchol = mapa.NajdiVrcholSemC(klic, ZpusobVyhledvani.Interpolacni); ZobrazVysledekHledanidoLabelu1(hledanyVrchol); } catch (Exception ex) { NastavTextLabelu(ex.Message); } }
/// <summary> /// Obsluhuje tlačítko ANO. V případě zadání všech potřebných parametrů vykreslí daný bod a oznámí hototvo. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ANO_Button_Click(object sender, RoutedEventArgs e) { try { TypyVrcholu typVrcholu = (TypyVrcholu)TypVrcholu_comboBox.SelectedIndex; string nazevVrcholu = nazevVrcholuTextBox.Text; DataVrcholu pridanyVrchol = mapa.VlozVrchol((int)gBod.X, (int)gBod.Y, typVrcholu, nazevVrcholu); VykresliObec(pridanyVrchol); SkrytPrvkyVytvorBod(); NastavTextLabelu("Hotovo, vypadá to, že máme nový bod."); } catch (Exception ex) { NastavTextLabelu("Nastala chyba: " + ex.Message); } }
/// <summary> /// Vykresluje vrcholy/body/mista na mapě. /// </summary> /// <param name="vrchol"></param> private void VykresliObec(DataVrcholu vrchol) { Ellipse teckaNaVrcholu = new Ellipse(); teckaNaVrcholu.Name = vrchol.NazevVrcholu.Replace(" ", "_"); if (vrchol.TypVrcholu == TypyVrcholu.odpocivadlo) { teckaNaVrcholu.Stroke = new SolidColorBrush(Colors.DarkBlue); teckaNaVrcholu.StrokeThickness = 10; teckaNaVrcholu.Height = 15; teckaNaVrcholu.Width = 20; } else if (vrchol.TypVrcholu == TypyVrcholu.zastavka) { teckaNaVrcholu.Stroke = new SolidColorBrush(Colors.Cyan); teckaNaVrcholu.StrokeThickness = 10; teckaNaVrcholu.Height = 12; teckaNaVrcholu.Width = 12; } else if (vrchol.TypVrcholu == TypyVrcholu.None) { teckaNaVrcholu.Stroke = new SolidColorBrush(Colors.Brown); teckaNaVrcholu.StrokeThickness = 8; teckaNaVrcholu.Height = 10; teckaNaVrcholu.Width = 10; } Canvas.SetZIndex(teckaNaVrcholu, 3); teckaNaVrcholu.Margin = new Thickness(vrchol.XSouradniceVrcholu, vrchol.YSouradniceVrcholu, 0, 0); //DELEGAT tu se zaregistruje funkce OnElipse.. na jako event handler na akci MouseLeft.. - DELEGAT teckaNaVrcholu.MouseLeftButtonDown += OnEllipseMouseLeftButtonDown; TextBlock TB = new TextBlock(); TB.Text = vrchol.NazevVrcholu; BitmapCacheBrush bcb = new BitmapCacheBrush(TB); TB.Margin = new Thickness(vrchol.XSouradniceVrcholu - 15, vrchol.YSouradniceVrcholu + 10, 0, 0); TB.FontSize = 10; Canvas.SetZIndex(TB, 20); canvasElem.Children.Add(TB); canvasElem.Children.Add(teckaNaVrcholu); }
void OnLineMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { var line = (Line)sender; string[] kliceVrcholu = line.Name.Split("|"); float xZ = (float)((line.X1 - 4)); float yZ = (float)((line.Y1 - 4)); float xDo = (float)((line.X2 - 4)); float yDo = (float)((line.Y2 - 4)); // vrchol Z jako zacatek DataVrcholu vrhcholZ = mapa.NajdiVrcholSemA(kliceVrcholu[0]); if (vrhcholZ != null) { // DataHran silnice = (DataHran)(from item in vrhcholZ.ListHran where item.KonecHrany.XSouradniceVrcholu.Equals(xDo) && item.KonecHrany.YSouradniceVrcholu.Equals(yDo) select item).First(); } }