next up previous
Next: Elementy kombinatoryki Up: Geometria analityczna na płaszczyźnie Previous: Jak sprawdzić, czy punkt

Jak sprawdzić, czy punkt leży wewnątrz wielokąta?

Dane są wierzchołki Pi = (xi, yi), i = 1, 2,..., n wielokąta, i punkt Q = (a, b). Jak sprawdzić, czy punkt Q leży wewnątrz wielokąta? Zwróćmy uwagę, że sformułowanie zagadnienia nie jest jednoznaczne: nie stwierdzono, czy łamana P1P2...PnP1 jest brzegiem badanego wielokąta. Jesli jest, i jest łamaną zwyczajną (bez samoprzecięć), to trzeba najpierw zbadać wypukłość tego wielokąta i postępować odpowiednio do rezultatu. Jeśli zaś łamana P1P2...PnP1 nie musi być brzegiem badanego wielokąta, to sam spis (zbiór) wierzchołków określa wielokąt tylko przy dodatkowym założeniu, że chodzi o wielokąt wypukły.

Pierwszy przypadek - wielokąt ograniczony łamana zamkniętą zwyczajną P1P2...PnP1. Najpierw sprawdzamy wypukłość wielokąta; dla każdej prostej PiPi+1 i prostej PnP1 sprawdzamy metodą, opisaną wyżej, czy pozostałe wierzchołki leżą po jednej stronie tej prostej. Jeśli tak, to badany wielokąt jest częścią wspólną półpłaszczyzn, więc jest wypukły. W takim wypadku, aby sprawdzic, czy punkt Q leży wewnątrz niego, wystarczy sprawdzić - dla każdej z prostych PiPi+1 i prostej PnP1 - czy punkt Q leży po tej samej stronie prostej, co wierzchołek Pi+2 (wierzchołek P1 dla i = n - 1, wierzchołek P2 dla i = n). Jesli tak, to należy do każdej z półpłaszczyzn, których częścią wspólną jest badany wielokąt, czyli leży wewnątrz wielokąta. Jeśli nie, to leży na zewnątrz lub na brzegu wielokąta.

Jeśli wielokąt okazał się niewypukły, to trzeba podzielić go na sumę wielokątów wypukłych. W tym celu szukamy nieprzedłużalnego łańcucha kolejnych wierzchołków PiPi+1...Pj takiego, że wszystkie pozostałe wierzchołki leżą po jednej stronie każdej prostej łączącej dwa kolejne wierzchołki w tym łańcuchu. Nieprzedłużalność oznacza, że ani prosta Pi-1Pi, ani prosta PjPj+1 nie mają już tej własności, tzn. wierzchołki wielokąta leżą po obu stronach każdej z tych prostych. Taki łańcuch wyznacza wystający "róg" wielokąta. Wielokąt przedstawiamy jako sumę wielokąta wypukłego PiPi+1...PjPi i wielokąta P1P2...Pi-1Pj+1...PnP1 (z odciętym "rogiem"), który ma mniej wierzchołków. Punkt Q leży wewnątrz wielokąta P1P2...PnP1 wtedy i tylko wtedy, gdy leży wewnątrz wielokąta (wypukłego!) PiPi+1...PjPi lub leży na boku PjPi lub leży wewnątrz wielokąta P1P2...Pi-1Pj+1...PnP1.

Drugi przypadek - wielokąt jest powłoką wypukłą Conv(P1, P2,..., Pn) zbioru danych punktów A = {P1, P2,..., Pn}. W tym przypadku trzeba znaleźć łamaną, która jest brzegiem badanego wielokąta. Tworzymy dwa obiekty: podzbiór W zbioru {P1, P2,..., Pn} - zbiór punktów wewnętrznych, i ciąg wierzchołków x. Zaczynamy od dowolnego punktu Pi i dla każdej prostej PiPj, j $ \neq$ i sprawdzamy, czy wszystkie pozostałe wierzchołki leżą po tej samej stronie prostej. Jeśli nie ma takiego punktu Pj, to punkt Pi przenosimy ze zbioru A do zbioru punktów wewnętrznych W. Jeśli istnieje taki punkt Pj, to punkt Pi przenosimy ze zbioru A na koniec ciągu wierzchołków x, i powtarzamy procedurę z punktem Pj zamiast Pi, aż okaże się, że ciągu wierzchołków nie da się przedłużyć. Wtedy sprawdzany punkt dopisujemy na końcu ciągu wierzchołków, a pozostałe w zbiorze A punkty przenosimy do zbioru W punktów wewnętrznych. Ciąg wierzchołków wyznacza łamaną zwyczajną, która ogranicza badany wielokąt, i zagadnienie sprowadziło się do pierwszego przypadku, przy czym już wiadomo, że badany wielokąt jest wypukły.


next up previous
Next: Elementy kombinatoryki Up: Geometria analityczna na płaszczyźnie Previous: Jak sprawdzić, czy punkt
Pawel Gladki 2006-01-30