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.