GKIW Moduł 3: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 1: | Linia 1: | ||
{| border="0" cellpadding=" | __TOC__ | ||
| | = Wykład = | ||
{| border="0" cellpadding="4" width="100%" | |||
|width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd_intro.png|thumb|500px]] | |||
|valign="top"| | |valign="top"| | ||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd0.png|thumb|500px]] | ||
|valign="top"|Tworzenie obrazu na monitorze lub urządzeniu drukującym wymaga wypełnienia wybranego obszaru pikseli określonymi barwami w taki sposób, aby powstał zamierzony rysunek. Korzystając z edytora graficznego wybieramy pewne obiekty podstawowe – tak zwane prymitywy (np. odcinek) i żądamy narysowania ich w określonym miejscu. Nie zastanawiamy się w tym momencie nad tym, że żądanie to, z pozoru bardzo proste, wymaga rozwiązanie wielu problemów geometrycznych oraz opracowania skutecznych i szybkich algorytmów. I to bez względu na to czy będzie to realizowane przez odpowiednią bibliotekę czy tez sprzętowo przez kartę graficzną | |valign="top"|Tworzenie obrazu na monitorze lub urządzeniu drukującym wymaga wypełnienia wybranego obszaru pikseli określonymi barwami w taki sposób, aby powstał zamierzony rysunek. Korzystając z edytora graficznego wybieramy pewne obiekty podstawowe – tak zwane prymitywy (np. odcinek) i żądamy narysowania ich w określonym miejscu. Nie zastanawiamy się w tym momencie nad tym, że żądanie to, z pozoru bardzo proste, wymaga rozwiązanie wielu problemów geometrycznych oraz opracowania skutecznych i szybkich algorytmów. I to bez względu na to czy będzie to realizowane przez odpowiednią bibliotekę czy tez sprzętowo przez kartę graficzną | ||
Linia 14: | Linia 18: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd1.png|thumb|500px]] | ||
|valign="top"|Jednym z podstawowych problemów tego typu jest '''zadanie narysowania odcinka na mapie pikseli'''. Najprostszym rozwiązaniem wydaje się poprowadzenie prostej przez końce odcinka i opisanie jej równaniem <math>y=m\cdot x</math>. Następnie wyznaczenie wartości <math>y_i\,</math> dla całkowitych wartości <math>x_i\,</math> odpowiadających kolejnym kolumnom pikseli. Jeśli teraz przybliżymy współrzędne <math>y_i\,</math> do wartości całkowitej, to otrzymamy współrzędne dla kolejnych pikseli tworzących odcinek tzn. <math>y_i=ROUND(m\cdot x_i)</math> , gdzie <math>ROUND()\,\,</math> jest operacją zaokrąglania do najbliższej wartości całkowitej. Tak skonstruowany algorytm przyrostowy ma podstawową wadę. Wymaga operacji zmiennopozycyjnych (mnożenia, dodawania, zaokrąglania). | |valign="top"|Jednym z podstawowych problemów tego typu jest '''zadanie narysowania odcinka na mapie pikseli'''. Najprostszym rozwiązaniem wydaje się poprowadzenie prostej przez końce odcinka i opisanie jej równaniem <math>y=m\cdot x</math>. Następnie wyznaczenie wartości <math>y_i\,</math> dla całkowitych wartości <math>x_i\,</math> odpowiadających kolejnym kolumnom pikseli. Jeśli teraz przybliżymy współrzędne <math>y_i\,</math> do wartości całkowitej, to otrzymamy współrzędne dla kolejnych pikseli tworzących odcinek tzn. <math>y_i=ROUND(m\cdot x_i)</math> , gdzie <math>ROUND()\,\,</math> jest operacją zaokrąglania do najbliższej wartości całkowitej. Tak skonstruowany algorytm przyrostowy ma podstawową wadę. Wymaga operacji zmiennopozycyjnych (mnożenia, dodawania, zaokrąglania). | ||
Linia 22: | Linia 26: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd2.png|thumb|500px]] | ||
|valign="top"|Rozwiązanie oparte w całości na arytmetyce stałopozycyjnej zaproponował Bresenham w 1965 roku. Jest to algorytm przyrostowy, w którym jedna współrzędna np. x wzrasta w każdym kroku o 1, tzn. <math>x_{i+1}=x_i+1</math> . Bez zmniejszania ogólności można przyjąć, że wystarczy opracować algorytm dla nachylenia odcinka od 0 do 1. (Jest to 1/8 układu współrzędnych. Dla innych wartości można bowiem odpowiednio zamienić zmienne lub znaki przed nimi.) Wzrost y w takim przypadku zależy od wyboru piksela (S lub T), który jest bliżej teoretycznej prostej. O wyborze decyduje zmienna kontrolna d, która jest uaktualniana w każdym kroku. | |valign="top"|Rozwiązanie oparte w całości na arytmetyce stałopozycyjnej zaproponował Bresenham w 1965 roku. Jest to algorytm przyrostowy, w którym jedna współrzędna np. x wzrasta w każdym kroku o 1, tzn. <math>x_{i+1}=x_i+1</math> . Bez zmniejszania ogólności można przyjąć, że wystarczy opracować algorytm dla nachylenia odcinka od 0 do 1. (Jest to 1/8 układu współrzędnych. Dla innych wartości można bowiem odpowiednio zamienić zmienne lub znaki przed nimi.) Wzrost y w takim przypadku zależy od wyboru piksela (S lub T), który jest bliżej teoretycznej prostej. O wyborze decyduje zmienna kontrolna d, która jest uaktualniana w każdym kroku. | ||
Linia 30: | Linia 34: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd3.png|thumb|500px]] | ||
|valign="top"|Pełny algorytm Bresenhama dla x2>x1, y2>y1, 0<m<1 wyglądałby tak: | |valign="top"|Pełny algorytm Bresenhama dla x2>x1, y2>y1, 0<m<1 wyglądałby tak: | ||
Linia 60: | Linia 64: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd4.png|thumb|500px]] | ||
|valign="top"|Niestety korzystanie z rastra również i w przypadku rysowania odcinka może prowadzić do pewnych problemów. | |valign="top"|Niestety korzystanie z rastra również i w przypadku rysowania odcinka może prowadzić do pewnych problemów. | ||
Linia 72: | Linia 76: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd5.png|thumb|500px]] | ||
|valign="top"|Na podobnej zasadzie jak rysowanie odcinka, Bresenham opracował algorytm rysowania łuku okręgu. Oczywiście zmieniają się w tym przypadku warunki wyboru pikseli, ale algorytm ten również wykorzystuje tylko operacje na liczbach całkowitych. | |valign="top"|Na podobnej zasadzie jak rysowanie odcinka, Bresenham opracował algorytm rysowania łuku okręgu. Oczywiście zmieniają się w tym przypadku warunki wyboru pikseli, ale algorytm ten również wykorzystuje tylko operacje na liczbach całkowitych. | ||
Linia 82: | Linia 86: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd6.png|thumb|500px]] | ||
|valign="top"|Wypełnianie obszaru jest drugim po rysowaniu odcinka lub łuku, najczęściej występującym problemem związanym z prymitywami. Zadanie dla szczególnych przypadków (np. dla prostokąta) jest zadaniem trywialnym. Natomiast w ogólnym przypadku algorytm powinien pracować poprawnie dla dowolnego wielokąta (także wklęsłego), również dla wielokątów z „dziurami”. | |valign="top"|Wypełnianie obszaru jest drugim po rysowaniu odcinka lub łuku, najczęściej występującym problemem związanym z prymitywami. Zadanie dla szczególnych przypadków (np. dla prostokąta) jest zadaniem trywialnym. Natomiast w ogólnym przypadku algorytm powinien pracować poprawnie dla dowolnego wielokąta (także wklęsłego), również dla wielokątów z „dziurami”. | ||
Linia 90: | Linia 94: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd7.png|thumb|500px]] | ||
|valign="top"|Analogicznym zadaniem do wypełniania obszaru jest zmiana barwy w danym obszarze. Zadania są równoważne. Algorytm rozwiązujący jedno z nich może posłużyć do rozwiązania drugiego. | |valign="top"|Analogicznym zadaniem do wypełniania obszaru jest zmiana barwy w danym obszarze. Zadania są równoważne. Algorytm rozwiązujący jedno z nich może posłużyć do rozwiązania drugiego. | ||
Linia 98: | Linia 102: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd8.png|thumb|500px]] | ||
|valign="top"|Można zauważyć, że jeśli wybierzemy jeden punkt, który jest wewnątrz wypełnianego obszaru, to punkt sąsiedni będzie również punktem wewnątrz albo będzie punktem brzegowym. | |valign="top"|Można zauważyć, że jeśli wybierzemy jeden punkt, który jest wewnątrz wypełnianego obszaru, to punkt sąsiedni będzie również punktem wewnątrz albo będzie punktem brzegowym. | ||
Linia 131: | Linia 135: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd9.png|thumb|500px]] | ||
|valign="top"|Wypełnianie przez kontrolę parzystości wykorzystuje pewną właściwość przecięcia brzegu linią prostą. Jeśli punkty przecięcia ponumerujemy kolejnymi liczbami naturalnymi zgodnie z orientacją prostej (na rysunku od lewej do prawej dla prostej poziomej) i jeśli będziemy poruszać się po prostej zgodnie z jej orientacją to każde nieparzyste przecięcie będzie „wejściem” do wnętrza obszaru, natomiast każde parzyste będzie „wyjściem” na zewnątrz. Zatem, aby wypełnić obszar należy go przecięć prostymi odpowiadającymi kolejnym rzędom pikseli, a następnie wypełnić odcinkami pomiędzy każdym nieparzystym przecięciem, a najbliższym parzystym. | |valign="top"|Wypełnianie przez kontrolę parzystości wykorzystuje pewną właściwość przecięcia brzegu linią prostą. Jeśli punkty przecięcia ponumerujemy kolejnymi liczbami naturalnymi zgodnie z orientacją prostej (na rysunku od lewej do prawej dla prostej poziomej) i jeśli będziemy poruszać się po prostej zgodnie z jej orientacją to każde nieparzyste przecięcie będzie „wejściem” do wnętrza obszaru, natomiast każde parzyste będzie „wyjściem” na zewnątrz. Zatem, aby wypełnić obszar należy go przecięć prostymi odpowiadającymi kolejnym rzędom pikseli, a następnie wypełnić odcinkami pomiędzy każdym nieparzystym przecięciem, a najbliższym parzystym. | ||
Linia 139: | Linia 143: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd10.png|thumb|500px]] | ||
|valign="top"|Oczywiście należy zmodyfikować to postępowanie dla przypadków szczególnych, gdy punkt przecięcia jest jednocześnie lokalnym ekstremum brzegu, co zaburza prostą regułę parzystości. Lokalizacja lokalnego ekstremum możliwa jest na podstawie położenia końców przecinanych odcinków. Jeśli są po tej samej stronie prostej wypełniającej – przecinany punkt jest lokalnym ekstremum i nie należy jego liczyć przy analizie parzystości. | |valign="top"|Oczywiście należy zmodyfikować to postępowanie dla przypadków szczególnych, gdy punkt przecięcia jest jednocześnie lokalnym ekstremum brzegu, co zaburza prostą regułę parzystości. Lokalizacja lokalnego ekstremum możliwa jest na podstawie położenia końców przecinanych odcinków. Jeśli są po tej samej stronie prostej wypełniającej – przecinany punkt jest lokalnym ekstremum i nie należy jego liczyć przy analizie parzystości. | ||
Linia 149: | Linia 153: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd11.png|thumb|500px]] | ||
|valign="top"|W szczególnych przypadkach mogą pojawić się obszary nie dające się wypełnić w sposób spójny – problem „drzazgi”. Jedynym sposobem rozwiązania tego problemu jest nadpróbkowanie. Należy spróbkować i wypełnić drzazgę z większą rozdzielczością, a następnie uśrednić barwę/luminancję wracając do rozdzielczości rastra. | |valign="top"|W szczególnych przypadkach mogą pojawić się obszary nie dające się wypełnić w sposób spójny – problem „drzazgi”. Jedynym sposobem rozwiązania tego problemu jest nadpróbkowanie. Należy spróbkować i wypełnić drzazgę z większą rozdzielczością, a następnie uśrednić barwę/luminancję wracając do rozdzielczości rastra. | ||
Linia 157: | Linia 161: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd12.png|thumb|500px]] | ||
|valign="top"|Większość rysowanych obiektów jest definiowana w rzeczywistym układzie kartezjańskim. Przedstawienie takiego obiektu na ekranie monitora (lub z wykorzystaniem innego urządzenia) wymaga określenia fragmentu, który jest obrazowany. Jeśli tylko część prymitywu jest zobrazowana, to oprócz algorytmu rysowania prymitywu jest potrzebny algorytm obcinania go do widocznego fragmentu. | |valign="top"|Większość rysowanych obiektów jest definiowana w rzeczywistym układzie kartezjańskim. Przedstawienie takiego obiektu na ekranie monitora (lub z wykorzystaniem innego urządzenia) wymaga określenia fragmentu, który jest obrazowany. Jeśli tylko część prymitywu jest zobrazowana, to oprócz algorytmu rysowania prymitywu jest potrzebny algorytm obcinania go do widocznego fragmentu. | ||
Linia 165: | Linia 169: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd13.png|thumb|500px]] | ||
|valign="top"|Algorytm Cohena-Sutherlanda (1974) służy do obcinania odcinków do prostokątnego okna. Oznacza to, że należy wybrać odcinki (lub ich fragmenty) do obcięcia na podstawie położenia ich końców. | |valign="top"|Algorytm Cohena-Sutherlanda (1974) służy do obcinania odcinków do prostokątnego okna. Oznacza to, że należy wybrać odcinki (lub ich fragmenty) do obcięcia na podstawie położenia ich końców. | ||
Linia 182: | Linia 186: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd14.png|thumb|500px]] | ||
|valign="top"|W przypadku obcinania wielokąta, zastosowanie algorytmu obcinania odcinków przynosi tylko połowiczny sukces. Wielokąt tworzy bowiem zbiór uporządkowanych wierzchołków. Każdy wierzchołek jest początkiem pewnego boku i jednocześnie jest końcem poprzedniego boku w danym uporządkowaniu. Potraktowanie boków wielokąta jako zbioru odcinków i przycięcie ich powoduje, że tracimy informacje o ich połączeniach. | |valign="top"|W przypadku obcinania wielokąta, zastosowanie algorytmu obcinania odcinków przynosi tylko połowiczny sukces. Wielokąt tworzy bowiem zbiór uporządkowanych wierzchołków. Każdy wierzchołek jest początkiem pewnego boku i jednocześnie jest końcem poprzedniego boku w danym uporządkowaniu. Potraktowanie boków wielokąta jako zbioru odcinków i przycięcie ich powoduje, że tracimy informacje o ich połączeniach. | ||
Linia 196: | Linia 200: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd15.png|thumb|500px]] | ||
|valign="top"|Algorytm Cohena-Sutherlanda bardzo efektywnie klasyfikuje odcinki i jednocześnie jest bardzo prosty w implementacji. Powoduje to, że jest chyba najczęściej stosowanym algorytmem przycinania odcinków do prostokątnego okna. | |valign="top"|Algorytm Cohena-Sutherlanda bardzo efektywnie klasyfikuje odcinki i jednocześnie jest bardzo prosty w implementacji. Powoduje to, że jest chyba najczęściej stosowanym algorytmem przycinania odcinków do prostokątnego okna. | ||
Linia 214: | Linia 218: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd16.png|thumb|500px]] | ||
|valign="top"|Geometria obliczeniowa (ang. computational geometry) jest stosunkowo nową dziedziną informatyki. Z jednej strony jest często traktowana jako narzędzie niezbędne do realizacji algorytmów w grafice komputerowej, z drugiej pozwoliła również wprowadzić do grafiki nowe struktury danych lub je usystematyzować. Niektóre zagadnienia takie jak wyznaczenie wypukłej otoczki zbioru punktów (wypukłej skorupki) albo triangulacja wielokąta stanowią samodzielne problemy geometrii obliczeniowej i Czytelnik może znaleźć ich rozwiązania w podręcznikach z tej dziedziny. | |valign="top"|Geometria obliczeniowa (ang. computational geometry) jest stosunkowo nową dziedziną informatyki. Z jednej strony jest często traktowana jako narzędzie niezbędne do realizacji algorytmów w grafice komputerowej, z drugiej pozwoliła również wprowadzić do grafiki nowe struktury danych lub je usystematyzować. Niektóre zagadnienia takie jak wyznaczenie wypukłej otoczki zbioru punktów (wypukłej skorupki) albo triangulacja wielokąta stanowią samodzielne problemy geometrii obliczeniowej i Czytelnik może znaleźć ich rozwiązania w podręcznikach z tej dziedziny. | ||
Linia 222: | Linia 226: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd17.png|thumb|500px]] | ||
|valign="top"|Częstym problemem jest konieczność uporządkowania punktów w układzie biegunowym. Wyznaczenie kąta na podstawie współrzędnych kartezjańskich wymagałoby użycia funkcji trygonometrycznych, co znacznie spowalniałoby rozwiązanie zadania. Funkcja alfa daje możliwość porównania kątów bez wyznaczania ich wartości. Należy jednak pamiętać, że wartość funkcji alfa nie jest liniowo związana z wartością kąta i próba szacowania kąta na tej podstawie byłaby poważnym błędem. | |valign="top"|Częstym problemem jest konieczność uporządkowania punktów w układzie biegunowym. Wyznaczenie kąta na podstawie współrzędnych kartezjańskich wymagałoby użycia funkcji trygonometrycznych, co znacznie spowalniałoby rozwiązanie zadania. Funkcja alfa daje możliwość porównania kątów bez wyznaczania ich wartości. Należy jednak pamiętać, że wartość funkcji alfa nie jest liniowo związana z wartością kąta i próba szacowania kąta na tej podstawie byłaby poważnym błędem. | ||
Linia 230: | Linia 234: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd18.png|thumb|500px]] | ||
|valign="top"|Drugim zagadnieniem, które często występuje jest określenie zorientowania trójki punktów na płaszczyźnie. Zadanie to ma oczywiście eleganckie rozwiązanie w postaci wektorowej. Wystarczy wyznaczyć dwa wektory rozpięte na badanych trzech punktach, a następnie obliczyć ich iloczyn wektorowy. Zwrot wektora wynikowego określi poszukiwane zorientowanie. | |valign="top"|Drugim zagadnieniem, które często występuje jest określenie zorientowania trójki punktów na płaszczyźnie. Zadanie to ma oczywiście eleganckie rozwiązanie w postaci wektorowej. Wystarczy wyznaczyć dwa wektory rozpięte na badanych trzech punktach, a następnie obliczyć ich iloczyn wektorowy. Zwrot wektora wynikowego określi poszukiwane zorientowanie. | ||
Linia 244: | Linia 248: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd19.png|thumb|500px]] | ||
|valign="top"|Zagadnienie sprawdzenia przynależności punktu do wnętrza wielokąta ma bardzo proste rozwiązanie dla wielokąta wypukłego. Jeśli wziąć pod uwagę prostą wyznaczoną przez dwa kolejne wierzchołki wielokąta, to prosta ta dzieli płaszczyznę na dwie półpłaszczyzny, z których tylko jedna zawiera wielokąt. Podstawiając więc współrzędne badanego punktu do równania prostej można na podstawie znaku równania stwierdzić po której stronie prostej punkt się znajduje. A zatem punkt P1 na rysunku będzie po tej samej stronie prostej wyznaczonej przez V1 V2 co np. wierzchołek V4. Natomiast punkty P2 i V4 będą po przeciwnych stronach tej prostej. | |valign="top"|Zagadnienie sprawdzenia przynależności punktu do wnętrza wielokąta ma bardzo proste rozwiązanie dla wielokąta wypukłego. Jeśli wziąć pod uwagę prostą wyznaczoną przez dwa kolejne wierzchołki wielokąta, to prosta ta dzieli płaszczyznę na dwie półpłaszczyzny, z których tylko jedna zawiera wielokąt. Podstawiając więc współrzędne badanego punktu do równania prostej można na podstawie znaku równania stwierdzić po której stronie prostej punkt się znajduje. A zatem punkt P1 na rysunku będzie po tej samej stronie prostej wyznaczonej przez V1 V2 co np. wierzchołek V4. Natomiast punkty P2 i V4 będą po przeciwnych stronach tej prostej. | ||
Linia 268: | Linia 272: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd20.png|thumb|500px]] | ||
|valign="top"|Przez analogię do wypełniania wielokąta przez kontrolę parzystości na rastrze pikseli można zaproponować algorytm sprawdzania przynależności punktu do wielokąta. Jeśli z badanego punktu poprowadzimy półprostą (w dowolnym kierunku – z punktu widzenia kierunków układu współrzędnych wygodna będzie np. półprosta pozioma), to może ona przeciąć wielokąt. Jeśli liczba przecięć z bokami wielokąta jest nieparzysta to punkt leży wewnątrz wielokąta (punkt P1 na rysunku). Jeśli liczba przecięć jest parzysta, to punkt jest na zewnątrz (punkt P2 na rysunku). | |valign="top"|Przez analogię do wypełniania wielokąta przez kontrolę parzystości na rastrze pikseli można zaproponować algorytm sprawdzania przynależności punktu do wielokąta. Jeśli z badanego punktu poprowadzimy półprostą (w dowolnym kierunku – z punktu widzenia kierunków układu współrzędnych wygodna będzie np. półprosta pozioma), to może ona przeciąć wielokąt. Jeśli liczba przecięć z bokami wielokąta jest nieparzysta to punkt leży wewnątrz wielokąta (punkt P1 na rysunku). Jeśli liczba przecięć jest parzysta, to punkt jest na zewnątrz (punkt P2 na rysunku). | ||
Algorytm jest bardzo prosty, jednak pamiętając o problemach ze szczególnymi przypadkami w algorytmie wypełniania przez kontrolę parzystości, należy przypuszczać, że podobne sytuacje wystąpią i tutaj. | Algorytm jest bardzo prosty, jednak pamiętając o problemach ze szczególnymi przypadkami w algorytmie wypełniania przez kontrolę parzystości, należy przypuszczać, że podobne sytuacje wystąpią i tutaj. | ||
Linia 283: | Linia 287: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | {| border="0" cellpadding="4" width="100%" | ||
| | |width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd21.png|thumb|500px]] | ||
|valign="top"|Drugim rozwiązaniem problemu sprawdzenia przynależności punktu do wielokąta jest analiza kątów. | |valign="top"|Drugim rozwiązaniem problemu sprawdzenia przynależności punktu do wielokąta jest analiza kątów. | ||
Linia 295: | Linia 299: | ||
<hr width="100%"> | <hr width="100%"> | ||
{| border="0" cellpadding=" | = Literatura = | ||
| | |||
{| border="0" cellpadding="4" width="100%" | |||
|width="500px" valign="top"|[[Grafika:GKIW_M3_Slajd22.png|thumb|500px]] | |||
|valign="top"| | |valign="top"| | ||
|} | |} | ||
<hr width="100%"> | <hr width="100%"> |
Wersja z 10:32, 5 lut 2007
Wykład
![]() |
![]() |
Analogicznym zadaniem do wypełniania obszaru jest zmiana barwy w danym obszarze. Zadania są równoważne. Algorytm rozwiązujący jedno z nich może posłużyć do rozwiązania drugiego. |
Literatura
![]() |