Datové struktury a algoritmy Část 11 Výpočetní geometrie Computational Geometry Petr Felkel 20.12.2005
Úvod Výpočetní geometrie (CG) Příklady úloh Algoritmické techniky paradigmata řazení - jako předzpracování zametací technika (scan-line) rozděl a panuj (divide and conquer) geometrické místo (Locus approach) 2/ 47
Výpočetní geometrie? Vznikla v roce 1975 M. I. Shamos (1850 Dirichlet, 1908 Voronoi, max. článků 1991) Dvojí cíl: Zkoumá teorii (kombinatorikou strukturu geometrických objektů) i praxi: Hledá optimální algoritmy pracující s geometrickými objekty a implementuje je body, přímky, úsečky, mnohoúhelníky polygony, Aplikace např. v oblastech: databázové systémy, robotika, počítačová grafika, počítačové vidění, rozpoznávání obrazů, řadu problémů lze formulovat geometricky 3/ 47
Výpočetní geometrie? Charakteristická je velká probádanost algoritmů v rovině (2D) nárůst složitosti v prostoru (3-D) či v n-dimenzích méně znalostí o řešení v n-dimenzích dále zůstaneme v rovině (2D) ukázky typických úloh ukázky technik při návrhu algoritmů 4/ 47
Úvod Výpočetní geometrie (CG) Příklady úloh Algoritmické techniky paradigmata řazení - jako předzpracování zametací technika (scan-line) rozděl a panuj (divide and conquer) geometrické místo (Locus approach) 5/ 47
Konvexní obálka = nejmenší konvexní mnohoúhelník, který obsahuje všechny zadané body V množina bodů Convex Hull CH(V ) 6/ 47
Průsečíky úseček Cíl: Zjistit, zda se objekty protínají a c b p 2 p 1 Průsečík složitého objektu rozložit na průsečíky částí např. na průsečíky úseček 7/ 47
Triangulace mnohoúhelníka Rozklad objektu na nepřekrývající se části complex -> simplex 2D trojúhelník 3D - čtyřstěn (tetrahedron) 8/ 47
Vyhledávání Vytvoř strukturu pro rychlé nalezení: Nejbližšího souseda (nearest neighbor) Bodů v daném rozsahu (range query) 9/ 47
Voroného diagram Struktura pro vyhledání nejbližšího souseda 10 / 47
Delaunayova triangulace Duální k Voronému diagramu min. délka hran 11 / 47
Algoritmické techniky paradigmata = principy návrhu efektivních algoritmů, které zůstávají stejné i pro velmi odlišné aplikace hrubá síla prohledá / zkusí všechno efektivní algoritmus co nejúspornější optimální algoritmus dosáhl dolní meze složitosti - Ω 12 / 47
Algoritmické techniky paradigmata Řazení Rozděl a panuj (divide and conquer) Zametací technika (plane sweep) Geometrické místo (Locus approach) 13 / 47
Řazení
Řazení předzpracování dat, které vede k jednoduššímu zpracování typicky podle některé ze souřadnic (např. dle osy x či y) nebo dle úhlu kolem daného bodu/ů Př. použití: konvexní obálka 15 / 47
Konvexní obálka = nejmenší konvexní mnohoúhelník, který obsahuje všechny zadané body V množina bodů Convex Hull CH(V ) 16 / 47
Grahamův algoritmus 1/3 1. Seřadíme body p V dle x;( Orig: podle úhlu k x-) 2. Najdeme horní, pak dolní řetěz a) p min (a p max ) CH(V). Vezmi p 1 =p min, p 2 =další, i=2 b) přidáme bod p i+1, i=i+1 konvexní c) kontrola úhlu (p i-1, p i, p i+1 ) konkávní i=i-1 vypustíme pi p i-1 p i p i+1 p i-1 p i p i+1 p i-1 p i p i+1 17 / 47
Grahamův algoritmus 2/3 Kontrola úhlu (p i-1, p i, p i+1 ) Vektorový součin b x a p i-1 p a i b - kolmý na rovinu => jediná z-ová složka > 0, x- a y-ová = 0 x i+1 x i y i+1 y i > 0 => konvexní (R) x i x y i-1 i y i-1 < 0 => konkávní (L) p i+1 b x b y a x a y = b x a y - a x b y a = p i - p i-1 = (a x, a y ) b = p i+1 - p i = (b x, b y ) p i = [x i, y i, z i ] 18 / 47
Grahamův algoritmus 3/3 Složitost 1. Seřazení bodů dle x O( n log n ) 2. Nalezení horního a dolního řetězu O( n ) => celkem O( n log n ) 19 / 47
Jarvisův algoritmus balení dárku (gift wrapping) 1. Vezmeme bod p s minimální souřadnicí y a vodorovnou přímku 2. Otáčíme přímku kolem p dokud nenarazí na bod q 3. p = nový nejbližší bod q 4. Dokud (p p 0 ) jdi na 2 p k Bod s min. úhlem p 0 p 1 Složitost: O( n ) + O( n ) * k => celkem O( k*n ) vhodný pro málo bodů na konvexním obalu 20 / 47
Rozděl a panuj Divide and conquer
Konvexní obálka metodou D&C Seřaď body dle x Rekurzivně: děl na 2 části Najdi obálky Spoj obálky Horní most, pak dolní most zač.: nejbližší body, L proti, P po směru hodin Složitost: O(nlog(n) + O(n)) = O(nlog(n) ) 22 / 47
Zametací technika Plane sweep
Zametací technika princip Svislou přímku (scanline, SL, zametací přímku) suneme zleva doprava přes množinu objektů Pamatujeme si informace o objektech nalevo od zametací přímky (y-stuktura, T) Při průchodu nad objektem ji aktualizujeme Nesuneme se spojitě, ale skáčeme mezi body, kde je nutno zastavit Body jsou v prioritní frontě (x-struktura, B, postupový plán) odebírám je zleva-doprava 24 / 47
Příklad 1: Minimální body Od nich nalevo ani dolů není žádný bod 1. Seřadíme body dle souřadnice x -> x-struktura 2. Inicializujeme y-strukturu na 3. Scanline umísťujeme zleva doprava do bodů v x-str. 4. Do y-strukt. ukládám minimální y-souřadnici O(n log n) - řazení O(1) na bod O(n) pro všechny body O(n log n) - celkem 25 / 47
Příklad 2: Průsečíky úseček Nalezení všech průsečíků zadaných úseček rychleji než každá s každou, tj. než O(n 2 ) počítám průsečíky jen mezi sousedními úsečkami v T T, y-struktura = úsečky v pořadí jak protínají scanline B, x-struk., body, kde se mění pořadí úseček: na začátku jen koncové body úseček průběžně průsečíky sousedních úseček v T 26 / 47
Průsečíky úseček 1. Inicializace B L koncové body > B b? A R T prázdné C L c A L 1 a? C R B R b 2 3 4 5 6 7 8 B: A L,B L, C L,C R, A R,B R T: prázdná1 27 / 47
Průsečíky úseček 2. dokud není B prázdná vezmi bod p z B (a smaž ho v B) dle typu bodu p aktualizuj T strukturu: L... P... průsečík... 28 / 47
Průsečíky úseček L Najdi v T sousedy s (úsečky s 1 a s 2 ) (s je úsečka s počátečním bodem p) if( protíná s 1 x s 2 ) odstraň průsečík (už nejsou sousedy) vlož průs. s 1 x s a s x s 2 do B 29 / 47
Průsečíky úseček B 0 : A L,B L, C L,C R,A R,B R B L T 0 : prázdná A L C L a c? b? C R A R 1. A L B 1 : B L, C L,C R,A R,B R T 1 : a B R 1 2 3 4 5 6 7 8 30 / 47
Průsečíky úseček B L 2. B L p 1 = s1 x s = a x b... vložit A L C L a c? b p 1 C R A R B 2 : C L,p 1, C R, A R,B R T 2 : a, b s 1 s B R 1 2 3 4 5 6 7 8 31 / 47
Průsečíky úseček B L 2. B L B 2 : C L,p 1, C R, A R,B R T 2 : a, b b p 1 A R 3. C L p 1 = s 1 x s 2 = a x b...smazat C L c A L a p 2 C R p 2 = s 1 x s = a x c... vložit 1 2 3 4 5 6 7 8 B R B 3 : p 2, C R, A R,B R T 3 : a, c, b s 1 s s 2 32 / 47
Průsečíky úseček průsečík úseček s a s Najdi v T sousedy s a s (úsečky s 1 a s 2 ) prohoď s a s v T if( protíná s x s 1 ) odstraň průsečík z B if( protíná s x s 2 ) odstraň průsečík z B (už nejsou sousedy) vlož průs. s x s 2 a s x s 1 do B 33 / 47
Průsečíky úseček B L B 3 : p 2, C R, A R,B R T 3 : a, c, b A L 1 C L a c b p 2 p 1 C R A R 2 3 4 5 6 7 8 4. p 2 změna pořadí úseček a,c B 4 : p 1, C R, A R,B R T 4 : c, a, b 5. p 1 změna pořadí úseček a,b B 5 : C R, A R,B R T 5 : c, b, a B R 34 / 47
Průsečíky úseček R Najdi v T sousedy s (úsečky s 1 a s 2 ) (s je úsečka s koncovým bodem p) smaž s z T if( protíná s 1 x s 2 )vložprůsečík do B 35 / 47
Průsečíky úseček B L B 5 : C R, A R,B R T 5 : c, b, a C L c b p 1 A R 6. C R B 6 : A R,B R T 6 : b, a A L a p 2 C R 7. A R B 7 : B R B R T 7 : b 1 2 3 4 5 6 7 8 8. B R B 7 : prázdná T 7 : prázdná 36 / 47
Paměť O(n) Průsečíky úseček Operační složitost n+k poloh každá log n => O(k+n) log n 37 / 47
Geometrické místo Locus approach
Voroného diagram (VD) Struktura pro vyhledání nejbližšího souseda hrana VD zadaný bod uzel VD 39 / 47
Voroného diagram = planární graf (též Voronoiův diagram) obsahuje n oblastí (n = počet bodů) hrana = gmb. stejně vzdál. od dvou bodů = osa spojnice těchto dvou bodů uzel = střed kružnice opsané 3 bodům uzly mají stupeň 3 počet uzlů 2n-4, počet hran n-6, tj. O(n) otevřené oblasti odpovídají bodům konvexní obálky 40 / 47
Konvexní obal Voroného diagram 41 / 47
Voroného diagram Konstrukce metodou rozděl a panuj 1. Rozděl body dle x-souř. na L a P 2. Rekurze na L a P 1-3 body => návrat VD L a VD P 3. Spoj Voroného diagramy z L a P monotónní řetěz úseček zkrať protnuté hrany nové hrany z řetězu ús. O(k+n) log n 42 / 47
VD L Voroného diagram Konstrukce metodou rozděl a panuj VD P 1. Rozděl body dle x-souř. na L a P 2. Rekurze na L a P 1-3 body => návrat VD L a VD P 3. Spoj Voroného diagramy z L a P monotónní řetěz úseček zkrať protnuté hrany nové hrany z řetězu ús. O(k+n) log n 43 / 47
VD L Voroného diagram Konstrukce metodou rozděl a panuj VD P 1. Rozděl body dle x-souř. na L a P 2. Rekurze na L a P 1-3 body => návrat VD L a VD P 3. Spoj Voroného diagramy z L a P monotónní řetěz úseček zkrať protnuté hrany nové hrany z řetězu ús. O(k+n) log n 44 / 47
VD L Voroného diagram Konstrukce metodou rozděl a panuj VD P 1. Rozděl body dle x-souř. na L a P 2. Rekurze na L a P 1-3 body => návrat VD L a VD P 3. Spoj Voroného diagramy z L a P monotónní řetěz úseček zkrať protnuté hrany nové hrany z řetězu ús. O(k+n) log n 45 / 47
Links Collections of geometry resources (Rozcestníky) N. Amenta, Directory of Computational Geometry Software, http://www.geom.umn.edu/software/cglist/. D. Eppstein, Geometry in Action, http://www.ics.uci.edu/~eppstein/geom.html. Jeff Erickson, Computational Geometry Pages, http://compgeom.cs.uiuc.edu/~jeffe/compgeom/ 46 / 47
References Jan Slovák, Geometrické algoritmy I, skripta na webu, 1994, ftp://www.math.muni.cz/pub/math/people/slovak/lectures/geomet ricke.algoritmy/galgi.ps Rourke: Computational geometry in C, 2nd ed., Cambridge University Press, 1998, http://maven.smith.edu/~orourke/books/compgeom.html for more see the collections on the previous slide 47 / 47