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:
(równanie ogólne prostej na płaszczyźnie), to ten
podział sprowadza się do rachunku:
- jedna strona składa się z tych punktów (x,y),
dla których Ax+By+C < 0,
- druga strona składa się z tych punktów (x,y),
dla których Ax+By+C > 0,
- a przedzielające je prosta - z tych punktów (x,y),
dla których Ax+By+C = 0.
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:
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)
- leżą po tej samej stronie prostej Ax+By+C = 0 gdy wyrażenie
jest dodatnie,
- leżą po przeciwnych stronach prostej Ax+By+C = 0 gdy wyrażenie
jest ujemne,
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
czyli
|
|
ę ę
ę
|
|
|
ę ę
ę
|
- |
ę ę
ę
|
|
|
ę ę
ę
|
+ |
ę ę
ę
|
|
|
ę ę
ę
|
= 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:
- odcinek domknięty PQ nie przecina prostej Ax+By+C = 0 wtedy i tylko wtedy, gdy
|
( Ax1+By1+C)( Ax2+By2+C) > 0, |
|
- odcinek otwarty PQ przecina prostą Ax+By+C = 0 wtedy i tylko wtedy, gdy
|
( Ax1+By1+C)( Ax2+By2+C) < 0, |
|
- jeden z końców odcinka PQ leży na prostej Ax+By+C = 0 wtedy i tylko wtedy, gdy
|
( Ax1+By1+C)( Ax2+By2+C) = 0. |
|
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.
- Jeśli choć jeden z nich nie przecina prostej, zawierającej drugi, to oczywiście odcinki się nie przecinają.
- Jeśli każdy z nich przecina prostą, na której
leży drugi, to punkt przecięcia tych prostych leży na każdym
z odcinków, czyli odcinki się przecinają.
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.
- Według wzoru 1 piszemy równania prostych,
zawierających boki trójkąta:
- 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) . |
|
| |
|
- Jeśli wszystkie te trzy wyrażenia są dodatnie, to (a,b) leży wewnątrz trójkąta DPQR.
- Jeśli jedno z tych trzech wyrażeń jest równe 0, to albo trókąt jest odcinkiem, albo (a,b)
leży na odpowiednim boku trójkąta.
- Jeśli żadne z tych wyrażeń nie jest zerem, ale
choć jedno jest ujemne, to (a,b) leży na zewnątrz
DPQR.
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.
- Jeśli jest, i jest łamaną zwyczajną (bez samoprzecięć), to trzeba najpierw zbadać wypukłość tego wielokąta
i postepować odpowiednio do rezultatu.
- Jeśli zaś łamana P1P2...PnP1 nie musi
być brzegiem badanego wielokąta, to sam spis (zbiór) wierzchoków określa wielokąt tylko przy dodatkowym założeniu,
że chodzi o wielokąt wypukły.
A zatem pierwszy przypadek - wielokąt ograniczony łamaną zamknitą zwyczajną
P1P2...PnP1:
- 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.
- 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.
- 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.