public GeneratorPrzestrzeni(int rozmiarMapyX, int rozmiarMapyY, GeneratorPolaczenSamochodow generatorPolaczen) { this.rozmiarMapyX = rozmiarMapyX * 2; this.rozmiarMapyY = rozmiarMapyY * 2; Mapa = new TypPrzestrzeni[this.rozmiarMapyX, this.rozmiarMapyY]; OdwzorujDroge(generatorPolaczen); GenerujChodniki(); GenerujBudynki(); }
public GeneratorPoziomu(Canvas rodzicObrazkow, int szerokosc, int wysokosc, int liczbaWejsc) { generatorPolaczen = new GeneratorPolaczenSamochodow(szerokosc, wysokosc, liczbaWejsc); GeneratorZnakowPoziomych generatorPasow = new GeneratorZnakowPoziomych(generatorPolaczen); GeneratorPrzestrzeni generatorBudynkow = new GeneratorPrzestrzeni(szerokosc, wysokosc, generatorPolaczen); generatorPolaczenPieszych = new GeneratorPolaczenPieszych(szerokosc, wysokosc, generatorPolaczen, generatorBudynkow); RysujDrogi(); RysujBudynki(generatorBudynkow); RysujMape(generatorBudynkow); //RysujKonturChodnika(); RysujPasy(generatorPasow); }
/// <summary> /// Przenoszenie na mapę drogi z generatoraPołączeń /// </summary> private void OdwzorujDroge(GeneratorPolaczenSamochodow generatorPolaczen) { foreach (WierzcholekDrogi wierzcholek in generatorPolaczen.WierzcholkiDrog) { Punkt <int> punkt = (Punkt <int>)wierzcholek.Pozycja; if (wierzcholek.TypWierzcholka != TypWierzcholkaSamochodow.PunktWejscia) { Mapa[punkt.X * 2, punkt.Y * 2] = TypPrzestrzeni.Droga; Mapa[punkt.X * 2 + 1, punkt.Y * 2] = TypPrzestrzeni.Droga; Mapa[punkt.X * 2, punkt.Y * 2 + 1] = TypPrzestrzeni.Droga; Mapa[punkt.X * 2 + 1, punkt.Y * 2 + 1] = TypPrzestrzeni.Droga; } } }
private void GenerujPasyZWierzcholkow(GeneratorPolaczenSamochodow generatorPolaczen) { foreach (WierzcholekDrogi wierzcholek in generatorPolaczen.WierzcholkiDrog) { if (wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.Pasy) { if (wierzcholek.CzyJestDrogaWDol() && wierzcholek.CzyJestDrogaWGore()) { ZnakiPoziome.Add(new ZnakPoziomy(TypPasow.PrzejsciePieszychPoziome, new Punkt <double>(wierzcholek.Pozycja.X * 80, wierzcholek.Pozycja.Y * 80))); } else { ZnakiPoziome.Add(new ZnakPoziomy(TypPasow.PrzejsciePieszychPionowe, new Punkt <double>(wierzcholek.Pozycja.X * 80, wierzcholek.Pozycja.Y * 80))); } } else if (wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.Zakret) { if (wierzcholek.CzyJestDrogaWDol() && wierzcholek.CzyJestDrogaWPrawo()) { ZnakiPoziome.Add(new ZnakPoziomy(TypPasow.ZakretDolPrawo, new Punkt <double>(wierzcholek.Pozycja.X * 80, wierzcholek.Pozycja.Y * 80))); } else if (wierzcholek.CzyJestDrogaWDol() && wierzcholek.CzyJestDrogaWLewo()) { ZnakiPoziome.Add(new ZnakPoziomy(TypPasow.ZakretDolLewo, new Punkt <double>(wierzcholek.Pozycja.X * 80, wierzcholek.Pozycja.Y * 80))); } else if (wierzcholek.CzyJestDrogaWGore() && wierzcholek.CzyJestDrogaWPrawo()) { ZnakiPoziome.Add(new ZnakPoziomy(TypPasow.ZakretGoraPrawo, new Punkt <double>(wierzcholek.Pozycja.X * 80, wierzcholek.Pozycja.Y * 80))); } else if (wierzcholek.CzyJestDrogaWGore() && wierzcholek.CzyJestDrogaWLewo()) { ZnakiPoziome.Add(new ZnakPoziomy(TypPasow.ZakretGoraLewo, new Punkt <double>(wierzcholek.Pozycja.X * 80, wierzcholek.Pozycja.Y * 80))); } } else if (wierzcholek.TypWierzcholka == TypWierzcholkaSamochodow.Droga) { if (wierzcholek.CzyJestDrogaWDol() && wierzcholek.CzyJestDrogaWGore()) { ZnakiPoziome.Add(new ZnakPoziomy(TypPasow.LiniaPrzerywanaPionowa, new Punkt <double>(wierzcholek.Pozycja.X * 80 + 38, wierzcholek.Pozycja.Y * 80))); } else { ZnakiPoziome.Add(new ZnakPoziomy(TypPasow.LiniaPrzerywanaPozioma, new Punkt <double>(wierzcholek.Pozycja.X * 80, wierzcholek.Pozycja.Y * 80 + 38))); } } } }
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> /// 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)); } } }
public GeneratorZnakowPoziomych(GeneratorPolaczenSamochodow generatorPolaczen) { GenerujPasyZWierzcholkow(generatorPolaczen); }