/// <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); } } } } }
// 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); } } } }
private void VykresliRectangle() { if (a == null) { a = new System.Windows.Shapes.Rectangle(); } int x1 = zacatekOblastiPolom.vratX(); int y1 = zacatekOblastiPolom.vratY(); int x2 = konecOblastiPolom.vratX(); int y2 = konecOblastiPolom.vratY(); int xmin = PorovnejSouradnice(x1, x2); int ymin = PorovnejSouradnice(y1, y2); a.Margin = new Thickness(xmin, ymin, 0, 0); a.Width = Math.Abs(x2 - x1); a.Height = Math.Abs(y2 - y1); a.Stroke = new SolidColorBrush(Colors.GreenYellow); a.StrokeThickness = 5; if (!canvasElem.Children.Contains(a)) { canvasElem.Children.Add(a); } }
/// <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)); } } } }