background image

Algorytmy geometryczne   

Oznaczenia 

 

Punkt 

,  ,  ,   

 

współrzędne punktu    na 
płaszczyźnie 

 

 

odcinek o początku i końcu 
odpowiednio w punktach    i   

 

 

wektor o początku i końcu 
odpowiednio w punktach    i   

 

 

prosta zawierająca punkty    i 

 

 

 

półprosta zaczynająca się w 
punkcie p i zawierająca punkt 

....

 

 

okrąg  o  środku  w  punkcie 

  i 

promieniu   

 

 

 

 

background image

Podstawowe algorytmy 
geometryczne   

Problem sprawdzania przynale

ż

no

ś

ci 

punktu do wielok

ą

ta 

Operacje elementarne 

 

Operacje arytmetyczne: dodawanie,   
odejmowanie, mnożenie, dzielenie, 
pierwiastkowanie, itp 

Założenia i uwagi 

 

rozważane są obiekty geometryczne na 
płaszczyźnie w kartezjańskim układzie 
współrzędnych 

 

algorytmy powinny realizować jak najmniej 
operacji powodujących przybliżenia 

 

 

background image

Prymitywne algorytmy geometryczne 

Algorytm sprawdzania, po której stronie prostej 
leży punkt 

WarPocz: 

Trzy punkty:   

, ,

, ,

,  

WarKonc: 

Odpowiedź na pytanie: Po której stronie 

prostej 

  leży punkt   

 

Punkt    leży po lewej stronie prostej 

 

 

Punkt    leży po prawej stronie prostej 

   

 

background image

 

Punkty  ,    i    są współliniowe 

 

Algorytm 

Obliczamy wartość wyznacznika 

, , , którego 

znak jest równy znakowi sinusa kąta nachylenia 
wektora 

  do wektora 

 , ,

1

1

1

 

Jeżeli 

 , ,

0  to  sin $ 0  i wówczas punkt 

  leży po lewej stronie prostej 

Jeżeli 

 , , % 0  to  sin $ % 0  i wówczas punkt 

  leży po prawej stronie prostej 

Jeżeli 

 , ,

0  to  sin $ 0  i wówczas punkt 

  leży na prostej 

 

 

background image

Algorytm sprawdzania, czy dwa dane punkty leżą 
po tej samej stronie prostej 

WarPocz: Cztery punkty: 

 

   , ,     , , &    ', ( ,     ,    

WarKonc: Odpowiedź na pytanie, czy punkty 

a  i  ' 

leżą po tej samej stronie prostej 

 

 

 

Algorytm 

Przypomnijmy funkcję znaku liczby: 

sgn

+

1 gdy

0

0 gdy

0

.1 gdy  % 0

 

 

Punkty 

&  i    leżą po tej samej stronie prostej   

wówczas, gdy: 

/

, , &

 /

, , 

background image

Algorytm sprawdzania, czy punkt należy do 
odcinka 

WarPocz: Trzy punkty: 

 

   , ,     , ,     ,  

WarKonc: Odpowiedź na pytanie , czy punkt czy punkt 
r należy do odcinka 

 

Algorytm 

Jeżeli punkt należy do odcinka 

to rzuty 

prostokątne    na osie (

0  i  1) "zawierają się" w 

rzutach prostokątnych odcinka 

. Wynika stąd, że   

należy do odcinka 

  wtedy i tylko wtedy gdy: 

/

, ,

  0 

oraz 

2

przy założeniu, że 

2

background image

a także 

2

2

∧ /

, , ))   =  0

przy założeniu, że 

( ) ≤ ( ) 

 

 

background image

Algorytm sprawdzania, czy dwa odcinki się 
przecinają 

WarPocz

: Cztery punkty: 

 

   , ,     , , &    ', ( ,     ,    

wyznaczające dwa odcinki: 

  i 

. 

WarKonc:

 Odpowiedź na pytanie , czy odcinki 

  i 

 

przecinają się. 

 

Algorytm 

Rozwiązanie opiera się na spostrzeżeniu, że dwa 
odcinki przecinają się wtedy i tylko wtedy, gdy: 

 

punkty    i    leżą po przeciwnych stronach 
prostej 

  i punkty  &  i    leżą po przeciwnych 

stronach prostej 

 

background image

 

