Grafika komputerowa Lista 2
Transkrypt
Grafika komputerowa Lista 2
Grafika komputerowa Lista 2 Tomasz Strumiński 1 Otoczka wypukła i wielokąty Tematyką listy jest kilka prostych algorytmów operujących na wielokątach (lub takich, których efektem działania są wielokąty). Rysowanie wielokątów z tej listy powinno odbywać się za pomocą metod dostępnych w klasie GraphicP rimitives (a w zasadzie metody – drawLine). Zadanie 1. (2 pkt) Zaimplementuj jeden z algorytmów do wyznaczania otoczki wypukłej puntków na płaszczyźnie (patrz: notatki do wykładu). W tym celu należy stworzyć klasę P oint, która będzie reprezentowała punkt na płaszczyźnie. Do klasy potomnej GraphicP rimitives (z poprzedniej listy) należy z kolei dodać implementację metody Point[] computeConvexHull(Point points[]), przy czym metoda ma zwracać kolejne punkty należące do wypukłej otoczki przekazywanego zbioru punktów points. Działanie metody wyznaczania wypukłej otoczki powinno być przetestowane na losowym zbiorze punktów. W klasie potomnej do GraphicP rimitives należy przerobić metodę drawP olygon tak, aby mogła przyjmować tablicę punktów na płaszczyźnie, a nie dwie tablice liczb całkowitych. Uwaga: Dodatkowe 2 punkty można dostać za napisanie programu ilustrującego krok po kroku wykonywanie wybranego algorytmu. Zadanie 2. (1 pkt) Należy zaproponować sposób (i napisać kod metod) tworzenia losowych wielokątów. Klasę dziedziczącą po GraphicP rimitives należy zaopatrzeć w metodę Point[] randomConvexPolygon(int vertexCount, int width, int height), która przyjmuję jako parametr liczbę wierzchołków wielokąta wypukłego, a zwraca kolejne wierzchołki wygenerowanego wielokąta wypukłe1 go. Parametry width i height określają maksymalne pionowe i poziome wspołrzędne ekranowe wierzchołków. Z kolei metoda: Point[] randomPolygon(int vertexCount, int width, int height), powinna zwrócic kolejne wierzchołki losowego wielokąta prostego bez dziur (patrz: notatki do wykładu). Zadanie 3. (2 pkt) Wykorzystać algorytm Sutherlanda-Hodgmana do realizacji obcinanie wielokąta do okna. W tym celu należy uzupełnić klasę GraphicP rimitives o następującą metodę Point[] polygonClipping(Point[] polygon, int x0, int y0, int x1, int y1), gdzie para (x0, y0) reprezentuje lewy górny wierzchołek okna, natomiast para (x1, y1) prawy dolny wierzchołek okna, do którego przycinamy wielokąty. Algorytm należy testować na losowych wielokątach z poprzedniego zadania. Zadanie 4*. (2 pkt) Zaimplementować algorytm wyznaczania części wspólnej wielokątów wypukłych (patrz: notatki do wykładu), czyli napisać metodę Point[] convexPolygonIntersection(Point[] polygon1, Point[] polygon2), gdzie polygon1 i polygon2 są wielokątami wypukłymi. Fragment zadania 1 oraz zadanie 4* są oczywiście nieobowiązkowe (dodatkowe punkty). 2