/// <summary>
 /// Verejna implementace pro Intervalove vyhledavani. Vola privatni metodu NajdiInterval, kde je implementovano vyledavani.
 /// </summary>
 /// <param name="levyHorniBod">Levý horní roh v oblasti intervalového vyhledávání.</param>
 /// <param name="pravyDolniBod">Pravý horní roh v oblasti intervalového vyhledávání.</param>
 /// <returns>Vracé seznam vrcholů ve vybraném intervalu. </returns>
 public List <T> NajdiInterval(ISouradnice levyHorniBod, ISouradnice pravyDolniBod)
 {
     vysledekIntervalovehoHledani = new List <T>();
     //pri prvnim volani se nastavi vrchol jako koren a dimenzeX na true
     NajdiInterval(levyHorniBod, pravyDolniBod, koren, true);
     return(vysledekIntervalovehoHledani);
 }
 // prohlidka(PrvekRange < T > vrchol, AkceCallback akce, bool dimenzeX) – metoda
 // provádějící prohlídku, dotraverzuje k nejlevějšímu listu stromu, jehož kořen odpovídá
 // parametru vrchol, a následně projde zřetězený seznam se všemi plnohodnotnými prvky,
 // nad kterými vykoná zvolenou akci(během fáze ladění navíc kontroluje korektnost
 // umístění prvků ve struktuře),
 private void Prohlidka(ISouradnice levyHorniRohIntervalu, ISouradnice pravyDolniRohIntervalu, PrvekRozsahovehoStromu vrchol, bool dimenzeX)
 {
     // dotraverzovat k platnemu vrcholu
     if (vrchol != null)
     {
         if (vrchol.platny == true)
         {
             if (vrchol.nositelDat.vratX() >= levyHorniRohIntervalu.vratX() &&
                 vrchol.nositelDat.vratX() <= pravyDolniRohIntervalu.vratX() &&
                 vrchol.nositelDat.vratY() >= levyHorniRohIntervalu.vratY() &&
                 vrchol.nositelDat.vratY() <= pravyDolniRohIntervalu.vratY())    // TODO: k uvaze
             {
                 vysledekIntervalovehoHledani.Add(vrchol.nositelDat);
                 if (vrchol.dalsiPrvekRozsahovehoStromu != null)
                 {
                     Prohlidka(levyHorniRohIntervalu, pravyDolniRohIntervalu, vrchol.dalsiPrvekRozsahovehoStromu, dimenzeX);
                 }
             }
         }
         else
         {
             if (vrchol.levyPotomek != null)
             {
                 Prohlidka(levyHorniRohIntervalu, pravyDolniRohIntervalu, vrchol.levyPotomek, dimenzeX);
             }
         }
     }
 }
Beispiel #3
0
        private void canvasElem_MouseUp(object sender, MouseButtonEventArgs e)
        {
            if (stisknutoRangeTree == true)
            {
                var point = e.GetPosition((IInputElement)sender);
                konecOblastiPolom = new Data2Dim((int)point.X, (int)point.Y);
                foreach (DataHran v in mapa.VratHrany())
                {
                    v.JeFunkcniCesta = true;
                }
                List <DataVrcholu> polamaneVrcholy = mapa.ZpracujInterval(zacatekOblastiPolom, konecOblastiPolom);
                string             msg             = "Pocet nalezenych vrcholu: " + polamaneVrcholy.Count + " zacatek:" + zacatekOblastiPolom + ", konec:" + konecOblastiPolom + ", Jmena vrcholu:\n";

                foreach (DataVrcholu vrchol in polamaneVrcholy)
                {
                    msg += vrchol.NazevVrcholu + ", ";
                    IEnumerable <DataHran> polamaneHrany = mapa.VratIncedencniHrany(vrchol.NazevVrcholu);
                    foreach (DataHran hrana in polamaneHrany)
                    {
                        hrana.JeFunkcniCesta = false;
                    }
                }
                NastavTextLabelu(msg);
                VykresliMapu();
                VykresliRectangle();
                //aby se neprekresloval Rectangle pri pohybu mysi
                zacatekOblastiPolom = null;
                stisknutoRangeTree  = false;
            }
        }