któryś z końców jednego z odcinków należy do 
drugiego.   

 

Czyli mamy warunki: 

/ 4

,  , )5 ≠ / 4

( ,  , & )5

∧ 

/ 4

(&, , )5 ≠ / 4

(&, , )5

 

oraz (jeżeli początek lub koniec jednego z odcinków 
należy do drugiego): 

/ 4

(   ,  , &)5 = 0

 

4( ( ) <  (&) <  ( )

∧ 

( )   <   (&)   <   ( )5

 

lub: 

/ 4

( , , )5   =  0

∧ 

4(  ( ) <  ( ) <  ( )

 ∧ 

( ) < ( ) < ( )5

 

lub: 

/  4

(&, , )5   =  0

∧ 

4  (&) <  ( ) <  (   )

( & )   <   ( )

<   (  )5

 

lub:   

/  4

(&, , )5 = 0

4  (&) <  ( ) <  ( )

 ∧ 

(&) <  (  ) < (  ) 5

przy założeniu, że 

background image

 2

2    

  w przypadku, gdy punkt 

&  lub    należy do    oraz 

  & %   

∧ 

& %

 

w przypadku, gdy punkt    lub    należy do 

&

background image

Problem przynależności punktu do wielokąta 

WarPocz

: Dany jest ciąg punktów: 

7

8

, 7

9

, . . . , 7

;<9

 

określający n-wierzchołkowy wielokąt 

=  i taki, że dla 

każdego 

>   0,1, . . . ,   . 1  odcinek  7

?

7

? @9

  jest 

bokiem wielokąta 

=  (> A 1  jest wyliczane modulo 

). Dany jest również punkt  . 

WarKonc: 

Odpowiedź na pytanie, czy punkt    należy 

do wielokąta 

=Jeżeli punkt    leży na boku 

wielokąta, to stwierdzamy, że należy do wielokąta 

Algorytm   

Algorytm rozwiązujący problem przynależności opiera 
się na zależności pomiędzy liczbą przecięć dowolnej 
półprostej o początku w punkcie  a bokami 
wielokąta. 

 

Punkt    należy do wielokąta 

=  wtedy i tylko wtedy, 

gdy półprosta 

. B  przecina boki wielokąta nieparzystą 

liczbę razy. Zachodzą przy tym 

dwa przypadki 

szczególne

background image

 

 

Półprosta 

. B  przechodzi przez wierzchołek 

wielokąta

 

 

Półprosta 

. B  zawiera bok wielokąta.

 

 

Uwaga !!! 

Zanim zaczniemy wyznaczać liczbę punktów przecięcia 
półprostej z bokami wielokąta, sprawdzamy, czy punkt 

  nie zawiera się w którymś z boków wielokąta. 

 

Prosta 

. B  zawiera bok  &

C

&

D

  wielokąta. Niech 

&

E

&

C

 

oraz 

&

D

&

F

 

będą bokami sąsiadującymi z bokiem 

&

C

&

D

punkty 

&

E

  

&

F

 

będą końcami tych boków. Jeżeli 

punkty 

&

E

  

&

F

 

leżą po tej samej stronie prostej

 

. B

to przyjmujemy, że liczba punktów przecięcia 

. B  

bokami 

&

C

&

D

&

E

&

C

  

&

D

&

F

 

wynosi

 0. W przeciwnym 

razie

 przyjmujemy, że liczba ta 

wynosi

 1. 

Prosta 

. B  zawiera wierzchołek  &

G

  wielokąta. Niech 

&

9

&

G

 

oraz 

&

G

&

E

  będą bokami sąsiadującymi z 

background image

wierzchołkiem 

&

G

a punkty 

&

9

  

&

E

  będą końcami 

tych boków. Jeżeli punkty 

&

9

  

&

E

  leżą po tej samej 

stronie prostej

 

. Bto przyjmujemy, że liczba punktów 

przecięcia 

. B  z bokami  &

9

&

G

  

&

9

&

G

 

wynosi

 0. W 

przeciwnym

 

razie

 przyjmujemy, że liczba ta 

wynosi

 1. 

Ponieważ koszt obliczeń związanych z każdym bokiem i 
wierzchołkami n - kąta jest stały, 

złożoność 

obliczeniowa

 sprawdzenia, czy punkt leży w jego 

wnętrzu, jest 

( )