Jak sprawdzić czy...

 odcinek przecina prostą?
 dwa odcinki się przecinają?
 punkt leży wewnątrz trójkąta?
 punkt leży wewnątrz wielokąta?


Jak wiadomo, prosta dzieli płaszczyznę na dwie półpłaszczyzny, które nazywamy (czasem) stronami. Jeśli równanie prostej zapisać w postaci:
Ax+By+C = 0
(równanie ogólne prostej na płaszczyźnie), to ten podział sprowadza się do rachunku:

Oczywiście to, która strona jest ''ujemna'', a która ''dodatnia'', zależy od wyboru równania ogólnego prostej: x-y = 0 i y-x = 0 to dwa równania ogólne tej samej prostej y = x, i strona ''ujemna'' dla jednego równania jest ''dodatnia'' dla drugiego równania:

x-y > 0Ű y-x < 0.

Stronę prostej można wybrać, podając punkt, który do niej należy, np. strona prostej y = x do której należy punkt (1,0) jest ''dodatnia'' dla równania x-y = 0 i ''ujemna'' dla równania y-x = 0.

Dwa punkty P = (x1,y1) oraz P = (x2,y2)

zaś gdy ten iloczyn jest zerem, to choć jeden z punktów leży na prostej.

Półpłaszczyzny są ważne, bo każdy zbiór wypukły na płaszczyźnie jest częścią wspólną zawierających go półpłaszczyzn, a gdy zbiór jest wielokątem wystarczy skończona liczba półpłaszczyn - wyznaczonych przez boki wielokąta.

Warto pamiętać, że prosta przechodząca przez dwa różne punkty (a,b), (c,d) ma równanie ogólne

ę
ę
ę
ę
ę
1
a
b
1
c
d
1
x
y
ę
ę
ę
ę
ę
= 0,
czyli
ę
ę
ę
c
d
x
y
ę
ę
ę
ę
ę
ę
a
b
x
y
ę
ę
ę
ę
ę
ę
a
b
c
d
ę
ę
ę
= 0,
czyli
( b-d)x + ( c-a)y + (ad-bc) = 0.


1.1  Czy odcinek przecina prostą?

      

Odcinek o danych końcach P = (x1,y1), Q = (x2,y2) przecina prostą o równaniu Ax+By+C = 0 wtedy i tylko wtedy, gdy jego końce nie leżą po jednej stronie prostej. Zatem są trzy możliwości:


1.2  Czy dwa odcinki się przecinają?

      

> Jak sprawdzić, czy odcinki PQ i
> RS o końcach P = (xP,yP), Q = (xQ,yQ), R = (xR,yR), S = (xS,yS)
> się przecinają?

Metodą z punktu 1.1 sprawdzamy, czy odcinek PQ przecina prostą RS i czy odcinek RS przecina prostą PQ.


1.3  Czy punkt leży wewnątrz trójkąta?

      

> Dany jest trójkąt o wierzchołkach P = (xP,yP), Q = (xQ,yQ), R = (xR,yR).
> Jak sprawdzić, czy punkt (a,b) leży wewnątrz tego trójkąta?

Trójkąt jest częscią wspólną trzech półpaszczyzn: tych stron prostych, zawierających jego boki (czyli dwa wierzchołki), do których należy trzeci wierzchołek.

Właściwie odpowiedź można uznać za algorytm.

  1. Według wzoru 1 piszemy równania prostych, zawierających boki trójkąta:
    APx+BPy+CP
    =
    0 - prosta QR,
    AQx+BQy+CQ
    =
    0 - prosta PR,
    ARx+BRy+CR
    =
    0 - prosta PQ.

  2. Dla każdego wierzchołka P,Q,R obliczamy znak wyrażenia
    ( APxP+BPyP+CP) ( APa+BPb+CP) ,
    ( AQxQ+BQyQ+CQ) ( AQa+BQb+CQ) ,
    ( ARxR+BRyR+CR) ( ARa+BRb+CR) .


1.4  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?

Sformułowanie zagadnienia nie jest jednoznaczne: nie stwierdzono, czy amana P1P2...PnP1 jest brzegiem badanego wielokąta.

A zatem pierwszy przypadek - wielokąt ograniczony łamaną zamknitą zwyczajną P1P2...PnP1:

  1. Sprawdzenie wypukłości. Dla każdej prostej PiPi+1 i prostej PnP1 sprawdzamy metodą, opisaną na wstępie, 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.

  2. Jeśli wielokąt okazał się wypukły, to aby sprawdzić, 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, wierzchoek P2 dla i = n). Jeśli tak, to należy do każdej z półpłaszczyzn, których cześcią wspólną jest badany wielokąt, czyli leży wewnątrz wielokąta. Jeśli nie, to leży na zewnatrz lub na brzegu wielokąta.

  3. 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 łączacej 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 š 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.


 Geometria analityczna

 Powrót do FAQ


File translated from TEX by TTH, version 2.25 on 18 Feb 2000, 18:58.