Beispiel #4
0
 private void canvasElem_MouseMove(object sender, MouseEventArgs e)
 {
     if (zacatekOblastiPolom != null)
     {
         var point = e.GetPosition((IInputElement)sender);
         konecOblastiPolom = new Data2Dim((int)point.X, (int)point.Y);
         VykresliRectangle();
     }
 }
Beispiel #5
0
 private void canvasElem_MouseDown(object sender, MouseButtonEventArgs e)
 {
     if (stisknutoRangeTree == true)
     {
         NastavTextLabelu("Pro výběr intervalu prosím táhněte zlevého horního rohu do pravého dolního," +
                          " v opačném případě nebude vybrána oblast.");
         var point = e.GetPosition((IInputElement)sender);
         zacatekOblastiPolom = new Data2Dim((int)point.X, (int)point.Y);
     }
 }
 /// <summary>
 /// Pro vyhledání prvků v obdélníkovém segmentu. Hledání opět začíná od kořene stromu směrem k listům. Při
 /// dosažení plnohodnotného prvku(listu stromu) se zkontrolují jeho souřadnice, a pokud
 /// spadají do hledaného segmentu, vykoná se na aktuálním prvku zadaná akce.Při
 /// traverzování přes navigační vrcholy se rozhoduje, jakým způsobem v hledání pokračovat.
 /// Uplatňují se přitom daná pravidla.
 /// </summary>
 /// <param name="levyHorniBod"></param>
 /// <param name="pravyDolniBod"></param>
 /// <param name="vrchol"></param>
 /// <param name="dimenzeX"></param>
 /// <returns></returns>
 private void NajdiInterval(ISouradnice levyHorniRohIntervalu, ISouradnice pravyDolniRohIntervalu,
                            PrvekRozsahovehoStromu vrchol, bool dimenzeX)
 {
     if (vrchol != null)
     {
         // při dosažení plnohodnotného prvku se zkontrolují jeho souřadnice
         if (vrchol.platny == true)
         {
             if (vrchol.nositelDat.vratX() >= levyHorniRohIntervalu.vratX() &&
                 vrchol.nositelDat.vratX() <= pravyDolniRohIntervalu.vratX() &&
                 vrchol.nositelDat.vratY() >= levyHorniRohIntervalu.vratY() &&
                 vrchol.nositelDat.vratY() <= pravyDolniRohIntervalu.vratY())    // TODO: k uvaze
             {
                 vysledekIntervalovehoHledani.Add(vrchol.nositelDat);
             }
         }
         else
         {
             if (dimenzeX == true)
             {
                 // patří-li celý interval do hledaného rozsahu, hledá se ve druhé dimenzi
                 if (levyHorniRohIntervalu.vratX() <= vrchol.zacatekIntervalu &&
                     pravyDolniRohIntervalu.vratX() >= vrchol.konecIntervalu)
                 {
                     NajdiInterval(levyHorniRohIntervalu, pravyDolniRohIntervalu, vrchol.druhaDimenze, !dimenzeX);
                 }
                 // patří-li část intervalu do hledaného rozsahu, pokračuje se oběma syny
                 else if (levyHorniRohIntervalu.vratX() >= vrchol.zacatekIntervalu ||
                          pravyDolniRohIntervalu.vratX() <= vrchol.konecIntervalu)
                 {
                     NajdiInterval(levyHorniRohIntervalu, pravyDolniRohIntervalu, vrchol.levyPotomek, dimenzeX);
                     NajdiInterval(levyHorniRohIntervalu, pravyDolniRohIntervalu, vrchol.pravyPotomek, dimenzeX);
                 }
             }
             else
             // patří-li celý interval do hledaného rozsahu, provede se prohlídka podstromu
             {
                 if (vrchol.zacatekIntervalu >= levyHorniRohIntervalu.vratY() &&
                     vrchol.konecIntervalu <= pravyDolniRohIntervalu.vratY())
                 {
                     // TODO funkce prohlidka (vsechny listy podstromu a ulozi je do listu)
                     Prohlidka(levyHorniRohIntervalu, pravyDolniRohIntervalu, vrchol, dimenzeX);
                 }
                 else if (vrchol.zacatekIntervalu <= levyHorniRohIntervalu.vratY() ||
                          vrchol.konecIntervalu >= pravyDolniRohIntervalu.vratY())
                 {
                     NajdiInterval(levyHorniRohIntervalu, pravyDolniRohIntervalu, vrchol.levyPotomek, dimenzeX);
                     NajdiInterval(levyHorniRohIntervalu, pravyDolniRohIntervalu, vrchol.pravyPotomek, dimenzeX);
                 }
             }
         }
     }
 }
