public Punkt <double> Przesuniecie(Punkt <double> punkt) { if (Punkt <double> .ZwrocRelacje(punkt, pozycja) == Relacja.Pionowe) { if (punkt.Y > pozycja.Y) { return(new Punkt <double>(60, 40)); } else { return(new Punkt <double>(20, 40)); } } else { if (punkt.X > pozycja.X) { return(new Punkt <double>(40, 20)); } else { return(new Punkt <double>(40, 60)); } } }
public void Wejdz(Samochod samochod) { PrzejscieDlaPieszych.Wjedz(samochod); if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Pionowe) { if (samochod.ObecnaPozycja.Pozycja.Y > pozycja.Y) { lewyPojazd = samochod; } else { prawyPojazd = samochod; } } else if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Poziome) { if (samochod.ObecnaPozycja.Pozycja.X > pozycja.X) { prawyPojazd = samochod; } else { lewyPojazd = samochod; } } else { throw new Exception("Niepoprawny obiekt na wejściu"); } }
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> /// łą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 Wejdz(Samochod samochod) { if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Pionowe) { if (samochod.ObecnaPozycja.Pozycja.Y > pozycja.Y) { lewyPojazd = samochod; } else { prawyPojazd = samochod; } } else if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Poziome) { if (samochod.ObecnaPozycja.Pozycja.X > pozycja.X) { prawyPojazd = samochod; } else if (samochod == prawyPojazd) { lewyPojazd = samochod; } } else { throw new Exception("Nieprawidłowy obiekt na wejściu"); } }
public bool CzyMogeWejsc(Samochod samochod) { if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Pionowe) { if (samochod.ObecnaPozycja.Pozycja.Y > pozycja.Y) { return(lewyPojazd == null); } else { return(prawyPojazd == null); } } else if (Punkt <double> .ZwrocRelacje(samochod.ObecnaPozycja.Pozycja, pozycja) == Relacja.Poziome) { if (samochod.ObecnaPozycja.Pozycja.X > pozycja.X) { return(prawyPojazd == null); } else { return(lewyPojazd == null); } } else { throw new Exception("Nieprawidłowy obiekt na wejściu"); } }
/// <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); } } } }