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 232: | Linia 232: | ||
{| border="0" cellpadding="5" width="100%" | {| border="0" cellpadding="5" width="100%" | ||
|valign="top" width="400px"|[[Grafika:GKIW_M3_Slajd18.png|400px]] | |valign="top" width="400px"|[[Grafika:GKIW_M3_Slajd18.png|400px]] | ||
|valign="top"| | |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. | ||
Zastosowanie macierzy współrzędnych (przez analogię do macierzy określającej iloczyn wektorowy) upraszcza obliczenia. | |||
Jeśli det '''M''' > 0 mówimy o dodatnim zorientowaniu (lewoskrętnym lub przeciwnym do ruchu wskazówek zegara). | |||
Jeśli det '''M''' < 0 mówimy o ujemnym zorientowaniu (prawoskrętnym lub zgodnym z ruchem wskazówek zegara). | |||
|} | |} | ||
Linia 239: | Linia 246: | ||
{| border="0" cellpadding="5" width="100%" | {| border="0" cellpadding="5" width="100%" | ||
|valign="top" width="400px"|[[Grafika:GKIW_M3_Slajd19.png|400px]] | |valign="top" width="400px"|[[Grafika:GKIW_M3_Slajd19.png|400px]] | ||
|valign="top"| | |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. | ||
Algorytm sprawdzania przynależności punktu do wnętrza wielokąta wypukłego jest następujący. | |||
:Obejść wielokąt zgodnie z porządkiem kolejnych jego wierzchołków. W każdym kroku | |||
:wyznaczyć :prostą przechodzącą przez bieżącyi następny wierzchołek. Sprawdzić czy badany punkt | |||
:jest po tej samej stronie prostej co jeden z wierzchołków wielokąta. Jeśli w którymkolwiek | |||
:kroku badany punkt nie spełnia tego warunku, przerwać sprawdzanie – punkt jest na zewnątrz. | |||
:Jeśli po obejściu całego wielokąta okaże się, że punkt był zawsze (!) po tej samej stronie co | |||
:reszta wielokąta to punkt jest wewnątrz. | |||
Opisany algorytm należy w zależności od potrzeb uzupełnić o analizę samego wielokąta (przynależność lub nie do odpowiednich odcinków co jest zabiegiem technicznym i nie stanowi problemu. | |||
Podstawową wadą zaprezentowanego algorytmu jest fakt, że działa poprawnie tylko dla wielokątów wypukłych. Dla wielokątów wklęsłych będą proste wyznaczone przez kolejne wierzchołki, które będą przecinały wielokąt. | |||
Dla wielokątów dowolnych problem rozwiązuje się algorytmem kontroli parzystości lub algorytmem analizy sumy katów zorientowanych. | |||
Warto przy tym zwrócić uwagę, że rozpatrywane są tylko wielokąty zwykłe, to znaczy takie, których krawędzie nie mają punktów wspólnych poza wierzchołkami. | |||
|} | |} | ||
Linia 246: | Linia 270: | ||
{| border="0" cellpadding="5" width="100%" | {| border="0" cellpadding="5" width="100%" | ||
|valign="top" width="400px"|[[Grafika:GKIW_M3_Slajd20.png|400px]] | |valign="top" width="400px"|[[Grafika:GKIW_M3_Slajd20.png|400px]] | ||
|valign="top"| | |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. | |||
Oczywiście rozwiązanie jest również analogiczne .Do algorytmu należy dodać dwa warunki. | |||
Jeśli punkt przecięcia jest ekstremum lokalnym, to liczymy go podwójnie. | |||
Jeśli półprosta zawiera cały bok wielokąta, to traktujemy to jako jeden pseudo-wierzchołek. | |||
|} | |} | ||
Linia 253: | Linia 285: | ||
{| border="0" cellpadding="5" width="100%" | {| border="0" cellpadding="5" width="100%" | ||
|valign="top" width="400px"|[[Grafika:GKIW_M3_Slajd21.png|400px]] | |valign="top" width="400px"|[[Grafika:GKIW_M3_Slajd21.png|400px]] | ||
|valign="top"| | |valign="top"|Drugim rozwiązaniem problemu sprawdzenia przynależności punktu do wielokąta jest analiza kątów. | ||
Można założyć, że wierzchołki wielokąta są uporządkowane przeciwnie do ruchu wskazówek zegara. Z badanego punktu przez każdy wierzchołek wielokąta prowadzimy półprostą. Badany punkt oraz półproste przechodzące przez kolejne wierzchołki wyznaczają kąt, któremu można przypisać zorientowanie analogicznie jak zorientowanie wielokąta (+ jeśli kolejność ramion kąta jest przeciwna do ruchu wskazówek zegara, i – w sytuacji odwrotnej). Po przyjęciu takich założeń wystarczy zsumować wszystkie kąty związane z punktem badanym. Jeśli <math>suma = 360^\circ</math> to punkt jest wewnątrz wielokąta. Jeśli <math>suma = 0^\circ</math> to na zewnątrz. | |||
Oczywiście należy pamiętać o błędach zaokrąglenia i oczekiwanie np. dokładnie zerowej wartości byłoby nieporozumieniem. Jeśli jesteśmy pewni że w implementacji nie ma błędu, to warunki można postawić jako: <math>suma > 360^\circ</math> i <math>suma < 360^\circ</math>. | |||
|} | |} | ||
Wersja z 09:51, 27 wrz 2006
![]() |
![]() |
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. |
![]() |