/// <summary> /// Przekształca połączenia drogowe na wierzchołki /// </summary> private void ZamienDrogiNaWierzcholki() { List <KrawedzGrafu> tymczasowaLista = drogi.ToList(); foreach (KrawedzGrafu droga in tymczasowaLista) { WierzcholekDrogi pierwszy = (WierzcholekDrogi)droga.WierzcholekA; for (int i = 0; i < droga.DlugoscKrawedzi(); ++i) { Punkt <double> punkt; if (droga.ZwrocRelacje() == Relacja.Pionowe) { punkt = new Punkt <double>(pierwszy.Pozycja.X, pierwszy.Pozycja.Y + 1); } else { punkt = new Punkt <double>(pierwszy.Pozycja.X + 1, pierwszy.Pozycja.Y); } WierzcholekDrogi kolejny = DodajLubZnajdzWierzcholek(punkt, TypWierzcholkaSamochodow.Droga); drogi.Add(KrawedzGrafu.StworzDroge(pierwszy, kolejny)); pierwszy = kolejny; } drogi.Add(KrawedzGrafu.StworzDroge(pierwszy, (WierzcholekDrogi)droga.WierzcholekB)); drogi.Remove(droga.UsunKrawedz()); } }
private bool CzyIstniejeWierzcholekPomiedzy(WierzcholekDrogi wierzcholekA, WierzcholekDrogi wierzcholekB) { Relacja relacja = Punkt <double> .ZwrocRelacje(wierzcholekA.Pozycja, wierzcholekB.Pozycja); Punkt <double> punktMniejszy = Punkt <double> .ZwrocPozycjeMniejszego(wierzcholekA.Pozycja, wierzcholekB.Pozycja); Punkt <double> punktWiekszy = Punkt <double> .ZwrocPozycjeWiekszego(wierzcholekA.Pozycja, wierzcholekB.Pozycja); foreach (WierzcholekDrogi wierzcholek in WierzcholkiDrog) { if (relacja == Relacja.Pionowe && wierzcholekA.Pozycja.X == wierzcholek.Pozycja.X) { if (wierzcholek.Pozycja.Y > punktMniejszy.Y && wierzcholek.Pozycja.Y < punktWiekszy.Y) { return(true); } } else if (relacja == Relacja.Poziome && wierzcholekA.Pozycja.Y == wierzcholek.Pozycja.Y) { if (wierzcholek.Pozycja.X > punktMniejszy.X && wierzcholek.Pozycja.X < punktWiekszy.X) { return(true); } } } return(false); }
/// <summary> /// Wyliczanie przejść dla pieszych /// </summary> private void GenerujPrzejsciaPieszych() { List <KrawedzGrafu> drogiTymczasowe = drogi.ToList(); foreach (KrawedzGrafu droga in drogiTymczasowe) { if (droga.DlugoscKrawedzi() > 1) { Punkt <double> punkt; if (droga.ZwrocRelacje() == Relacja.Pionowe) { punkt = new Punkt <double>(droga.WierzcholekA.Pozycja.X, (int)(droga.DlugoscKrawedzi() / 2) + droga.WierzcholekA.Pozycja.Y); } else { punkt = new Punkt <double>((int)(droga.DlugoscKrawedzi() / 2) + droga.WierzcholekA.Pozycja.X, droga.WierzcholekA.Pozycja.Y); } WierzcholekDrogi wierzcholekA = (WierzcholekDrogi)droga.WierzcholekA; WierzcholekDrogi wierzcholekB = (WierzcholekDrogi)droga.WierzcholekB; WierzcholekDrogi dzielacyWierzcholek = new WierzcholekDrogi(punkt, TypWierzcholkaSamochodow.Pasy); WierzcholkiDrog.Add(dzielacyWierzcholek); drogi.Remove(droga.UsunKrawedz()); drogi.Add(KrawedzGrafu.StworzDroge(wierzcholekA, dzielacyWierzcholek)); drogi.Add(KrawedzGrafu.StworzDroge(dzielacyWierzcholek, wierzcholekB)); } } }
/// <summary> /// łączy skrzyżowania pewne /// </summary> private void LaczSkrzyzowania() { List <WierzcholekDrogi> skrzyzowania = WierzcholkiDrog.FindAll(o => o.TypWierzcholka == TypWierzcholkaSamochodow.Skrzyzowanie); foreach (WierzcholekDrogi wierzcholek in skrzyzowania) { WierzcholekDrogi wlasciwy = null; foreach (WierzcholekDrogi potencjalny in skrzyzowania) { if (wierzcholek != potencjalny && wierzcholek.Krawedzie.Find(o => o.ZwrocPrzeciwnyWierzcholek(wierzcholek) == potencjalny) == null) { if ((wlasciwy == null || Punkt <double> .Odleglosc(wlasciwy.Pozycja, wierzcholek.Pozycja) > Punkt <double> .Odleglosc(potencjalny.Pozycja, wierzcholek.Pozycja)) && Punkt <double> .ZwrocRelacje(wierzcholek.Pozycja, potencjalny.Pozycja) != Relacja.Brak && !CzyIstniejeWierzcholekPomiedzy(wierzcholek, potencjalny)) { wlasciwy = potencjalny; } } } if (wlasciwy != null) { drogi.Add(KrawedzGrafu.StworzDroge(wlasciwy, wierzcholek)); } } }
public void PoruszanieSamochodem() { if (trasa.Count > 0) { if (!czyCzekamNaPozwolenie) { Punkt <double> przesuniecie; if (trasa[0].TypWierzcholka == TypWierzcholkaSamochodow.Skrzyzowanie) { przesuniecie = ((WejscieNaSkrzyzowanie)trasa[0].ObiektDrogi).Przesuniecie(ObecnaPozycja.Pozycja, trasa[1].Pozycja); } else { przesuniecie = trasa[0].ObiektDrogi.Przesuniecie(ObecnaPozycja.Pozycja); } Geometria geometriaPieszyCel = new Geometria(new Punkt <double>(trasa[0].Pozycja.X * 80 + przesuniecie.X, trasa[0].Pozycja.Y * 80 + przesuniecie.Y), new Punkt <double>(ZwrocPozycje().X + obrazek.Width / 2, ZwrocPozycje().Y + obrazek.Height / 2)); if (geometriaPieszyCel.ObliczOdlegloscPomiedzy() >= 2) { UstawPozycje(new Punkt <double>(ZwrocPozycje().X + geometriaPieszyCel.ObliczWektorPrzesuniecia(2).X, ZwrocPozycje().Y + geometriaPieszyCel.ObliczWektorPrzesuniecia(2).Y)); obrazek.RenderTransform = new RotateTransform(geometriaPieszyCel.ObliczKatPomiedzy()); } else { ObecnaPozycja = trasa[0]; trasa.RemoveAt(0); czyCzekamNaPozwolenie = true; } } if (czyCzekamNaPozwolenie && trasa.Count > 0) { Cel = trasa.Count >= 2 ? trasa[1] : null; if (trasa[0].CzyMogeWejsc(this)) { ObecnaPozycja.Wyjdz(this); czyCzekamNaPozwolenie = false; trasa[0].Wejdz(this); } else if (ObecnaPozycja.TypWierzcholka == TypWierzcholkaSamochodow.Skrzyzowanie) { ((WejscieNaSkrzyzowanie)ObecnaPozycja.ObiektDrogi).ZmienPrzecinanieDrogi(this); } } } else { ObecnaPozycja.Wyjdz(this); Dispose(); } }
private WierzcholekDrogi DodajLubZnajdzWierzcholek(Punkt <double> pozycja, TypWierzcholkaSamochodow typWierzcholka = TypWierzcholkaSamochodow.Skrzyzowanie) { WierzcholekDrogi wierzcholek = WierzcholkiDrog.Find(obiekt => obiekt.Pozycja.Equals(pozycja)); if (wierzcholek == null) { WierzcholkiDrog.Add(wierzcholek = new WierzcholekDrogi(pozycja, typWierzcholka)); } return(wierzcholek); }
/// <summary> /// Wyznacza połączenia które są pewnikiem i są podstawą między innymi połączeniami /// </summary> private void GenerujPoloczeniaKonieczne() { Punkt <double> punktGorny = new Punkt <double>(0, rozmiarMapyY / 2); Punkt <double> punktDolny = new Punkt <double>(0, rozmiarMapyY / 2); Punkt <double> punktLewy = new Punkt <double>(rozmiarMapyX / 2, 0); Punkt <double> punktPrawy = new Punkt <double>(rozmiarMapyX / 2, 0); foreach (WierzcholekDrogi wierzcholek in WierzcholkiDrog) { if (wierzcholek.Pozycja.Y < punktGorny.Y && wierzcholek.Pozycja.Y != GRANICA_GORNA) { punktGorny = wierzcholek.Pozycja; } if (wierzcholek.Pozycja.Y > punktDolny.Y && wierzcholek.Pozycja.Y != GRANICA_DOLNA) { punktDolny = wierzcholek.Pozycja; } if (wierzcholek.Pozycja.X > punktPrawy.X && wierzcholek.Pozycja.X != GRANICA_PRAWA) { punktPrawy = wierzcholek.Pozycja; } if (wierzcholek.Pozycja.X < punktLewy.X && wierzcholek.Pozycja.X != GRANICA_LEWA) { punktLewy = wierzcholek.Pozycja; } } List <WierzcholekDrogi> punktyWejscia = WierzcholkiDrog.ToList(); foreach (WierzcholekDrogi wierzcholek in punktyWejscia) { Punkt <double> punktPrzeciecia = new Punkt <double>(0, 0); if (wierzcholek.Pozycja.Y == GRANICA_GORNA) // Góra { punktPrzeciecia = new Punkt <double>(wierzcholek.Pozycja.X, punktGorny.Y); } else if (wierzcholek.Pozycja.X == GRANICA_PRAWA) // Prawa { punktPrzeciecia = new Punkt <double>(punktPrawy.X, wierzcholek.Pozycja.Y); } else if (wierzcholek.Pozycja.Y == GRANICA_DOLNA) // Dół { punktPrzeciecia = new Punkt <double>(wierzcholek.Pozycja.X, punktDolny.Y); } else if (wierzcholek.Pozycja.X == GRANICA_LEWA) // Lewa { punktPrzeciecia = new Punkt <double>(punktLewy.X, wierzcholek.Pozycja.Y); } WierzcholekDrogi nowyWierzcholek = DodajLubZnajdzWierzcholek(punktPrzeciecia); drogi.Add(KrawedzGrafu.StworzDroge(nowyWierzcholek, wierzcholek)); } }
/// <summary> /// Usówa ślepe połączenia, usówa nadmiarowe skrzyżowania, tworzy zakręty /// </summary> private void RedukujPolaczenia() { for (int i = 0; i < WierzcholkiDrog.Count; ++i) { WierzcholekDrogi wierzcholek = WierzcholkiDrog[i]; if (wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.Skrzyzowanie) { if (wierzcholek.Krawedzie.Count == 1) { for (int j = wierzcholek.Krawedzie.Count - 1; j >= 0; --j) { drogi.Remove(wierzcholek.Krawedzie[j].UsunKrawedz()); } WierzcholkiDrog.Remove(wierzcholek); } else if (wierzcholek.Krawedzie.Count == 2) { if (Punkt <double> .ZwrocRelacje(wierzcholek.Krawedzie[0].ZwrocPrzeciwnyWierzcholek(wierzcholek).Pozycja, wierzcholek.Krawedzie[1].ZwrocPrzeciwnyWierzcholek(wierzcholek).Pozycja) == Relacja.Brak) { wierzcholek.TypWierzcholka = TypWierzcholkaSamochodow.Zakret; } else { drogi.Add(KrawedzGrafu.StworzDroge(wierzcholek.Krawedzie[1].ZwrocPrzeciwnyWierzcholek(wierzcholek), wierzcholek.Krawedzie[0].ZwrocPrzeciwnyWierzcholek(wierzcholek))); for (int j = wierzcholek.Krawedzie.Count - 1; j >= 0; --j) { drogi.Remove(wierzcholek.Krawedzie[j].UsunKrawedz() as KrawedzGrafu); } WierzcholkiDrog.Remove(wierzcholek); } } } else if (wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.PunktWejscia) { if (wierzcholek.Krawedzie.Count == 0) { WierzcholkiDrog.Remove(wierzcholek); } } } }