Geometria obliczeniowa

Transkrypt

Geometria obliczeniowa
Geometria obliczeniowa
Geometria obliczeniowa znajduje zastosowania między innymi w grafice komputerowej,
robotyce i statystyce.
Algorytmy: badanie wzajemnego położenia obiektów geometrycznych, problem otoczki
wypukłej, który jest najważniejszym problemem geometrii obliczeniowej.
Otoczka wypukła jest najmniejszym wielokątem wypukłym ograniczającym dany zbiór
punktów. Algorytm Grahama, nie tylko znajduje punkty otoczki, ale też podaje kolejność ich
występowania na obwodzie otoczki. Koszt tego algorytmu - O(n lg n). Algorytm Jarvisa. Tu
koszt konstrukcji otoczki istotnie zależy od wyniku, a dokładniej od liczby punktów otoczki
wypukłej i wynosi O(k n), gdzie n jest liczbą rozważanych punktów zbioru, a k liczbą
wierzchołków otoczki wypukłej. Jeśli z góry znamy liczbę wierzchołków konstruowanej
otoczki i jest ona niezależna od liczby rozważanych punktów, to koszt algorytmu Jarvisa jest
liniowy. W przypadku pesymistycznym, np. wtedy, gdy wszystkie punkty leżą na obwodzie
koła, koszt algorytmu Jarvisa jest kwadratowy.
Problem otoczki wypukłej jest jednym z pierwszych problemów geometrycznych, dla których
znaleziono nietrywialne dolne oszacowanie złożoności O(n lg n). Algorytm Grahama jest
więc optymalnym rozwiązaniem tego zadania.
Iloczyn wektorowy
Niech p1 i p2 będą dwoma punktami na płaszczyźnie, p1 = (p1.x, p1.y), p2 = (p2.x, p2.y).
Iloczynem wektorowym wektorów zaczepionych w początku układu współrzędnych i o
końcach odpowiednio w punktach p1 i p2 jest wektor x = p1 x p2 prostopadły do obu
wektorów, taki że trójka uporządkowana p1, p2 , x ma orientację dodatnią oraz długość
wektora x, |x| = |p1| *|p2| * sin a gdzie a jest kątem między tymi wektorami. Mnożenie
wektorowe jest to operacja, której wynikiem jest nowy wektor.
Najważniejsza okazuje się interpretacja wartości | p1 x p2|, jako pola równoległoboku,
utworzonego przez punkty (0,0), p1, p2, i p1+ p2, opatrzonego znakiem, oraz fakt, że wartość
tego pola można wyliczyć jako wartość wyznacznika utworzonego przez współrzędne
wektorów p1 i p2.
| p1 x p2| = det( p1 , p2 ) = p1.x * p2.y - p2.x *p1.y.
Na podstawie tego wzoru, jest oczywiste, że |p2 x p1| = -|p1 x p2|. Wynika stąd jeszcze, że
znak wyznacznika det( p1, p2 ) mówi o wzajemnym położeniu wektorów p1, p2.
Ogólniejsza sytuacja: niech będą dwa odcinki p0p1 i p0p2 zaczepione w punkcie p0 i
skierowane w stronę p1 i p2odpowiednio. Aby stwierdzić jak są one położone względem
siebie, przesuniemy punkt wspólny p0 do początku układu współrzędnych. W wyniku
przesunięcia otrzymamy wektory (p1-p0 ) i (p2-p0), których wzajemne położenie jest takie
samo, jak wektorów p0p1 i p0p2 .
Lemat Niech p0, p1, p2 będą dowolnymi punktami na płaszczyźnie i niech z będzie wartością
| (p1-p0) x (p2-p0)| .
•
Jeżeli z = 0, to punkty p0, p1 i p2 są współliniowe.
•
•
Jeżeli z < 0, to punkt p2 leży po prawej stronie prostej wyznaczonej przez
wektor p0p1.
Jeżeli z > 0, to punkt p2 leży po lewej stronie prostej wyznaczonej przez wektor p0p1.
Z lematu wynika, że jeśli | (p1-p0) x (p2-p0)| >0, to p2 jest położone względem p1 przeciwnie
do ruchu wskazówek zegara, lub inaczej, przesuwając się wzdłuż wektora od punktu p0 do
p1, punkt p2 mamy zawsze po lewej ręce p2 leży w kierunku zgodnym z ruchem wskazówek
zegara względem p1.
http://informatyka.wroc.pl/node/455?page=0,0
http://www-users.mat.umk.pl/~stencel/acm/algorytmika_praktyczna.pdf
http://edu.pjwstk.edu.pl/wyklady/asd/scb/asd13/index13.html
http://informatykaplus.edu.pl/upload/list/czytelnia/geometra_obliczeniowa.pdf
http://www.algorytm.org/geometria-obliczeniowa/
http://was.zaa.mimuw.edu.pl/?q=node/15
http://www.asdpb.republika.pl/asdwyk15.pdf
http://www.asdpb.republika.pl/wyk38.pdf
Zadania
Zadanie 1
Dany jest zbiór n prostokątów na płaszczyźnie (o bokach niekoniecznie równoległych do osi).
Należy znaleźć obwód części wspólnej tych prostokątów, lub stwierdzić że jest ona pusta.
Zadanie 2
Dany jest zbiór n prostokątów na płaszczyźnie o bokach równoległych do osi. Pionowe boki
wszystkich prostokątów mają długość 1. Należy znaleźć pole sumy tych prostokątów.
Zadanie 3
Wielokąt nazywamy monotonicznym, gdy istnieje taka prosta k (kierunek
monotoniczności), że dowolna prosta prostopadła do k przecina wielokąt w co najwyżej
dwóch punktach. Przekątną wielokąta nazywamy odcinek całkowicie zawarty w wielokącie,
łączący jego dwa wierzchołki. Wielokąt reprezentowany jest przez ciąg kolejnych
wierzchołków. Zaproponuj algorytm podziału wielokąta monotonicznego nie przecinającymi
się przekątnymi na maksymalnie dużo trójkątów, gdy znany jest jego kierunek
monotoniczności.
Zadanie 4
Dany jest zbiór n odcinków na płaszczyźnie. Zaproponuj efektywny algorytm
sprawdzający, czy tworzą one brzeg dokładnie jednego wielokąta prostego (bez przecięć
krawędzi i dziur).
Zadanie 5
Dany jest zbiór n odcinków na płaszczyźnie. W jednym punkcie płaszczyzny
mogą spotykać się tylko dwa odcinki i jeśli tak jest, to spotykają się one tylko w końcach.
Sprawdź, czy odcinki tworzą łamaną zamkniętą i jeśli tak jest, oblicz pole wielokąta
ograniczonego tą łamaną.
Zadanie 6
Dany jest zbiór S zawierający n trójkątów na płaszczyźnie. Boki dowolnych dwóch trójkątów z
S są rozłączne (ale może się zdarzyć, że jeden trojkąt zawiera się w drugim). Znajdź
wszystkie trójkąty z S, które nie zawierają się w innym trójkącie z S
Zadanie 7
Znajdź wszystkie przecięcia danych n okręgów w czasie O((n+k) log(n+k)), gdzie k to liczba
przecięć. Można założyć, że w żadnym punkcie nie przetną się więcej niż dwa okręgi.