GEOMETRIAI
ALGORITMUSOK
Konvex burok
Miről lesz szó?
1. Bevezetés: miért fontos, gyakorlati alkalmazások 2. Elmélet, algoritmusok
– Graham- féle pásztázás – Jarvis menetelése
– Egyéb algoritmusok
3. Példakódok, videók
Bevezetés
■ ’70-es évek: algoritmus kutatók elkezdenek érdeklődni a geometriai problémák iránt.
■ Gyakorlati alkalmazása:
– például: alakfelismerés, képfeldolgozás, statisztika, földrajzi információs rendszerek, játékelmélet, fázisdiagramok előállítása
– eszközként, építőelemként is szolgál más számítási
geometriai algoritmusok részeként, például: a
ponthalmaz szélességét és átmérőjét
■ Konkrét példák:
– Autóknál ütközés megakadályozása – Anomália detektálás
– Méret elemzés
– Csomagolás: legkisebb doboz kiszámítása
Elmélet
■ Konvex síkidom: olyan síkidom, amely bármely két pontját összekötő egyenes szakasz minden pontját tartalmazza. (Az ilyen udvarban nem lehet elbújni.)
■ Konvex burok: egy Q ponthalmaz konvex burka az a legkisebb P konvex poligon, amelyre Q minden pontja vagy P határán van, vagy a belsejében.
■ Poláris szög: a polárkoordináta-rendszer olyan kétdimenziós koordináta-rendszer, mely a sík
minden pontját egy szög és egy távolság adattal látja el.
■ Keresztszorzat (vektoriális szorzat):
Az eredményvektor
• állása merőleges mind a-ra, mind b-re
• iránya olyan, hogy a,b és c jobbsodrású rendszert alkot
■ Forgásirány: keresztszorzat segítségével meg tudjuk állapítani
• jobbsodrású
• balsodrású
Előnye: nem kell kiszámolni pontos szöget, meg lehet mondani anélkül is előbb-utóbb, hogy a
konvex burok csúcsa-e az adott pont.
Algoritmusok
Általánosságban:
– N elemű ponthalmaz konvex burkát határozzák meg – 2 legismertebb:
o Graham-féle pásztázás (1972) o Jarvis-menetelés (1973)
– Mindkettő használja a „forgásos söprés” technikát, amely a csúcsokat egy vonatkoztatási csúcs körüli poláris szög szerinti sorrendben dolgozza fel.
– Output: konvex burok csúcsai óramutató járásával ellentétes sorrendben
Algoritmusok
Graham-féle pásztázás
Alapötlet:
Minden Q − beli pontot beírunk egyszer az S verembe. Azokat a pontokat, amelyek nem csúcsai a konvex buroknak, előbb-utóbb kivesszük a veremből. Amikor az algoritmus véget ér, S pontosan CH(Q) csúcsait tartalmazza.
Futásideje: O (n*logn)
■ Kezdőpont (kódban: első sor): O(n).
■ Rendezés (második sor): O(n*logn) (ha a poláris szögek rendezésére az összefésülő vagy kupacrendezést használjuk, a szögek összehasonlítására pedig a keresztszorzatos módszert).
■ P0, P1 és P2 verembe tétele O(1).
■ Mivel m ≤ n − 1, a for ciklusok magját legfeljebb n − 3 alkalommal (P0,P1,Pm nem) hajtjuk végre.
■ A ciklusmag mindegyik végrehajtása O(1) ideig tart, kivéve a while ciklusban töltött időt.
■ Egész for ciklus O(n) ideig tart, kivéve a beágyazott while ciklust.
■ While ciklus összesen O(n) ideig tart.
Algoritmusok Jarvis mentelés
■ Ajándék csomagolás néven is ismert
■ Lépései:
Jobb oldali lánc (amíg el nem érjük a legfelső pontot):
– P0 kiválasztása (has. Graham) – P1 aminek a legkisebb a P0 körüli
poláris szöge (vagy ezek közül a legtávolabbi)
– Hasonlóan a P2 a P1 körül legkisebb poláris szögű pont és így tovább
Bal oldali lánc:
– Induljunk Pk -ból és legyen Pk+1 az a pont, amelynek a negatív x-tengelytől mérve legkisebb a poláris szöge Pk
körül.
– Folytatjuk, míg vissza nem érünk P0- ba.
Jarvis menetelését a konvex burok körül egyetlen fordulóban is megírhatnánk -->
az utoljára kiválasztott oldalának szögét tartanánk nyilván és azt követelnénk meg, hogy az oldalak szöge szigorúan monoton növekedjen (a [0, 2π) tartományban, radiánban).
Vizuális példa videó:
https://en.wikipedia.org/wiki/G ift_wrapping_algorithm#/media/F ile:Animation_depicting_the_gif
Futásideje: O (n*h)
■ CH(Q) minden h csúcsára megkeressük a legkisebb poláris szögű csúcsot.
■ A poláris szögek közötti minden összehasonlítás O(1) idő.
■ n érték minimumát O(n) időben kereshetjük, ha minden összehasonlítás O(1) idejű.
Egyéb módszerek:
■ Növekvényes, oszd-meg-és-uralkodj, eltávolító és kereső, Chan-algoritmus
■ Chan- algoritmus (1993):
• Graham, Jarvis és az oszd-meg-és-uralkodj kombinációjából https://www.youtube.com/watch?v=ZnTiWcIznEQ
• Keressünk egy "mágikus" m értéket, amely minden pontot n/m részhalmazba oszt, ahol minden részhalmaz m pontot tartalmaz (rendezés nélkül). m legyen h-hoz minél
közelebbi.
• Minden részhalmazra használjuk Graham algoritmusát a részburok kiszámítására.
• Minden részburokra használjuk Jarvis algoritmusát a végső konvex burok meghatározására
• Futási idő az output méretétől függ: O (n*log h)
■ Python kód: „ló becsomagolása”
Források
Előadás diák:
■ http://cs.bme.hu/~friedl/algbony/konvexburok.pdf
Könyv: Új algoritmusok (Geometriai algoritmusok fejezet) 2003
■ http://www.informatom.hu/sze/01/LGB_SZ001/Cormen-Lieserson- Rivest-Stein.-.Uj.algoritmusok.pdf
Python kód:
■ http://scikit-
image.org/docs/dev/auto_examples/edges/plot_convex_hull.html#sph x-glr-download-auto-examples-edges-plot-convex-hull-py