Zadanie 1
W inkrementalnym problemie otoczki wypukłej chcemy skonstruować algorytm przechowujący zbiór punktów i pozwalający na wykonywanie dwóch operacji:
- DODAJ - dodaje punkt do zbioru ,
- ZAWIERA - sprawdza, czy punkt leży wewnątrz otoczki wypukłej zbioru .
Zaproponuj efektywny algorytm dla tego problemu?
Rozwiązanie
Problem ten można rozwiązać tak aby amortyzowany czas wykonania operacji DODAJ wynosił . Zauważmy, że można do tego wykorzystać pomysł z algorytmu Grahama, który jest tak na prawdę algorytmem inkrementalnym. Jednak musimy zmienić sposób uporządkowania punktów w otoczce, ponieważ punkt o najmniejszej współrzędnej może się w trakcie wykonywania algorytmu zmienić. Punkty otoczki możemy przechowywać w dwóch strukturach posortowane po współrzędnej . Wybieramy punkty z otoczki najbardziej na prawo i najbardziej na lewo i one zadają nam podział na te dwie struktury. Wstawianie do tych struktur jest już przeprowadzane w analogiczny sposób do algorytmu Grahama. Mając te dwie struktury sprawdzenie czy wierzchołek leży wewnątrz otoczki jest bardzo proste, np. możemy po prostu sprawdzić, czy otoczka wypukła zbioru po dodaniu punktu by się zmieniła.
Zadanie 2
Niech będą kolejnymi punktami opisującymi wierzchołki zamkniętego wielokąta . Zaproponuj efektywny algorytm sprawdzania, czy dany punkt leży w jego wnętrzu?
Rozwiązanie
Rozważmy półprostą poziomą zaczynającą się w punkcie . Zauważ, że półprosta ta przecina nieparzystą liczbę razy boki wielokąta wtedy i tylko wtedy gdy punkt leży we wnętrzu wielokąta. Wystarczy więc wyznaczyć liczbę przecięć półprostej z odcinkami .
Zadanie 3
Pokaż jak w czasie sprawdzić, czy w zbiorze punktów są trzy punkty współliniowe.
Rozwiązanie
W tym celu wystarczy dla każdego punktu posortować pozostałe punkty zgodnie z ich współrzędną polarną względem .
Zadanie 4
Triangulacja zbioru punktów to podział otoczki wypukłej na trójkąty w ten sposób, że punkty są wierzchołkami trójkątów. Zaproponuj algorytm wyznaczania triangulacji zbioru punktów .
Rozwiązanie
Warstwy zbioru wyznaczamy w sposób indukcyjny. Warstwa pierwsza to po prostu . Dla warstwę -tą definiujemy jako otoczkę wypukłą zbioru punktów . Zauważ, że każdy zbiór punktów ma co najwyżej niepustych warstw. Można więc je wyznaczyć w całkowitym czasie . Dla każdej warstwy niech będzie wielokątem którego wierzchołki zadane są przez punkty tej warstwy. Mając dwa kolejne wielokąty i bardzo łatwo możemy wyznaczyć triangulację obszaru znajdującego się miedzy nimi. Po prostu łączymy odcinkami w kolejności ich występowania punkty i ze sobą tak aby żadne odcinki się nie przecinały. Suma tych triangulacji da w wyniku triangulację zbioru punktów .