/// <summary> /// Generovanie hernej plochy. Keοe povnina na hernej ploche mα reprezentova ostrov, /// tak sa vyuνva okrem inιho aj rovnica elipsy /// </summary> private void GenerujPlochu() { Poloha pol = null; int stredovyRiadok = PocetRiadkov / 2; int stredovyStlpec = PocetStlpcov / 2; int polomerRiadkov = stredovyRiadok - 3; int polomerStlpcov = stredovyStlpec - 3; for (int riadok = 0; riadok < PocetRiadkov; riadok++) { for (int stlpec = 0; stlpec < PocetStlpcov; stlpec++) { pol = new Poloha(riadok, stlpec); if (Math.Pow((double)(riadok - stredovyRiadok) / (double)polomerRiadkov, 2) + Math.Pow((double)(stlpec - stredovyStlpec) / (double)polomerStlpcov, 2) <= 1) { aMatica[riadok, stlpec] = new Policko(pol, true); } else { aMatica[riadok, stlpec] = new Policko(pol, false); } } } }
/// <summary> /// Ak sa v okolн stanice nachбdza nejakб eЪte nezaradenб vэroba, tak sa zaradн /// </summary> /// <param name="paStavana">stavanб stanica</param> /// <param name="paRozmerRiadkov">rozmer</param> /// <param name="paRozmerStlpcov">rozmer</param> private void OverOkolieStaniceVyroba(Stanica paStavana, int paRozmerRiadkov, int paRozmerStlpcov) { int zacRiad = aPoloha.Riadok - 1; int zacStlp = aPoloha.Stlpec - 1; int konRiad = aPoloha.Riadok + paRozmerRiadkov; int konStlp = aPoloha.Stlpec + paRozmerStlpcov; Hra hra = Hra.DajInstanciu(); Policko[,] matica = hra.DajHernuPlochu().DajMaticu(); ZoskupenieStanic zosk = paStavana.Zoskupenie; for (int riadok = zacRiad; riadok <= konRiad; riadok++) { for (int stlpec = zacStlp; stlpec <= konStlp; stlpec++) { Policko aktualne = matica[riadok, stlpec]; if (aktualne.Vyroba != null) { if (aktualne.Vyroba.Zoskupenie == null) { aktualne.Vyroba.Zoskupenie = zosk; zosk.PridajVyrobu(aktualne.Vyroba); } } } } }
/// <summary> /// Napojenie hrany na u existujϊcu hranu /// </summary> /// <param name="paPolicko">policko</param> /// <param name="paPolickoVedlajsie">susedne policko</param> private void PosunHranu(Policko paPolicko, Policko paPolickoVedlajsie) { Hrana hr = paPolickoVedlajsie.Hrana; paPolicko.Hrana = hr; paPolicko.Vrchol = null; hr.PridajPolicko(paPolicko); }
/// <summary> /// Vytvαranie hrany ak sa vedΎa nachαdza vrchol /// </summary> /// <param name="paPolicko">policko</param> /// <param name="paPolickoVedlajsie">susedne policko</param> private void VytvorNovuHranu(Policko paPolicko, Policko paPolickoVedlajsie) { Hrana hr = new Hrana(); paPolicko.Hrana = hr; paPolicko.Vrchol = null; hr.PridajPolicko(paPolicko); hr.Vrchol1 = paPolickoVedlajsie.Vrchol; aZoznamHran.Add(hr); }
/// <summary> /// Overenie okolia zoskupenia, rozhoduje иi pridaЭ stanicu uЮ ku existujъcemu zoskupenium /// alebo иi vytvori novй. /// </summary> /// <param name="paStavana">stavanб stanica</param> /// <param name="paRozmerRiadkov">rozmer</param> /// <param name="paRozmerStlpcov">rozmer</param> /// <returns>vэsledok</returns> private bool OverOkolieStaniceZoskupenia(Stanica paStavana, int paRozmerRiadkov, int paRozmerStlpcov) { int zacRiad = aPoloha.Riadok - 1; int zacStlp = aPoloha.Stlpec - 1; int konRiad = aPoloha.Riadok + paRozmerRiadkov; int konStlp = aPoloha.Stlpec + paRozmerStlpcov; Hra hra = Hra.DajInstanciu(); Policko[,] matica = hra.DajHernuPlochu().DajMaticu(); ZoskupenieStanic zosk = null; int pocetNajdenachZosk = 0; for (int riadok = zacRiad; riadok <= konRiad; riadok++) { for (int stlpec = zacStlp; stlpec <= konStlp; stlpec++) { Policko aktualne = matica[riadok, stlpec]; if(aktualne.Zastavane is Stanica) { if (zosk == null || !zosk.Equals((aktualne.Zastavane as Stanica).Zoskupenie)) { zosk = (aktualne.Zastavane as Stanica).Zoskupenie; pocetNajdenachZosk++; } } } } if (pocetNajdenachZosk == 0) { zosk = new ZoskupenieStanic(); paStavana.Zoskupenie = zosk; zosk.PridajStanicu(paStavana); hra.Spolocnost.PridajStanicu(zosk); OverOkolieStaniceVyroba(paStavana, paRozmerRiadkov, paRozmerStlpcov); return true; } else if (pocetNajdenachZosk == 1) { paStavana.Zoskupenie = zosk; zosk.PridajStanicu(paStavana); hra.Spolocnost.PridajStanicu(zosk); OverOkolieStaniceVyroba(paStavana, paRozmerRiadkov, paRozmerStlpcov); return true; } return false; }
/// <summary> /// vytvorenie novιho vrcholu /// </summary> /// <param name="paPolicko">na ktorom polνθku</param> private void VyrvorVrchol(Policko paPolicko) { Vrchol vr; if (paPolicko.Vrchol == null) { vr = new Vrchol(paPolicko); paPolicko.Vrchol = vr; aZoznamVrcholov.Add(vr); } else { vr = paPolicko.Vrchol; } paPolicko.Hrana = null; }
/// <summary> /// vytvαranie vrcholu napojenιho na hranu /// </summary> /// <param name="paPolicko">na ktorom polνθku</param> /// <param name="paPolickoVedlajsie">susednι polνθko</param> private void VytvorVrcholNapojenyNaHranu(Policko paPolicko, Policko paPolickoVedlajsie) { Vrchol vr; if (paPolicko.Vrchol == null) { vr = new Vrchol(paPolicko); paPolicko.Vrchol = vr; aZoznamVrcholov.Add(vr); } else { vr = paPolicko.Vrchol; } paPolicko.Hrana = null; paPolickoVedlajsie.Hrana.Vrchol2 = vr; }
/// <summary> /// jedna z potrebnύch kontrτl /// </summary> /// <param name="paPolicko">na ktorom polνθku</param> /// <param name="paSusednePolicko">susednι polνθko</param> private void KontrolaVrcholCestyVlavo(Policko paPolicko, Policko paSusednePolicko) { if (paSusednePolicko.Zastavane is Cesta) { SmerCesty smerPredchodcu = (paSusednePolicko.Zastavane as Cesta).Orientacia; if (smerPredchodcu == SmerCesty.vodorovne) { if (paSusednePolicko.Vrchol == null) { VytvorVrcholNapojenyNaHranu(paPolicko, paSusednePolicko); } else { VytvorVrcholVedlaVrcholu(paPolicko, paSusednePolicko); } } else if (smerPredchodcu == SmerCesty.zakDoleVpravo || smerPredchodcu == SmerCesty.zakHoreVpravo || smerPredchodcu == SmerCesty.krizovatka || smerPredchodcu == SmerCesty.odbVodorovneDole || smerPredchodcu == SmerCesty.odbVodorovneHore || smerPredchodcu == SmerCesty.odbZvysleVpravo) { VytvorVrcholVedlaVrcholu(paPolicko, paSusednePolicko); } else { VyrvorVrchol(paPolicko); } } else if (paSusednePolicko.Zastavane is Zastavka) { if ((paSusednePolicko.Zastavane as Zastavka).SmerZast == SmerZast.horizontalny) { VytvorVrcholVedlaVrcholu(paPolicko, paSusednePolicko); } else { VyrvorVrchol(paPolicko); } } else { VyrvorVrchol(paPolicko); } }
/// <summary> /// jedna z potrebnύch kontrτl /// </summary> /// <param name="paPolicko">na ktorom polνθku</param> /// <param name="paSusednePolicko">susednι polνθko</param> private void KontrolaRovnaCestaLava(Policko paPolicko, Policko paSusednePolicko) { if (paSusednePolicko.Zastavane is Cesta) { SmerCesty smerPredchodcu = (paSusednePolicko.Zastavane as Cesta).Orientacia; if (smerPredchodcu == SmerCesty.vodorovne) { if (paSusednePolicko.Vrchol == null) { PosunHranu(paPolicko, paSusednePolicko); } else { VytvorNovuHranu(paPolicko, paSusednePolicko); } } else if (smerPredchodcu == SmerCesty.zakDoleVpravo || smerPredchodcu == SmerCesty.zakHoreVpravo || smerPredchodcu == SmerCesty.krizovatka || smerPredchodcu == SmerCesty.odbVodorovneDole || smerPredchodcu == SmerCesty.odbVodorovneHore || smerPredchodcu == SmerCesty.odbZvysleVpravo) { VytvorNovuHranu(paPolicko, paSusednePolicko); } else { VytvorNovuHranu(paPolicko); } } else if (paSusednePolicko.Zastavane is Zastavka) { if ((paSusednePolicko.Zastavane as Zastavka).SmerZast == SmerZast.horizontalny) { VytvorNovuHranu(paPolicko, paSusednePolicko); } else { VytvorNovuHranu(paPolicko); } } else { VytvorNovuHranu(paPolicko); } }
/// <summary> /// Vytvorenie vrcholu vedΎa vrchoku /// </summary> /// <param name="paPolicko">policko</param> /// <param name="paPolickoVedlajsie">susedne policko</param> private void VytvorVrcholVedlaVrcholu(Policko paPolicko, Policko paPolickoVedlajsie) { Vrchol vr; if (paPolicko.Vrchol == null) { vr = new Vrchol(paPolicko); paPolicko.Vrchol = vr; aZoznamVrcholov.Add(vr); } else { vr = paPolicko.Vrchol; } paPolicko.Hrana = null; Hrana hr = new Hrana(); hr.Vrchol1 = paPolickoVedlajsie.Vrchol; hr.Vrchol2 = vr; aZoznamHran.Add(hr); }
private void KontrolaZeleznicaRovnaVlavo(Policko paPolicko, Policko paSusednePolicko) { if (paSusednePolicko.Zastavane is Zeleznica) { SmerInf smerPredchodcu = (paSusednePolicko.Zastavane as Zeleznica).Orientacia; if (smerPredchodcu == SmerInf.horizontalny) { if (paSusednePolicko.Vrchol == null) { PosunHranu(paPolicko, paSusednePolicko); } else { VytvorNovuHranu(paPolicko, paSusednePolicko); } } else if (smerPredchodcu == SmerInf.zatackaDoleVpravo || smerPredchodcu == SmerInf.zatackaHoreVpravo) { VytvorNovuHranu(paPolicko, paSusednePolicko); } else { VytvorNovuHranu(paPolicko); } } else if (paSusednePolicko.Zastavane is ZeleznicnaStanica) { if ((paSusednePolicko.Zastavane as ZeleznicnaStanica).SmerZastavky == SmerZast.horizontalny) { VytvorNovuHranu(paPolicko, paSusednePolicko); } else { VytvorNovuHranu(paPolicko); } } else { VytvorNovuHranu(paPolicko); } }
private void KontrolaVrcholZeleznicaHore(Policko paPolicko, Policko paSusednePolicko) { if (paSusednePolicko.Zastavane is Zeleznica) { SmerInf smerPredchodcu = (paSusednePolicko.Zastavane as Zeleznica).Orientacia; if (smerPredchodcu == SmerInf.vertikalny) { if (paSusednePolicko.Vrchol == null) { VytvorVrcholNapojenyNaHranu(paPolicko, paSusednePolicko); } else { VytvorVrcholVedlaVrcholu(paPolicko, paSusednePolicko); } } else if (smerPredchodcu == SmerInf.zatackaDoleVlavo || smerPredchodcu == SmerInf.zatackaDoleVpravo) { VytvorVrcholVedlaVrcholu(paPolicko, paSusednePolicko); } else { VyrvorVrchol(paPolicko); } } else if (paSusednePolicko.Zastavane is ZeleznicnaStanica) { if ((paSusednePolicko.Zastavane as ZeleznicnaStanica).SmerZastavky == SmerZast.vertikalny) { VytvorVrcholVedlaVrcholu(paPolicko, paSusednePolicko); } else { VyrvorVrchol(paPolicko); } } else { VyrvorVrchol(paPolicko); } }
/// <summary> /// proces vytvαrania grafu /// </summary> private void VytvorGraf(int paRiadok, int paStlpec) { Policko aktualnePolicko = aMatica[paRiadok, paStlpec]; Policko susednePolicko; if (aktualnePolicko.Zastavane is Cesta) { SmerCesty smer = (aktualnePolicko.Zastavane as Cesta).Orientacia; switch (smer) { case SmerCesty.vodorovne: susednePolicko = aMatica[paRiadok, paStlpec - 1]; if (aktualnePolicko.Prostriedky()) { KontrolaVrcholCestyVlavo(aktualnePolicko, susednePolicko); } else { KontrolaRovnaCestaLava(aktualnePolicko, susednePolicko); } break; case SmerCesty.zvisle: susednePolicko = aMatica[paRiadok - 1, paStlpec]; if (aktualnePolicko.Prostriedky()) { KontrolaVrcholCestyHore(aktualnePolicko, susednePolicko); } else { KontrolaRovnaCestaHore(aktualnePolicko, susednePolicko); } break; case SmerCesty.zakHoreVpravo: case SmerCesty.odbZvysleVpravo: susednePolicko = aMatica[paRiadok - 1, paStlpec]; KontrolaVrcholCestyHore(aktualnePolicko, susednePolicko); break; case SmerCesty.zakDoleVlavo: case SmerCesty.odbVodorovneDole: susednePolicko = aMatica[paRiadok, paStlpec - 1]; KontrolaVrcholCestyVlavo(aktualnePolicko, susednePolicko); break; case SmerCesty.krizovatka: case SmerCesty.odbVodorovneHore: case SmerCesty.odbZvysleVlavo: case SmerCesty.zakHoreVlavo: susednePolicko = aMatica[paRiadok - 1, paStlpec]; KontrolaVrcholCestyHore(aktualnePolicko, susednePolicko); susednePolicko = aMatica[paRiadok, paStlpec - 1]; KontrolaVrcholCestyVlavo(aktualnePolicko, susednePolicko); break; case SmerCesty.zakDoleVpravo: VyrvorVrchol(aktualnePolicko); break; } } else if (aktualnePolicko.Zastavane is Zastavka) { SmerZast smerZ = (aktualnePolicko.Zastavane as Zastavka).SmerZast; if (smerZ == SmerZast.horizontalny) { susednePolicko = aMatica[paRiadok, paStlpec - 1]; KontrolaVrcholCestyVlavo(aktualnePolicko, susednePolicko); } else { susednePolicko = aMatica[paRiadok - 1, paStlpec]; KontrolaVrcholCestyHore(aktualnePolicko, susednePolicko); } } else if (aktualnePolicko.Zastavane is Zeleznica) { SmerInf smer = (aktualnePolicko.Zastavane as Zeleznica).Orientacia; if (smer == SmerInf.horizontalny) { susednePolicko = aMatica[paRiadok, paStlpec - 1]; if (aktualnePolicko.Prostriedky()) { KontrolaVrcholZeleznicaVlavo(aktualnePolicko, susednePolicko); } else { KontrolaZeleznicaRovnaVlavo(aktualnePolicko, susednePolicko); } } else if (smer == SmerInf.vertikalny) { susednePolicko = aMatica[paRiadok - 1, paStlpec]; if (aktualnePolicko.Prostriedky()) { KontrolaVrcholZeleznicaHore(aktualnePolicko, susednePolicko); } else { KontrolaZeleznicaRovnaHore(aktualnePolicko, susednePolicko); } } else if (smer == SmerInf.zatackaHoreVpravo) { susednePolicko = aMatica[paRiadok - 1, paStlpec]; KontrolaVrcholZeleznicaHore(aktualnePolicko, susednePolicko); } else if (smer == SmerInf.zatackaHoreVlavo) { susednePolicko = aMatica[paRiadok - 1, paStlpec]; KontrolaVrcholZeleznicaHore(aktualnePolicko, susednePolicko); susednePolicko = aMatica[paRiadok, paStlpec - 1]; KontrolaVrcholZeleznicaVlavo(aktualnePolicko, susednePolicko); } else if (smer == SmerInf.zatackaDoleVlavo) { susednePolicko = aMatica[paRiadok, paStlpec - 1]; KontrolaVrcholZeleznicaVlavo(aktualnePolicko, susednePolicko); } else if (smer == SmerInf.zatackaDoleVpravo) { VyrvorVrchol(aktualnePolicko); } } else if (aktualnePolicko.Zastavane is ZeleznicnaStanica) { if ((aktualnePolicko.Zastavane as ZeleznicnaStanica).SmerZastavky == SmerZast.horizontalny) { susednePolicko = aMatica[paRiadok, paStlpec - 1]; KontrolaVrcholZeleznicaVlavo(aktualnePolicko, susednePolicko); } else { susednePolicko = aMatica[paRiadok - 1, paStlpec]; KontrolaVrcholZeleznicaHore(aktualnePolicko, susednePolicko); } } }
public Vrchol(Policko paPolicko) { Policko = paPolicko; ZaciatocnyStav(); }
/// <summary> /// Pridanie políčka /// </summary> /// <param name="paPolicko">pridávané políčko</param> public void PridajPolicko(Policko paPolicko) { aPolicka.Add(paPolicko); }