Beispiel #7
0
 public List <DataVrcholu> ZpracujInterval(ISouradnice a, ISouradnice b)
 {
     return(rs.NajdiInterval(a, b));
 }
 /// <summary>
 /// Hledání prvku se zadanými souřadnicemi probíhá pouze ve stromu první dimenze, který je
 /// organizován podle zeměpisné šířky.Prohledávání začíná od kořene stromu směrem
 /// k listům.V každém navigačním vrcholu se testuje, zda interval vrcholu obsahuje hledanou
 /// hodnotu zeměpisné šířky. V případě záp**né odpovědi hledání skončí, protože lze
 /// jednoznačně určit, že hledaný prvek se v range stromu nenachází. V opačném případě se
 /// pokračuje do obou podstromů aktuálního vrcholu. Při dosažení plnohodnotného prvku
 /// (listu stromu) se porovnají jeho souřadnice se souřadnicemi hledanými. --text z literatury--
 /// </summary>
 /// <param name="obeSouradnice">Proměnná uchovávající obě souřadnice.</param>
 /// <returns>Prvek Rozsahového stromu </returns>
 public T Najdi(ISouradnice obeSouradnice)
 {
     // je-li kořen platným vrcholem, porovnají se souřadnice a hledání skončí
     if (koren != null && koren.platny == true)
     {
         if (koren.nositelDat.vratX() == obeSouradnice.vratX() && koren.nositelDat.vratY() == obeSouradnice.vratY())
         {
             return(koren.nositelDat);
         }
         else
         {
             return(default(T));
         }
     }
     else
     {
         // v opačném případě je strom prohledáván traverzováním směrem k listům
         PrvekRozsahovehoStromu pomocny = koren;
         while (true)
         {
             if (pomocny == null)
             {
                 return(default(T));
             }
             // je-li levý syn platným vrcholem, porovnají se jeho souřadnice
             if (pomocny.levyPotomek != null &&
                 pomocny.levyPotomek.platny == true &&
                 pomocny.levyPotomek.nositelDat.vratX() == obeSouradnice.vratX() &&
                 pomocny.levyPotomek.nositelDat.vratY() == obeSouradnice.vratY())
             {
                 return(pomocny.levyPotomek.nositelDat);
             }
             // je-li pravý syn platným vrcholem, porovnají se jeho souřadnice
             if (pomocny.pravyPotomek != null &&
                 pomocny.pravyPotomek.platny == true &&
                 pomocny.pravyPotomek.nositelDat.vratX() == obeSouradnice.vratX() &&
                 pomocny.pravyPotomek.nositelDat.vratY() == obeSouradnice.vratY())
             {
                 return(pomocny.pravyPotomek.nositelDat);
             }
             // jinak se rozhodne, kterým směrem pokračovat
             // TODO: projit vetsi mensi jestli je spravne nakodovano
             if (pomocny.levyPotomek != null &&
                 pomocny.levyPotomek.platny == false &&
                 pomocny.levyPotomek.zacatekIntervalu <= obeSouradnice.vratX() &&
                 pomocny.levyPotomek.konecIntervalu >= obeSouradnice.vratX())
             {
                 pomocny = pomocny.levyPotomek;
             }
             else if (pomocny.pravyPotomek != null &&
                      pomocny.pravyPotomek.platny == false &&
                      pomocny.pravyPotomek.zacatekIntervalu <= obeSouradnice.vratX() &&
                      pomocny.pravyPotomek.konecIntervalu >= obeSouradnice.vratX())
             {
                 pomocny = pomocny.pravyPotomek;
             }
             else
             {
                 return(default(T));
             }
         }
     }
 }