2D-konveksni omotač skupa tačaka definišemo kao najmanji konveksni poligon koji obuhvata sve tačke. "Najmanji" se odnosi kako na površinu, tako i na obim poligona.
Algoritam za konveksni omotač korisiti se u robotici, obradi digitalnih slika i prepoznavanju oblika, ali je značajanu primenu našao kao neophodni deo drugih algoritama, kao što su:
(Moramo uporediti sve tačke (O(n)) sa svim mogućim trouglovima (O(n3))) |
|
|
(spori algoritam) |
(Moramo uporediti sve tačke (O(n)) sa svim mogućim pravama određenim parovima tačaka (O(n2))) |
|
(Algoritam je takođe poznat pod nazivom Jarvis March algoritam) |
(h = ivice omotača) |
|
|
|
najgori slučaj O(n2) |
algoritam |
|
|
Tačke su unutrašnje ako i samo ako su unutar svakog trougla određenog bilo kojim trima drugim tačkama tog skupa. Na sledećoj slici prikazan je razulat takva dva testa. U koracima A i B identifikovane su dve različite unutrašnje tačke.
Kada pronađemo sve unutrašnje tačke konveksni omotač se kontstruiše na osnovu skupa ivičnih tačaka.
Opšti slučaj: Moramo uporediti sve tačke (O(n)) sa svim mogućim trouglovima (O(n3)), pa je algoritam složenosti O(n4).
Najgori slučaj: Nema specijalnih slučajeva. Algoritam je uvek složenosti O(n4) jer postoje četiri for ciklusa.
Najbolji slučaj: Nema specijalnih slučajeva. Algoritam je uvek složenosti O(n4) .
Duž je ivična ako sve tačke leže na ili sa iste strane prave određene dvema tačkama tog skupa. Sledeća slika prikazuje dva takva testa. U prvom slučaju (slika A), duž je ivična jer su sve tačke skupa sa njene leve strane. Na slici B je suprotan slučaj - tačke se nalaze sa obe strane linije, pa duž nije u omotaču.
Nakon što se obradi svaka linija, nađene su sve ivice i konveksni omotač može biti konstruisan.
Opšti slučaj: Moramo uporediti sve tačke (O(n)) sa svim mogućim linijama određenim parovima tačaka skupa (O(n2)), pa je algoritam složenosti O(n3).
Najgori slučaj: Nema specijalnih slučajeva. Algoritam je uvek složenosti O(n3).
Najbolji slučaj: Nema specijalnih slučajeva. Algoritam je uvek složenosti O(n3).
Algoritam počinje od najniže (krajnje desne) tačke, a zatim nalazi tačku koja zaklapa najmanji ugao (u odnosu na x-osu) sa ovom tačkom. Ivica omotača mora da spaja ove dve tačke (korak 1). Dalje, nalazimo tačku koja zaklapa najmanji ugao sa ovom formiranom ivicom. U stvari, linija kojoj pripada ivica omotača se "savija" u smeru suprotnom od kretanja kazaljke na satu sve dok ne obuhvati drugu tačku. Ako su nađene dve tačke koje imaju isti ugao, tada se uzima tačka koja je najudaljenija od pivot tačke (korak 2). Proces "pakovanja" linije oko skupa tačaka se nastavlja (korak 3) dok se ne dođe do početne tačke (korak 4) i tada je konveksni omotač formiran.
Opšti slučaj: Očigledno je da je za svaku otkrivenu tačka ivice omotača (O(n) ili preciznije O(h), gde je h broj tačaka omotača) treba naći sledeću tačku omotača. Ovo se postiže upoređivanjem sa svakom tačkom, pa je ukupna vremenska složenost O(n2), ili tačnije O(nh).
Najgori slučaj: Kada su sve tačke na konveksnom omotaču i nema kolinearnih tačaka, složenost algoritma je O(n2).
Najbolji slučaj: Najbolji slučaj za ovaj algoritam je da ima što više tačaka u unutrašnjosti konveksnog omotača. Do ove situacije dolazi kada sve tačke leže unutar nekog trougla i tada vremenska složenost postaje O(n).
Izložen algoritam je verzija koju je predložio O'Rourke.
Brzi algoritam započinje generisanjem četvorougla koji spaja ivične tačke orijentisan kao kompas (slika A). Samo one tačke koje se nalaze izvan četvorougla mogu biti na omotaču i biće razmatrane u daljem računu. Svaka od četiri oblasti izvan četvorougla će biti naizmenično razmatrana i svaka će biti rekurzivno obrađivana korišćenjem QuickHull funkcije. Procedura primenjena na gornji desni ugao prikazana je na sledećoj slici.
Slika A prikazuje četiri ekstremne tačke, koje formiraju ivice četvorougla, i odabir tačaka u krajnjem desnom uglu. Konačno, slika A ističe tačku c najudaljeniju od linije a-b. Sledeći korak procedure je definisanje dva skupa tačaka - one sa desne strane ili na duži (a,c) i one sa desne strane ili na duži (c,b) (slika B). Za ove skupove tačaka dva puta pozivamo funkciju QuickHull.
Na slici ispod prvi od novih skupova tretiramo kao u prethodnom slučaju, tj. nalazimo tačku najudaljeniju od duži (a',b') i označavamo је sa c' (slika C), a zatim razmatramo nove skupove tačaka desno ili na (a',c') i (c',b') (slika D)...
Algoritam nastavlja sa još jednim pozivom QuickHull funkcije za nova dva sukpa. Slike E i F prikazuju rezultat ovog poziva za prvi skup. U tom slučaju, samo su dve tačke u skupu i rekurzija se završava vraćajući dve tačke omotača koje čine ivicu (na slici F crna linija označava ivicu omotača).
Sada razmatramo drugi skup (slika G). Primenjujemo prethodni postupak na skupove tačaka sve dok se ne izvrše sve rekurzije za gornji desni ugao i ne formira konveksni omotač za ovu oblast (slika H).
Kada primenimo prethodno izloženu proceduru na gornji levi, donji levi i donji desni ugao, formirali smo
konveksni omotač
(slika I).
Opšti slučaj: Kao u slučaju quicksort funkcije, tačke će biti podeljene u dva jednaka skupa, pa je dubina rekurzije log n. Na svakom nivou rekurzije izvršava se O(n) operacija, stoga je ukupna složenost O(n log n).
Najgori slučaj: Slično slučaju quicksort algoritma, postoje specijalni skupovi koji se ne dele na povoljan način tokom rekurzivnih poziva. Ovo dovodi do O(n) rekurzija, pa je ukupna složenost O(n2).
Najbolji slučaj: Ako se sve tačke mogu eliminisati pri identifikovanju četiri ekstremne tačke (O(n) operacija), tada je dalja obrada nepotrebna i ukupna složenost postaje O(n).
Wenger je objavio randomized QuickHull algoritam sa vremenskom složenošću O(n log h), gde je h broj tačaka u konveksnom omotaču.
Graham je 1972. godine objavio rad u kome je predstavio relativno jednostavan algoritam za računanje konveksnog omotača konačnog skupa tačaka u ravni sa vremenskom složenošću O(n log n) u najgorem slučaju.
U nastavku je izložena verzija algoritma koju je predložio O'Rourke i koja se malo razlikuje od originalnog Graham Scan algoritma.
Prvi korak je identifikacija najniže (krajnje desne) tačke - označimo je sa 0. Ova tačka se mora nalaziti na omotaču (korak A). Sledeći zadatak je sortiranje svih tačaka prema uglu koji zaklapaju sa početnom tačkom, merenom u smeru suprotnom od kretanja kazaljke na satu u odnosu na x-osu (korak B). Tačka koja gradi najveći ugao se gura na stek ispred tačke 0 (korak B). Zatim redom obrađujemo tačke počev od one sa najmanjim uglom (tačka 1), dok ne dođemo do krajnje tačke (tačka 9). Ovaj proces uključuje test za strogo levo skretanje od tačke sa vrha steka ka testiranoj tački. Ako je nađeno skretanje u levo, ta tačka se gura na stek i prelazi se na obradu naredne tačke. Ako nije nađeno skretanje u levo, tada se uklanja tačka sa vrha steka i ista tačka se ponovo proverava. Ovaj proces ilustrovan je koracima C-L.
U koraku C testiramo da li je tačka 1 levo od linije određene tačkama 0 i 9. U ovom slučaju jeste, pa je guramo na stek. Slično, tačke 2 i 3 su gurnute na stek (koraci D i E). Kada testiramo tačku 4, vidimo da je ona desno od linije definisane sa 2 i 3, pa uklanjamo tačku 3 sa vrha steka (korak F). U narednom koraku nalazimo da je tačka 4 levo od tačaka 1,2 i guramo je na stek (korak G). Ipak, kada proverimo tačku 5 u odnosu na 2 i 4, otkrivamo skretanje u desno, te uklanjamo 4 sa vrha steka. Ponovnom proverom tačke 5, zaključujemo da skreće levo od tačaka 1 i 2, pa je ona novi vrh steka. Nastavljamo proces, prvo postavljajući tačku 6, a zatim i 7, na vrh steka (korak J). Naredni test pokazuje da je 8 sa desne strane obe ove tačke, pa ih uklanjamo sa steka (korak K). Daljim razmatranjem dolazimo da toga da 8 treba da bude na steku i konačno stižemo do tačke 9 i završavamo proces (korak L). Konveksni omotač je formiran.
Može biti najviše n guranja i n uklanjanja sa steka, te je složenost ovog dela algoritma O(n). Složenošću dominira sortiranje, a za njega je poznata donja granica O(n log n)
Opšti slučaj: O(n log n).
Najgori slučaj: O(n log n).
Najbolji slučaj: O(n log n).