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

Podobne dokumenty