private void TworzPolaczeniaKopiowanychTras(Punkt <double> punktA, Punkt <double> punktB) { WierzcholekChodnika wierzcholekA = DodajLubZnajdzWierzcholek(punktA); WierzcholekChodnika wierzcholekB = DodajLubZnajdzWierzcholek(punktB); Chodniki.Add(KrawedzGrafu.StworzDroge(wierzcholekA, wierzcholekB)); }
private void LaczTraseWWierzcholku(KrawedzGrafu trasa, WierzcholekChodnika laczacyWierzcholek) { WierzcholekChodnika wierzcholekA = (WierzcholekChodnika)trasa.WierzcholekA; WierzcholekChodnika wierzcholekB = (WierzcholekChodnika)trasa.WierzcholekB; Chodniki.Remove(trasa.UsunKrawedz()); Chodniki.Add(KrawedzGrafu.StworzDroge(wierzcholekA, laczacyWierzcholek)); Chodniki.Add(KrawedzGrafu.StworzDroge(laczacyWierzcholek, wierzcholekB)); }
private WierzcholekChodnika DodajLubZnajdzWierzcholek(Punkt <double> pozycja) { WierzcholekChodnika wierzcholek = WierzcholkiChodnikow.Find(obiekt => obiekt.Pozycja.Equals(pozycja)); if (wierzcholek == null) { WierzcholkiChodnikow.Add(wierzcholek = new WierzcholekChodnika(pozycja, TypWierzcholkaPieszych.ChodnikDrogi)); } return(wierzcholek); }
private WierzcholekChodnika DzielTraseWPunkcie(KrawedzGrafu trasa, Punkt <double> punkt) { WierzcholekChodnika wierzcholekA = (WierzcholekChodnika)trasa.WierzcholekA; WierzcholekChodnika wierzcholekB = (WierzcholekChodnika)trasa.WierzcholekB; WierzcholekChodnika dzielacyWierzcholek = new WierzcholekChodnika(punkt, TypWierzcholkaPieszych.ChodnikDrogi); WierzcholkiChodnikow.Add(dzielacyWierzcholek); Chodniki.Remove(trasa.UsunKrawedz()); Chodniki.Add(KrawedzGrafu.StworzDroge(wierzcholekA, dzielacyWierzcholek)); Chodniki.Add(KrawedzGrafu.StworzDroge(dzielacyWierzcholek, wierzcholekB)); return(dzielacyWierzcholek); }
private void ProbujLaczycChodnik(Punkt <double> punkt, WierzcholekChodnika wierzcholek) { WierzcholekChodnika szukanyWierzcholek = WierzcholkiChodnikow.Find(o => o.Pozycja.Equals(punkt)); if (szukanyWierzcholek != null) { Chodniki.Add(KrawedzGrafu.StworzDroge(wierzcholek, szukanyWierzcholek)); } else { KrawedzGrafu szukanaKrawedz = SzukajDrogiPomiedzyPunktem(punkt); if (szukanaKrawedz != null) { szukanyWierzcholek = DzielTraseWPunkcie(szukanaKrawedz, punkt); Chodniki.Add(KrawedzGrafu.StworzDroge(szukanyWierzcholek, wierzcholek)); } } }
public void PoruszaniePostaci() { if (trasa.Count > 0) { if (!czyCzekamNaPozwolenie) { Geometria geometriaPieszyCel = new Geometria(new Punkt <double>(trasa[0].Pozycja.X * 40 + 20, trasa[0].Pozycja.Y * 40 + 20), 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(1.5).X, ZwrocPozycje().Y + geometriaPieszyCel.ObliczWektorPrzesuniecia(1.5).Y)); obrazek.RenderTransform = new RotateTransform(geometriaPieszyCel.ObliczKatPomiedzy()); } else { ObecnaPozycja = trasa[0]; trasa.RemoveAt(0); czyCzekamNaPozwolenie = true; } } if (czyCzekamNaPozwolenie && trasa.Count > 0) { if (trasa[0].CzyMogeWejsc(this)) { ObecnaPozycja.Wyjdz(this); czyCzekamNaPozwolenie = false; trasa[0].Wejdz(this); } } } else { Dispose(); } }
/// <summary> /// Usówa nadmiarowe skrzyżowania /// </summary> private void RedukujPolaczenia() { foreach (WierzcholekChodnika wierzcholek in WierzcholkiChodnikow) { if (wierzcholek.CzyJestDrogaWLewo() && wierzcholek.CzyJestDrogaWPrawo()) { if (!(wierzcholek.CzyJestDrogaWDol() || wierzcholek.CzyJestDrogaWGore())) { WierzcholekChodnika wierzcholekA = (WierzcholekChodnika)wierzcholek.ZwrocKrawedzLewa().ZwrocPrzeciwnyWierzcholek(wierzcholek); WierzcholekChodnika wierzcholekB = (WierzcholekChodnika)wierzcholek.ZwrocKrawedzPrawa().ZwrocPrzeciwnyWierzcholek(wierzcholek); Chodniki.Remove(wierzcholek.ZwrocKrawedzLewa().UsunKrawedz()); Chodniki.Remove(wierzcholek.ZwrocKrawedzPrawa().UsunKrawedz()); Chodniki.Add(KrawedzGrafu.StworzDroge(wierzcholekA, wierzcholekB)); } } if (wierzcholek.CzyJestDrogaWDol() && wierzcholek.CzyJestDrogaWGore()) { if (!(wierzcholek.CzyJestDrogaWLewo() || wierzcholek.CzyJestDrogaWPrawo())) { WierzcholekChodnika wierzcholekA = (WierzcholekChodnika)wierzcholek.ZwrocKrawedzGorna().ZwrocPrzeciwnyWierzcholek(wierzcholek); WierzcholekChodnika wierzcholekB = (WierzcholekChodnika)wierzcholek.ZwrocKrawedzDolna().ZwrocPrzeciwnyWierzcholek(wierzcholek); Chodniki.Remove(wierzcholek.ZwrocKrawedzGorna().UsunKrawedz()); Chodniki.Remove(wierzcholek.ZwrocKrawedzDolna().UsunKrawedz()); Chodniki.Add(KrawedzGrafu.StworzDroge(wierzcholekA, wierzcholekB)); } } } for (int i = WierzcholkiChodnikow.Count - 1; i >= 0; --i) { if (WierzcholkiChodnikow[i].Krawedzie.Count == 0) { WierzcholkiChodnikow.Remove(WierzcholkiChodnikow[i]); } } }
private void BudujChodnik(Punkt <double> punktA, Punkt <double> punktB) { WierzcholekChodnika wierzcholekA; if (punktA.X == 0) { wierzcholekA = new WierzcholekChodnika(new Punkt <double>(punktA.X - 0.5, punktA.Y), TypWierzcholkaPieszych.PunktWejscia); } else if (punktA.Y == 0) { wierzcholekA = new WierzcholekChodnika(new Punkt <double>(punktA.X, punktA.Y - 0.5), TypWierzcholkaPieszych.PunktWejscia); } else { wierzcholekA = new WierzcholekChodnika(punktA, TypWierzcholkaPieszych.ChodnikPrzestrzeni); } WierzcholekChodnika wierzcholekB; if (punktB.X == rozmiarMapyX - 1) { wierzcholekB = new WierzcholekChodnika(new Punkt <double>(punktB.X + 0.5, punktB.Y), TypWierzcholkaPieszych.PunktWejscia); } else if (punktB.Y == rozmiarMapyY - 1) { wierzcholekB = new WierzcholekChodnika(new Punkt <double>(punktB.X, punktB.Y + 0.5), TypWierzcholkaPieszych.PunktWejscia); } else { wierzcholekB = new WierzcholekChodnika(punktB, TypWierzcholkaPieszych.ChodnikPrzestrzeni); } WierzcholkiChodnikow.Add(wierzcholekA); WierzcholkiChodnikow.Add(wierzcholekB); Chodniki.Add(KrawedzGrafu.StworzDroge(wierzcholekA, wierzcholekB)); ZaznaczNaMapie <TypPrzestrzeni>(Mapa, new Prostokat((Punkt <int>)punktA, (Punkt <int>)punktB), TypPrzestrzeni.Chodnik); }
/// <summary> /// Odwzorowuje chodniki z połączeń drogowych /// </summary> private void OdwzorujChodnikiZDrog(GeneratorPolaczenSamochodow generatorPolaczen) { foreach (WierzcholekDrogi wierzcholek in generatorPolaczen.WierzcholkiDrog) { if (!wierzcholek.CzyJestDrogaWGore() && !(wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.PunktWejscia && !wierzcholek.CzyJestDrogaWGore())) { TworzPolaczeniaKopiowanychTras(new Punkt <double>(wierzcholek.Pozycja.X * 2 - 0.5, wierzcholek.Pozycja.Y * 2 - 0.5), new Punkt <double>(wierzcholek.Pozycja.X * 2 + 1.5, wierzcholek.Pozycja.Y * 2 - 0.5)); } if (!wierzcholek.CzyJestDrogaWDol() && !(wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.PunktWejscia && !wierzcholek.CzyJestDrogaWDol())) { TworzPolaczeniaKopiowanychTras(new Punkt <double>(wierzcholek.Pozycja.X * 2 - 0.5, wierzcholek.Pozycja.Y * 2 + 1.5), new Punkt <double>(wierzcholek.Pozycja.X * 2 + 1.5, wierzcholek.Pozycja.Y * 2 + 1.5)); } if (!wierzcholek.CzyJestDrogaWLewo() && !(wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.PunktWejscia && !wierzcholek.CzyJestDrogaWLewo())) { TworzPolaczeniaKopiowanychTras(new Punkt <double>(wierzcholek.Pozycja.X * 2 - 0.5, wierzcholek.Pozycja.Y * 2 - 0.5), new Punkt <double>(wierzcholek.Pozycja.X * 2 - 0.5, wierzcholek.Pozycja.Y * 2 + 1.5)); } if (!wierzcholek.CzyJestDrogaWPrawo() && !(wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.PunktWejscia && !wierzcholek.CzyJestDrogaWPrawo())) { TworzPolaczeniaKopiowanychTras(new Punkt <double>(wierzcholek.Pozycja.X * 2 + 1.5, wierzcholek.Pozycja.Y * 2 - 0.5), new Punkt <double>(wierzcholek.Pozycja.X * 2 + 1.5, wierzcholek.Pozycja.Y * 2 + 1.5)); } if (wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.Pasy) { WierzcholekChodnika wierzcholekA = null; WierzcholekChodnika wierzcholekB = null; if (wierzcholek.CzyJestDrogaWDol() && wierzcholek.CzyJestDrogaWGore()) { wierzcholekA = DodajLubZnajdzWierzcholek(new Punkt <double>(wierzcholek.Pozycja.X * 2 - 0.5, wierzcholek.Pozycja.Y * 2 + 0.5)); wierzcholekB = DodajLubZnajdzWierzcholek(new Punkt <double>(wierzcholek.Pozycja.X * 2 + 1.5, wierzcholek.Pozycja.Y * 2 + 0.5)); wierzcholekA.UstawObiektWejscia(((WejscieNaPasy)wierzcholek.ObiektDrogi).PrzejscieDlaPieszych, wierzcholekB); wierzcholekB.UstawObiektWejscia(((WejscieNaPasy)wierzcholek.ObiektDrogi).PrzejscieDlaPieszych, wierzcholekA); } else if (wierzcholek.CzyJestDrogaWPrawo() && wierzcholek.CzyJestDrogaWLewo()) { wierzcholekA = DodajLubZnajdzWierzcholek(new Punkt <double>(wierzcholek.Pozycja.X * 2 + 0.5, wierzcholek.Pozycja.Y * 2 - 0.5)); wierzcholekB = DodajLubZnajdzWierzcholek(new Punkt <double>(wierzcholek.Pozycja.X * 2 + 0.5, wierzcholek.Pozycja.Y * 2 + 1.5)); wierzcholekA.UstawObiektWejscia(((WejscieNaPasy)wierzcholek.ObiektDrogi).PrzejscieDlaPieszych, wierzcholekB); wierzcholekB.UstawObiektWejscia(((WejscieNaPasy)wierzcholek.ObiektDrogi).PrzejscieDlaPieszych, wierzcholekA); } wierzcholekA.TypWierzcholka = TypWierzcholkaPieszych.Pasy; wierzcholekB.TypWierzcholka = TypWierzcholkaPieszych.Pasy; KrawedzGrafu krawedzA = SzukajDrogiPomiedzyPunktem(wierzcholekA.Pozycja); LaczTraseWWierzcholku(krawedzA, wierzcholekA); KrawedzGrafu krawedzB = SzukajDrogiPomiedzyPunktem(wierzcholekB.Pozycja); LaczTraseWWierzcholku(krawedzB, wierzcholekB); Chodniki.Add(KrawedzGrafu.StworzDroge(wierzcholekA, wierzcholekB)); } } }