Temat: Geometria obliczeniowa, cz I. Podstawowe algorytmy geometryczne. Problem sprawdzania przynalenoci punktu do wielokta. Problem otoczki wypukłej algorytmy Grahama, i Jarvisa. 1. Oznaczenia Punkty - małe litery: p, q, r, s itd. Współrzdne punktu p na płaszczynie - (x(p), y(p)) Odcinek o pocztku i kocu odpowiednio w punktach p i q: p - q Wektor o pocztku i kocu odpowiednio w punktach p i q: p q Prosta zawierajca punkty p i q: pq Półprosta zaczynajca si w punkcie p i zawierajca punkt q:.pq 2. Operacje elementarne Operacje arytmetyczne: dodawanie, odejmowanie, mnoenie, dzielenie, pierwiastkowanie, itp 3. Załoenia i uwagi rozwaane s obiekty geometryczne na płaszczynie w kartezjaskim układzie współrzdnych algorytmy powinny realizowa jak najmniej operacji powodujcych przyblienia 1
4. Podstawowe algorytmy geometryczne a) Algorytm sprawdzania, po której stronie prostej ley punkt WP: Trzy punkty: p = (x, y), q = (z, t), r = (u, v) WK: Odpowied na pytanie: Po której stronie prostej pq ley punkt r p p r ϕ q Punkt r ley po lewej stronie prostej pq q ϕ r Punkt r ley po prawej stronie prostej pq q p ϕ r Punkty p, q i r s współliniowe 2
Algorytm Obliczamy warto wyznacznika det( p, q, r), którego znak jest równy znakowi sinusa kta nachylenia wektora p r do wektora p q. det (, q, r) p = x z u y t v 1 1 1 Jeeli det( p, q, r) > 0 to sin ϕ > 0 i wówczas punkt r ley po lewej stronie prostej pq. Jeeli det( p, q, r) < 0 to sin ϕ < 0 i wówczas punkt r ley po prawej stronie prostej pq. Jeeli det( p, q, r) = 0 to sin ϕ = 0 i wówczas punkty p, q i r s współliniowe. 3
b) Algorytm sprawdzania, czy dwa dane punkty le po tej samej stronie prostej WP: Cztery punkty: p = (x, y), q = (z, t), a = (b, c), d = (e, f ) WK: Odpowied na pytanie, czy punkty a i b le po tej samej stronie prostej pq. a p d q Algorytm Przypomnijmy funkcj znaku liczby: 1 gdy x > 0 sgn( x) = 0 gdy x = 0 1 gdy x < 0 Punkty a i d le po tej samej stronie prostej pq wówczas, gdy: sgn det p, q, a = sgn det p, q, d ( ( )) ( ( )) 4
c) Algorytm sprawdzania, czy punkt naley do odcinka WP: Trzy punkty: p = (x, y), q = (z, t), r = (u, v) WK: Odpowied na pytanie, czy punkt r naley do odcinka p - q. Y r q p Algorytm 0 X Jeeli punkt r naley do odcinka p-q, to rzuty prostoktne r na osie (OX i OY) "zawieraj si" w rzutach prostoktnych odcinka p-q. Wynika std, e r naley do odcinka p-q wtedy i tylko wtedy gdy: x( p) x( r) x( q) sgn ( det( p, q, r) ) = 0 przy załoeniu, e x p x q ( ) ( ) i y( p) y( r) y( q) sgn ( det( p, q, r) ) = 0 ( p) y( q) y przy załoeniu, e 5
d) Algorytm sprawdzania, czy dwa odcinki si przecinaj WP: Cztery punkty: p = (x, y), q = (z, t), a = (b, c), d = (e, f ) wyznaczajce dwa odcinki: p-q i a-d. WK: Odpowied na pytanie, czy odcinki p-q i a-d przecinaj si. a d p a d p q q Algorytm Rozwizanie opiera si na spostrzeeniu, e dwa odcinki przecinaj si wtedy i tylko wtedy, gdy punkty p i q le po przeciwnych stronach prostej ad i punkty a i d le po przeciwnych stronach prostej pq lub który z koców jednego z odcinków naley do drugiego. Czyli: ( sgn ( det ( p, q, d )) sgn ( det ( p, q, a )) sgn ( det ( a, d, p )) sgn ( det ( a, d, q ))) ( sgn( det( p, q, a) ) = 0 ( x( p) x( a) x( q) y( p) y( a) y( q) )) ( sgn( det( p, q, d) ) = 0 ( x( p) x( d) x( q) y( p) y( d) y( q) )) ( sgn( det( a, d, p) ) = 0 ( x( a) x( p) x( d) y( a) y( p) y( d) )) ( sgn( det( a, d, q) ) = 0 ( x( a) x( q) x( d) y( a) y( q) y( d) )) przy załoeniu, e x( p) x( q) i y( p) y( q) w przypadku, gdy punkt a lub d naley do p-q i x( a) x( d ) i y( a) x( d ) w przypadku, gdy punkt p lub q naley do a-d 6
5. Problem przynalenoci punktu do wielokta WP: Dany jest cig punktów: w0, w1,..., w n 1 okrelajcy n - wierzchołkowy wielokt W i taki, e dla kadego i = 0,1,..., n 1 odcinek w i w i+ 1 jest bokiem wielokta W (i+1 jest wyliczane modulo n). Dany jest równie punkt p. WK: Odpowied na pytanie, czy punkt p naley do wielokta W. Jeeli punkt p ley na boku wielokta, to stwierdzamy, e naley do wielokta Algorytm rozwizujcy problem przynalenoci opiera si na zalenoci pomidzy liczb przeci dowolnej półprostej o pocztku w punkcie p, a bokami wielokta. p l Punkt p naley do wielokta W wtedy i tylko wtedy, gdy półprosta.pl przecina boki wielokta nieparzyst ilo razy. Zachodz przy tym dwa przypadki szczególne: Półprosta.pl przechodzi przez wierzchołek wielokta. Półprosta.pl zawiera bok wielokta. 7
Uwaga!!! Zanim zaczniemy wyznacza liczb punktów przecicia półprostej z bokami wielokta, sprawdzamy, czy punkt p nie zawiera si w którym z boków wielokta. a 11 p a 1 a 3 a 6 a 2 a 4 a 5 a 7 a 8 a 10 l a 9 Prosta pl zawiera bok a 4 a 5 wielokta. Niech a 3 a 4 oraz a 5 a 6 bd bokami ssiadujcymi z bokiem a 4 a 5, a punkty a 3 i a 6 bd ich kocami tych boków. Jeeli punkty a 3 i a 6 le po tej samej stronie prostej pl, to przyjmujemy, e liczba punktów przecicia pl z bokami a 4 a 5, a 3 a 4 i a 5 a 6 wynosi 0. W przeciwnym razie przyjmujemy, e liczba ta wynosi 1. Prosta pl zawiera wierzchołek a 2 wielokta. Niech a 1 a 2 oraz a 2 a 3 bd bokami ssiadujcymi z wierzchołkiem a 2, a punkty a 1 i a 3 bd ich kocami tych boków. Jeeli punkty a 1 i a 3 le po tej samej stronie prostej pl, to przyjmujemy, e liczba punktów przecicia pl z bokami a 1 a 2 i a 2 a 3 wynosi 0. W przeciwnym razie przyjmujemy, e liczba ta wynosi 1. 8
Poniewa koszt oblicze zwizanych z kadym bokiem i wierzchołkami n - kta jest stały, złoono sprawdzenia, czy punkt ley w jego wntrzu, jest O(n). 6. Otoczka wypukła Otoczk wypukł dowolnego niepustego zbioru punktów S nazywamy najmniejszy zbiór wypukły zawierajcy S. Mona udowodni, e jeli S jest zbiorem skoczonym, to jego otoczka wypukła jest wieloktem wypukłym o wierzchołkach ze zbioru S (czasami zredukowanym do odcinka lub punktu). WP: Skoczony zbiór punktów S { p, 1 p2,..., p n } =. WK: Cig punktów W : po 1, po2,..., pow taki, e p oi S (dla kadego i = 1, 2,..., w), wyznaczajcy wierzchołki najmniejszego wielokta wypukłego zawierajcego wszystkie punkty z S. Kolejno punktów w cigu W okrela kolejno wierzchołków na obwodzie wielokta w kierunku przeciwnym do ruchu wskazówek zegara. p o3 = p 9 p o2 = p 6 p o1 = p 2 p o4 = p 1 p 3 p 7 p o7 = p 10 p 5 p o5 = p 8 p o6 = p 4 9
a) Algorytm naiwny Algorytm naiwny wyznaczania otoczki wypukłej opiera si na nastpujcym spostrzeeniu (*): Punkt p nie jest punktem otoczki wypukłej zbioru S wtedy i tylko wtedy, gdy ley wewntrz pewnego trójkta o wierzchołkach z S, rónych od p, lub naley do odcinka łczcego dwa punkty z S, róne od p. p o3 = p 9 p o2 = p 6 p o1 = p 2 p o4 = p 1 p 3 p 7 p o7 = p 10 p 5 p o5 = p 8 p o6 = p 4 Punkt p 3 nie naley do otoczki wypukłej poniewa ley wewntrz trójkta p 9 p 1 p 4. Punkt p 5 nie naley do otoczki wypukłej poniewa naley do odcinka p 6 - p 8. 10
Algorytm naiwny Krok 1: Sprawdzi, które punkty ze zbioru S nale do otoczki wypukłej stosujc kryterium okrelonym w spostrzeeniu (*). Krok 2: Uporzdkowa znalezione punkty w kolejnoci ich wystpowania na obwodzie otoczki wypukłej. Koszt czasowy algorytmu naiwnego Rozmiar zadania: n = S - liczba punktów zbioru S. Operacja elementarna: - operacja sprawdzania, czy punkt naley do trójkta (odcinka) w Kroku 1, - operacja porównania wykonana w trakcie sortowania w Kroku 2. Koszt czasowy Kroku 1: Dla n punktów trzeba sprawdzi co n najwyej 3 rónych trójktów. Std koszt Kroku 1 jest O(n 4 ). Koszt czasowy Kroku 2: Jeeli zastosujemy optymaln metod sortowania to koszt czasowy Kroku 2 jest O(nlogn). Całkowity koszt czasowy algorytmu naiwnego jest wic rzdu O(n 4 ). Efektywne algorytmy rozwizujce problem otoczki wypukłej, algorytm Grahama i Jarvisa, maj zasadniczo niszy koszt. 11
Sortowanie zbioru punktów w celu wyznaczenia kolejnoci punktów otoczki po obwodzie wielokta WP: Zbiór P { p p,..., } = 1, 2 p n - punktów bdcych wierzchołkami wielokta wypukłego W. WK: Posortowany cig punktów zbioru P według niemalejcej wartoci kta nachylenia ich wektorów wodzcych do osi OX. p3 p 6 p 2 p 1 O X p 5 p 4 12
Algorytm 1. Wyznaczamy centroid wielokta W. Jest to punkt o współrzdnych: ( x( p ) + x( p ) + + x( p )) ( y( p ) + y( p ) + y( p )) 1 2... n 1 2... +, n n Bez straty ogólnoci moemy przyj, e rodek układu współrzdnych znajduje si w centroidzie wielokta W. 2. W celu porównania któw nachylenia wektorów wodzcych sortowanych punktów do osi OX obliczamy wartoci nastpujcej funkcji alfa, okrelonej dla wszystkich punktów płaszczyzny rónych od punktu O. n y( p), d( p) y( p) 2 -, d( p) alfa( p) = y( 2 + d( p) y( 4 - d( p) gdzie d ( p) = x( p) + y( p).,, gdy gdy gdy gdy x x x ( p) > 0 y( p) ( p) 0 y( p) x ( p) < 0 y( p) ( p) 0 y( p) 0 > 0 0 < 0 Mona udowodni, e kt nachylenia wektora wodzcego punktu p i jest mniejszy równy od kta nachylenia wektora wodzcego punktu p j wtedy i tylko wtedy, gdy: ( p ) alfa( ) alfa i p j. Funkcja alfa umoliwia wyznaczenie kolejnoci wierzchołków na obwodzie wielokta wypukłego w czasie O(nlogn). 13
b) Algorytm Grahama Algorytm Grahama opiera si na nastpujcym spostrzeeniu (**): Kady punkt nie bdcy wierzchołkiem otoczki wypukłej musi nalee do wntrza trójkta o wierzchołkach: O i pewne dwa kolejne wierzchołki otoczki (lub ley na jednym z boków takiego trójkta). p 3 p 2 p 6 p 1 O p 4 X s=p 5 p 7 Punkt p 6 nie naley do otoczki poniewa ley we wntrzu trójkta O p 1 p 3. Punkt p 4 nie naley do otoczki poniewa punkt ten ley na boku trójkta O p 7 p 1. 14
Algorytm Krok 1: Wybieramy dowolny punkt O lecy wewntrz otoczki wypukłej, na przykład centroid. Umieszczamy w nim rodek układu współrzdnych i obliczamy współrzdne punktów wejciowych w nowym układzie współrzdnych. Krok 2: Porzdkujemy punkty p 1, p 2,..., p n leksykograficznie wzgldem współrzdnych biegunowych ( α i, r i ), gdzie α i jest ktem nachylenia wektora wodzcego O pi do osi OX, a r i jego długoci. (Aby nie liczy pierwiastków, w sortowaniu 2 porównujemy alfa ( p i ) zamiast α i oraz ri zamiast r i ). Z uporzdkowanych punktów tworzymy dwukierunkow list cykliczn, w której dla kadego punktu p, p->next jest nastpnym (cyklicznie) punktem w wyej zdefiniowanym porzdku, a p->prev poprzednim. Sporód punktów o najmniejszej współrzdnej y ustalamy punkt s z najmniejsz współrzdn x. 15
Krok 3: Przegldamy punkty na licie, usuwajc te, które nie s wierzchołkami otoczki wypukłej. Po zakoczeniu działania algorytmu lista bdzie zawierała tylko wierzchołki otoczki wypukłej w kolejnoci ich wystpowania na obwodzie. List przegldamy, zaczynajc od punktu s i kierujc si w stron przeciwn do ruchu wskazówek zegara ( zgodnie ze wskanikiem next). W celu wyeliminowania zbdnych punktów zawsze sprawdzamy trzy kolejne punkty q, q 1 2 i q 3 z biecej listy. Jeli punkt q2 ley wewntrz trójkta Oq q 1 3 to usuwamy go z otoczki i przechodzimy do sprawdzania punktów q, q, q 0 1 3. W przeciwnym razie kolejn badan trójk punktów s q 2, q3, q4. Przegldanie koczymy z chwil osignicia wierzchołka startowego s. Algorytm realizujcy Krok 3 mona zapisa nastpujco: q=s; while (q->next!= s) if q->next ley wewntrz trójkta O q q->next->next { q->next=q->next->next; q->next->prev=q; if (q!= s) q=q->prev; } else q=q->next; 16
q 3 q 4 q 2 q 1 q 5 = s O q 6 q 7 X Koszt czasowy algorytmu Grahama Na złoono algorytmu Grahama decydujcy wpływ ma Krok 2. Kroki 1 i 2 wykonywane s w czasie liniowym. Krok 2 mona zrealizowany w czasie O(nlogn), stosujc efektywn metod sortowania (np. sortowanie przez scalanie, sortowanie przez połówkowe wstawianie czy sortowanie szybkie). Łatwo zauway, e zamiast sprawdza, czy punkt q->next ley wewntrz trójkta O q q->next->next mona testowa, czy q->next ley po lewej stronie (lub naley do) wektora q next > next. Złoono algorytmu Grahama nie zaley od liczby punktów otoczki wypukłej. Nastpny algorytm rozwizujcy problem otoczki, algorytm Jarvisa, ma złoono O(kn), gdzie k jest liczb punktów otoczki wypukłej w danym n elementowym zbiorze punktów. 17
c) Algorytm Jarvisa Algorytm Jarvisa oparty jest na dwóch spostrzeeniach: 1) Odcinek p-q o kocach ze zbioru S jest bokiem otoczki wypukłej wtedy i tylko wtedy, gdy wszystkie punkty z S nale do tej samej domknitej półpłaszczyzny wyznaczonej przez prost pq, a kady punkt S lecy na tej prostej naley do odcinka p-q. 2) Jeli odcinek p-q jest bokiem otoczki wypukłej, która nie jest zdegenerowana do odcinka lub punktu, to musi istnie bok róny od p-q, zaczynajcy si w q (analogiczny warunek jest te spełniony dla punktu p). p 9 =p p 6 =q p 2 =q p 1 p 3 p 7 = p p 10 p 5 p 8 p 4 18
Algorytm Krok 1: Ustalamy punkt d, który ma najmniejsz współrzdn x sporód wszystkich punktów z najmniejsz współrzdn y. Ustalamy punkt g, który ma najwiksz współrzdn x sporód wszystkich punktów z najwiksz współrzdn y. Obydwa punkty d i g s wierzchołkami otoczki wypukłej. Krok 2: p=d; while (p!= g) { umieszczamy rodek układu współrzdnych w punkcie p ; r = punkt o najwikszej odległoci od p, wród wszystkich punktów o najmniejszym kcie nachylenia wektora wodzcego do osi px ; // wszystkie punkty z S le w jednej półpłaszczynie // wyznaczonej przez prost pr. Odcinek p-r jest // kolejnym bokiem otoczki wypukłej p->next=r; r->prev=p; p=r; } Krok 3: Powtarzamy Krok 2, przyjmujc, e za punkt startowy g, a punkt kocowy d. Rozwamy tylko punkty o ktach nachylenia promieni wodzcych wikszych równych 180 0. 19
g p=d r Złoono czasowa algorytmu Jarvisa Kada iteracja w Krokach 2 i 3 jest wykonywana w czasie O(n). Poniewa liczba iteracji jest równa liczbie wierzchołków otoczki, to koszt całkowity algorytmu Jarvisa wynosi O(kn). Algorytm ten jest szczególnie przydatny wtedy, gdy wiemy, e liczba punktów otoczki wypukłej jest niewielka w porównaniu z rozmiarem zbioru S (tj. ograniczona przez stał niezalen od n). 20