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 GeneratorPolaczenPieszych(int rozmiarMapyX, int rozmiarMapyY, GeneratorPolaczenSamochodow generatorPolaczen, GeneratorPrzestrzeni generatorBudynkow) { GRANICA_DOLNA = rozmiarMapyY * 2 - 1; GRANICA_PRAWA = rozmiarMapyX * 2 - 1; WierzcholkiChodnikow = generatorBudynkow.WierzcholkiChodnikow; Chodniki = generatorBudynkow.Chodniki; OdwzorujChodnikiZDrog(generatorPolaczen); LaczChodniki(); RedukujPolaczenia(); OznaczPunktyWejscia(); PrzeszukiwanieDFS przeszukiwanieDFS = new PrzeszukiwanieDFS(WierzcholkiChodnikow.ConvertAll(o => (WierzcholekGrafu)o)); if (!przeszukiwanieDFS.CzyGrafSpojny()) { throw new Exception("Graf połączeń pieszych nie spójny"); } }
/// <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); }