Algoritmy výpočetní geometrie prof. Ing. Pavel Tvrdík CSc. Katedra počítačových systémů Fakulta informačních technologií České vysoké učení technické v Praze c Pavel Tvrdík, 2010 Efektivní algoritmy (BI-EFA) ZS 2010/11, Přednáška 12 Evropský sociální fond. Praha & EU: Investujeme do vaší budoucnosti prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 1 / 18
Výpočetní geometrie Výpočetní geometrie Definice 1 Cílem výpočetní geometrie je analýza a návrh efektivních algoritmů pro určování vlastností a vztahů geometrických objektů (GO). Řešené problémy: geometrické vyhledávání, reprezentace scény, určení poloh objektů, zjišťování kolizí či vzdálenosti objektů, konstrukce konvexní obálky, konstrukce Voronoi diagramu,.... prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 2 / 18
Definice kvadrantového stromu (QuadTree) Čtvercová nebo obdélníková 2D scéna je rekurzivně dělena do kvadrantů. Každý kvadrant může obsahovat 1 (několik) GO. Pro jednoduchost budeme v BI-EFA předpokládat hmotné body, čili bezrozměrné GO. Definice 2 (Kvadrantový strom) Kvadrantový strom je plný 4-ární strom, který splňuje následující podmínky: 1 Každý vnitřní uzel 1 reprezentuje jeden kvadrant, rozdělený na 4 navzájem disjunktní podkvadranty, postupně značené SZ, SV, JZ a JV, 2 obsahuje souřadnice kříže pro dělení tohoto kvadrantu. 2 Každý list má definovanou maximální kapacitu GO obsažených v daném kvadrantu. Pokud je překročena (u dynamické scény), kvadrant se rozdělí zase na 4 podkvadranty a list se stane vnitřním uzlem. prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 3 / 18
Použití kvadrantového stromu Kvadrantové stromy se používají pro efektivní reprezentaci GO (např. hmotných bodů, polygonů) zadaných souřadnicemi (středu) x a y v 2D prostoru (scéně), která umožňuje urychlení 2D grafických algoritmů (sledování paprsku), urychlení zpracování a analýzu obrazu, efektivní uložení a vyhledávání dat pro GIS, snížení paměťových nároků při zobrazování scény. prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 4 / 18
PR kvadrantový strom PR kvadrantový strom (Point Region QuadTree) Definice 3 (PR kvadrantový strom) 1 Každý list (koncový kvadrant) obsahuje nejvýše 1 GO. 2 Dělení na podkvadranty se provádí, dokud se do kvadrantu má vložit druhý GO. 3 Kvadrant se pak rozdělí na 4 stejně velké podkvadranty. 4 Dělící kříž má proto střed vždy ve středu kvadrantu. prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 5 / 18
PR kvadrantový strom Vložení GO do PR kvadrantového stromu Předpokládejme, že GO jsou reprezentovány trojicí ((x, y), obj). Postup pro vložení GO ((x, y), obj) je podobný vložení prvku do BVS, ve kterém klíče jsou uspořádané dvojice souřadnic (x, y). 1 Nejprve se podle souřadnic (x, y) nalezne list (koncový kvadrant), do kterého vkládaný GO patří: Souřadnice vkládaného GO se postupně porovnávají se středy kvadrantů a vybírá se podkvadrant, do kterého GO patří. 2 Pokud je list prázdný (koncový podkvadrant neobsahuje žádný GO), pak je GO obj vložen do tohoto listu. 3 Pokud list (=koncový kvadrant) obsahuje jiný GO, provede se jeho rozdělení na stejně velké podkvadranty. Vytvoří se jeho čtyři synovské listy-podkvadranty. Původně uložený GO v původním kvadrantu se přesune do odpovídajícího podkvadrantu (podle svých souřadnic). Rekurzivně se provede operace vložení do takto rozděleného kvadrantu. prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 6 / 18
PR kvadrantový strom Vložení GO do PR kvadrantového stromu procedure insertprquadtree(r, (x, y), N ewobj) { (1) if (not isleaf(r)) then { (2) child chooseleaf(r, (x, y)); (3) insertprquadtree(child, (x, y), N ewobj) } (4) else (5) if (isempty(r)) then obj[r] N ewobj (6) else { (7) split(r, (x, y), NewObj); (8) child chooseleaf(r, (x, y)); (9) insertprquadtree(child, (x, y), N ewobj) } } prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 7 / 18
PR kvadrantový strom Vložení GO do PR kvadrantového stromu procedure split(r, (x, y), obj) { (1) createfourchildren(r); (2) point obj[r]; (3) obj[r] Null; (4) leaf chooseleaf(r, (x, y)); (5) obj[leaf] point; } procedure isempty(r) { (1) return obj[r] = Null; } procedure chooseleaf(r, (x, y)) Vrátí ukazatel na syna uzlu r, jehož kvadrant obsahuje bod (x, y). prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 8 / 18
PR kvadrantový strom Hledání GO v PR kvadrantovém stromu Algoritmus hledání koncového kvadrantu obsahujícího zadaný GO se souřadnicemi (x, y) v kvadrantovém stromu s kořenem r: Otestuje se, zda je kořen r listem. Pokud ano, otestuje se, zda je kořen plný (=obsahuje GO). Pokud ano, provede se porovnání (x, y) se souřadnicemi tohoto GO. Pokud ne, je hledání ukončeno jako neúspěšné. Pokud ne, provede se rekurzivně totéž pro odpovídající podkvadrant (test 4 možností). prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 9 / 18
PR kvadrantový strom Mazání GO z PR kvadrantového stromu 1 Nalezne se list (=koncový kvadrant), který má obsahovat zadaný GO (předchozí algoritmus). 2 Porovnají se souřadnice a pokud je shoda, dojde k smazání GO. 3 Otestují se sourozenci listu, zda jsou také listy a zda jsou prázdné: Pokud ano, stane se jejich otec listem. A vracíme se na bod 3. Pokud ne, konec. prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 10 / 18
PR kvadrantový strom Diskuze vlastností PR kvadrantového stromu 1 Struktura PR kvadrantového stromu je nezávislá na pořadí vkládaných GO. 2 V případě hustých shluků GO roste hloubka stromu. 3 Proto v případě nerovnoměrného rozložení GO ve scéně je strom výškově nevyvážený. 4 Jednoduchá operace mazání. prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 11 / 18
PR kvadrantový strom R Kvadrantový strom (Region QuadTree) Jedná se o speciální případ PR kvadrantového stromu. Strom reprezentuje černobílý bitmapový obrázek o velikosti 2 n 2 n pixelů. V listech stromu se uchovává hodnota Black/White. Použití: bezeztrátová komprese, hledání fraktálních artefaktů. 8 x 8 1 2 3 4 4 x 4 2 x 2 1 2 4 3 1 pixel prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 12 / 18
P Kvadrantový strom P kvadrantový strom (Point QuadTree) Definice 4 (P kvadrantový strom) Je to kvadrantový strom s těmito vlastnosti: 1 Dělící kříž není ve středu, ale je umístěn do existujícího GO. 2 Každý kvadrant obsahuje nejvýše 1 GO (=hmotný bod). prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 13 / 18
P Kvadrantový strom Vložení GO do P kvadrantového stromu Postup pro vložení GO, řekněme ((x, y), obj), je velmi podobný vložení do BVS, kde klíče jsou dvojice souřadnic (x, y). 1 Nejprve se podle souřadnic nalezne list (=koncový kvadrant), do kterého nově vkládaný GO patří. Souřadnice (x, y) postupně porovnáváme se souřadnicemi středu dělícího kříže kvadrantu, který reprezentuje navštívený uzel a vybíráme příslušný podkvadrant, do kterého souřadnice patří. 2 Pokud je koncový kvadrant prázdný (list neobsahuje GO), pak je GO ((x, y), obj) do něj vložen. 3 Pokud již obsahuje GO, provede se dekompozice uzlu: Vytvoří se čtyři synovské podkvadranty. Střed dělícího kříže je souřadnice stávajícího GO. Provede se vložení do jednoho z těchto kvadrantů. prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 14 / 18
P Kvadrantový strom Hledání GO v P kvadrantovém stromu Algoritmus nalezení GO se zadanými souřadnicemi (x, y) v P kvadrantovém stromu s kořenem r: Otestuje se, zda uzel r obsahuje hledaný GO jako střed kříže. Pokud ano, končíme úspěšně. Pokud ne, otestuje se, zda je kořen r listem. Pokud ano, otestuje se, zda daný koncový kvadrant obsahuje GO. Pokud ano, provede se porovnání (x, y) se souřadnicemi tohoto GO a vrátí se výsledek. Pokud ne, je hledání ukončeno jako neúspěšné. Pokud ne, provede se rekurzivně totéž pro odpovídající podkvadrant (test 4 možností). prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 15 / 18
P Kvadrantový strom Mazání GO z P kvadrantového stromu 1 Nalezne se uzel, který má obsahovat zadaný GO (předchozí algoritmus). 2 Vymaže se GO z uzlu. 3 Pokud není uzel listem, musí být všechny GO v podstromech znovu vloženy. Tento postup mazání je neefektivní. Efektivním postupem je nahradit mazaný GO vhodným GO v podstromech, tak aby bylo potřeba minimum znovu vložení. V následující animaci stačí znovu vložit jen dva uzly. prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 16 / 18
Oktalový strom Oktalový strom Používá se pro hierarchickou reprezentaci 3D scén. Zobecnění kvadrantového stromu pro 3D scény. Plný 8-ární strom: Počet synů vnitřního uzlu je právě 8. prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 17 / 18
K-D strom K-D strom Definice 5 (K-D strom) K-D strom je BVS provádějící dělení scény střídavě podle x-ové a y-ové souřadnice. 1 Každý vnitřní uzel reprezentuje jedno dělení 2D podscény na 2 navzájem disjunktní oblasti podle x nebo podle y. 2 Každá oblast obsahuje nejvýše jeden GO. Existuje opět několik variant K-D stromů, např. 1 Dělené oblasti jsou vždy stejně velké (PR K-D stromy). 2 Dělení je prováděno podle jedné souřadnice vloženého GO jako u P kvadrantového stromu (tuto variantu budeme prezentovat). Důsledek: Každý vnitřní uzel má právě 2 syny. obsahuje souřadnice dělícího bodu a příznak x/y. prof. Pavel Tvrdík (FIT ČVUT) Výpočetní geometrie BI-EFA, 2010, Předn. 12 18 / 18