Você está na página 1de 47

Geometrie computationala I

Dorel Lucanu
Faculty of Computer Science
Alexandru Ioan Cuza University, Iasi, Romania
dlucanu@info.uaic.ro

PA 2014/2015

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

1 / 46

Outline

Introducere
Motivatie
Cunoasterea domeniului problemei
Operatii primitive

Structura DCEL

Localizarea unui punct

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

2 / 46

Introducere

Plan

Introducere
Motivatie
Cunoasterea domeniului problemei
Operatii primitive

Structura DCEL

Localizarea unui punct

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

3 / 46

Introducere

Motivatie

Plan

Introducere
Motivatie
Cunoasterea domeniului problemei
Operatii primitive

Structura DCEL

Localizarea unui punct

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

4 / 46

Introducere

Motivatie

Ce este geometria computationala


Obiectele geometrice - punctele, liniile, poligoanele, etc. - constituie baza
multor aplicatii si conduc la multe probleme si algoritmi interesanti.
Disciplina a fost numita n jurul anului 1975, cand teza de doctorat a lui
Shamos a atras atentia multor cercetatori.
In centrul acestei discipline sta o serie de tehnici de proiectare si de analiza
a algoritmilor. Acesti algoritmi opereaza cu sau sunt ghidati de o serie de
structuri de date caracteristice geometriei computationale. Acestea includ
aranjamente de obiecte geometrice, localizari, nfasuratoarea convexa,
diagrame Voronoi, triangularizari.
Scopul urmatoarelor doua lectii este de a face o scurta introducere n
algoritmica din acest domeniu.
Putem vedea aceste lectii ca un studiu de caz de algoritmica specifica unui
domeniu (Domain Specific Algorithms).
Vom considera numai obiecte din geometria plana.
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

5 / 46

Introducere

Motivatie

Aplicatii

grafica (computer vision, reconstruirea de imagini)


robotica (miscare n plan, vizibilitate)
proiectare aistata de calculator (CAD)
siteme informatice geografice (GIS)
statistica

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

6 / 46

Introducere

Cunoasterea domeniului problemei

Plan

Introducere
Motivatie
Cunoasterea domeniului problemei
Operatii primitive

Structura DCEL

Localizarea unui punct

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

7 / 46

Introducere

Cunoasterea domeniului problemei

Puncte

Un punct p poate fi reprezentat prin coordonate carteziene, P = (x, y ), sau


coordonate polare, P = (, ).

p=(x,y)

p=(, )

Conversii (partial):

D. Lucanu (FII - UAIC)

p
(x, y ) 7 ( x 2 + y 2 , atan(y /x)) (x 6= 0)
(, ) 7 ( cos(), sin())

Geometrie computational
a

PA 2014/2015

8 / 46

Introducere

Cunoasterea domeniului problemei

Tipuri de date pentru puncte


structuri
Coordonate carteziene:
P |-> {x |-> 4, y |-> 3}
P 7 vP , vP CPoint
CPoint = Str hx : Float, y : Floati = {{x 7 vx y 7 vy } | vx , vy Float}}
Coordonate polare:
P |-> {rho |-> 5, theta |-> 0.643501109}
P 7 vP , vP PPoint
PPoint = Str hrho : Float, theta : Floati = {{rho 7 theta 7 } |
, Float}}

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

9 / 46

Introducere

Cunoasterea domeniului problemei

Segmente

Un segment este reprezentat de o pereche de puncte:


{A |-> {x |-> 1, y |-> 2} B |-> {x |-> 4, y |-> 3}}
Accesarea coordonatelor: A.x

A.y

B.x

B.y . . .

3
2
1

Nu considera (nca) o structura de date distincta pentru segmente.

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

10 / 46

Introducere

Cunoasterea domeniului problemei

Linii poligonale

Structura de date: lista liniare de puncte


Pot fi:
simple
nchise/deschise

linie poligonala

D. Lucanu (FII - UAIC)

linie poligonala
simpla

linie poligonala
inchisa

Geometrie computational
a

linie poligonala
simpla inchisa

PA 2014/2015

11 / 46

Introducere

Cunoasterea domeniului problemei

Structuri de date pentru linii poligonale


liste liniare
PoligLine = LLinhCPointi

sau

PoligLine = LLinhPPointi

Crearea unei liste cu punctele:


A = { x |-> 3 y |-> 5 };
B = { x |-> 2 y |-> 1 };
C = { x |-> 0 y |-> 0 };
se poate face prin
L = empty();
L = empty();
L.insert(0, A);
L[0] = A;
sau
L.insert(1, B);
L[1] = B;
L.insert(2, C);
L[2] = C;
Reamintim ca pentru listele liniare L[i] este aceeasi cu L.lookup(i) si
L[i] = x este aceeasi cu L.insert(i, x)
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

12 / 46

Introducere

Cunoasterea domeniului problemei

Dreapta
O dreapta este reprezentata printr-o ecuatie liniara: a x + b y + c = 0

Structura de date: structura


Line = Str ha : Float, b : Float, c : Floati
Exemplu: dreapta 3x + 4y + 2 = 0 este reprezentata de structura
d |-> {a |-> 3 b |-> 4 c |-> 2}
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

13 / 46

Introducere

Cunoasterea domeniului problemei

Dreapta care trece prin doua puncte distincte P si Q


Se rezolva sistemul:

d.a P.x + d.b P.y + d.c = 0


d.a Q.x + d.b Q.y + d.c = 0

Exercitiu: Sa se scrie un algoritm care determina dreapta ce trece prin


doua puncte distincte P si Q. Dovediti corectitudinea algoritmului.

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

14 / 46

Introducere

Operatii primitive

Plan

Introducere
Motivatie
Cunoasterea domeniului problemei
Operatii primitive

Structura DCEL

Localizarea unui punct

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

15 / 46

Introducere

Operatii primitive

Pozitionarea unui punct fata de o dreapta


Fie P un punct si d o dreapta. Relativ la d, P se poate afla:
ntr-un semiplan: d.a * P.x + d.b * P.y + c > 0
pe dreapta: d.a * P.x + d.b * P.y + c = 0
pe celalalt semiplan: d.a * P.x + d.b * P.y + c < 0
Notam cu (d, P) semiplanul determinat de dreapta d si punctul P.
Pozitionarea fata de un segment AB:
se determina dreapta suport
daca se afla pe dreapta, se verifica daca este ntre A si B
Se poate testa si n ordine inversa.
Timp uniform: O(1)

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

16 / 46

Introducere

Operatii primitive

Intersectia a doua drepte (cand exista)




a1 x + b1 y + c1 = 0
a2 x + b2 y + c2 = 0




c1 b1
a1 b1




dx =
d =
c2 b2
a2 b2



a1 c1


dy =
a2 c2

d = 0, drepte paralele
d 6= 0, sistemul are solutie unica: x =

dy
dx
, y=
d
d

In notatia structurilor de date pentru drepte:




d1.a d1.b

= d1.a d2.b d1.b d2.a
d =
d2.a d2.b
Timp uniform: O(1)
Exercitiu: Sa se scrie n Alk un algoritm care are la intrare doua drepte si
furnizeaza la iesire punctul de interesectie al dreptelor (cand exista).
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

17 / 46

Introducere

Operatii primitive

Intersectia a doua segmente (cand exista)


Solutia 1:
se determina punctul P de intersectie a dreptelor suport
se verifica daca P apartine segmentelor
Solutia 2 (sweep line):
se baleiaza (matura) planul cu o dreapta orizontala (sau verticala) si
se analizeaza pozitiile punctelor eveniment (detalii pe tabla)
un punct eveniment este dat de intersectia dintre dreapta care matura
planul si un capat al unui segment
Timp uniform: O(1)
Exercitiu: Sa se scrie algoritmi care stermina interesectia a doua segmente
(cand exista) prin cele doua metode. Sa se arate corectitudinea fiecarui
algoritm.
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

18 / 46

Introducere

Operatii primitive

Orientarea a trei puncte (primitiva ccw)


CCW = Counter-Clock-Wise (sensul invers arcelor de ceasornic)
Fie A, B, C trei puncte.
A.x A.y

ccw(A, B, C) = B.x B.y
C.x C.y
ccw(A, B, C) > 0 : A,
ceasornic

1
1
1
B,







C formeaza un ciclu n sens invers arcelor de

ccw(A, B, C) < 0 : A, B, C formeaza un ciclu n sensul arcelor de


ceasornic
ccw(A, B, C) = 0 : A, B, C sunt coliniare
Timp uniform: O(1)
Exercitiu: Sa se scrie un algoritm n Alk care calculeaza ccw(A, B, C).
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

19 / 46

Introducere

Operatii primitive

Localizarea unui punct fata de un triunghi


C
P

ccw(A, P, B), ccw(B, P, C) si ccw(C, P, A) au toate acelasi semn.


C
B

A
P

ccw(A, P, B), ccw(B, P, C) si ccw(C, P, A) NU au toate acelasi


semn.
Timp uniform: O(1)
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

20 / 46

Introducere

Operatii primitive

Unghiul format de trei puncte


C

- distanta dintre
doua puncte:
p
dist(P, Q) =

(Q.x P.x) (Q.x P.x) + (Q.y P.y) (Q.y P.y)

- se aplica teorema cosinusului


a = dist(C, B);
b = dist(C, A);
c = dist(A,B);
theta = acos((a*a + b*b - c*c)/ 2*a*b);
Timp uniform: O(1) (Care e timpul pentru operatiile
D. Lucanu (FII - UAIC)

Geometrie computational
a

si acos()?)
PA 2014/2015

21 / 46

Introducere

Operatii primitive

Localizarea unui punct fata de o linie poligonala simpla


nchisa
Theorem (Jordan)
Orice curba simpla nchisa mparte planul n doua regini distincte:
interiorul liniei (marginita) si exteriorul (nemarginita).
Instance: O linie poligonala simpla nchisa L si un punct P.
Question: Apartine P interiorului lui L?

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

22 / 46

Introducere

Operatii primitive

Localizarea unui punct fata de o linie poligonala simpla


nchisa
Theorem (Jordan)
Orice curba simpla nchisa mparte planul n doua regini distincte:
interiorul liniei (marginita) si exteriorul (nemarginita).
Instance: O linie poligonala simpla nchisa L si un punct P.
Question: Apartine P interiorului lui L?

numar de intesectii impar


interior,
P

D. Lucanu (FII - UAIC)

numar de intesectii par


exterior

Geometrie computational
a

PA 2014/2015

22 / 46

Introducere

Operatii primitive

Localizarea unui punct fata de o linie poligonala simpla


nchisa
Numaratul intersectiilor trebuie facut cu atentie deoarece sunt cazuri de
exceptie:
se numara o
singura data
nu se numara
P

nu se numara

Calculul unei intersectii: O(1)


Determinarea numarului de intersectii: O(n), n numarul de segmente ale
liniei L
Exercitiu: Sa se scrie n Alk algoritmul care determina localizarea unui punct fata
de o linie poligonala simpla nchisa. Sa se arate ca algoritmul este corect si sa se
verifice ca timpul de executie este O(n).
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

23 / 46

Structura DCEL

Plan

Introducere
Motivatie
Cunoasterea domeniului problemei
Operatii primitive

Structura DCEL

Localizarea unui punct

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

24 / 46

Structura DCEL

Planar Straight Line Graph (PSLG)

P3

P1
P2

F3

F2
F1
P6

F4
F5

F6

P5
P8

P4
F0

P7

D. Lucanu (FII - UAIC)

P0

Geometrie computational
a

PA 2014/2015

25 / 46

Structura DCEL

Planar Straight Line Graph (PSLG)

un graf planar este un graf care poate fi scufundat n plan astfel ncat
varfurile sunt puncte din plan iar muchiile sun curbe n plan care nu
se intersecteaza
orice graf planar admite o scufundare n plan n care muchiile sunt
segmente (Fary, 1948)
un PSLG este graf conex planar scufundat n plan, n care muchiile
sunt segmente

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

26 / 46

Structura DCEL

Structura DCEL: ideea


P3
P2
F3
F4
P4

P0

G = o lista de structuri; fiecare element a tabloului descrie o muchie


G[i1] == { V1 |-> 2 V2 |-> 4 F1 |-> 3
F2 |-> 4
...
G[i2] == { V1 |-> 3 V2 |-> 2 F1 |-> 3
F2 |-> ...
...
G[i3] == { V1 |-> 4 V2 |-> 0 F1 |-> ... F2 |-> 4

Ptr1 |-> i2

Ptr2 |-> i3 }

Ptr1 |-> ...

Ptr2 |-> ... }

Ptr1 |-> ... Ptr2 |-> ... }

Echivalent: G[i1].V1 == 2, G[i1].V2 == 4, G[i1].F1 == 3, G[i1].F2 == 4 . . .


D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

27 / 46

Structura DCEL

Structura DCEL: descriere


DCEL = Double Connected Edge List
fiecare nod al structurii DCEL este memorat ntr-o componenta a
tabloului
exista o corespondenta 1-1 ntre muchiile PSLGului si elementele listei
V1 - primul varf al muchiei, V2 al doilea varf al muchiei
F1 - regiunea din stanga muchiei, F2 regiunea din dreapta muchiei
Ptr1 - adresa primului nod (muchie) ntalnit mergand n sensul CCW
din V1,
Ptr2 - adresa primului nod (muchie) ntalnit mergand n sensul CCW
din V2 (n ambele cazuri se pleaca de pe muchia curenta V1 V2 de la
V1 la V2)

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

28 / 46

Structura DCEL

Structura DCEL: parcurgerea frontierei unei regiuni


Data o regiune F , sa se descrie care parcurge muchiile care marginesc F .
P3

P1
P2

F3

F2
F1
P6

F5
F6
P7

D. Lucanu (FII - UAIC)

F4
P5
P8

P4
F0

P0

Geometrie computational
a

PA 2014/2015

29 / 46

Structura DCEL

Structura DCEL: parcurgerea frontierei unei regiuni (cont.)


Cazul particular pentru F = F5 :
1

se determina o muchie i1 care este pe frontiera lui F5 , sa zicem P5 P6


(G [i1 ].V 1 == 5, G [i1 ].V 2 == 6, G [i1 ].F 1 == 5)

urmatoarea muchie i2 a lui F5 este va gasita parcurgand muchiile din P5


CCW, plecand de pe P5 P6 , adica i2 = G [i1 ].Ptr 1

avem G [i2 ].V 1 == 5, G [i2 ].V 2 == 0, G [i2 ].F 1 == 5 (P5 P0 )

procedam n acelasi mod


i3 = G [i2 ].Ptr 1; avem G [i3 ].V 1 == 0, G [i3 ].V 2 == 8, G [i3 ].F 1 == 5 (P0 P8 )
i4 = G [i3 ].Ptr 1; avem G [i4 ].V 1 == 8, G [i4 ].V 2 == 6, G [i1 ].F 1 == 5 (P8 P6 )

pana cand ntalnim din nou i1 , adica G [i4 ].Ptr 1 == i1

cele 4 muchii sunt date de elementele de pe pozitiile i1 , i2 , i3 , i4

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

30 / 46

Structura DCEL

Structura DCEL: parcurgerea frontierei unei regiuni (cont.)

Gasirea unei muchii de pe frontiera regiunii Ff :


i = 0;
while (G[i].F1 != f and G[i].F2 != f)
i = i + 1;
Daca f este valida, atunci bucla while se termina. Dupa executia lui
while, are loc G[i].F1 == f sau G[i].F2 == f.
Are importanta pe ce parte se afla regunea f ?
Raspuns: Da. (De ce?)

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

31 / 46

Structura DCEL

Structura DCEL: parcurgerea frontierei unei regiuni (cont.)

dreapta

stanga

Tot timpul trebuie ramas n regiunea f .

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

32 / 46

Structura DCEL

Structura DCEL: parcurgerea frontierei unei regiuni (cont.)


Gasirea clorlalte muchii de pe frontiera regiunii Ff (le memoram n tabloul
edgesOf [f ]):
j = -1; i1 = i;
do {
j = j + 1;
edgesOf[f][j] = i;
if (G[i].F1 == f)
// stanga
i = G[i].Ptr1;
else
// dreapta
i = G[i].Ptr2
} until (terminat )
// j == numarul de muchii de pe frontiera lui f
Care e conditia de terminare?
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

33 / 46

Structura DCEL

Structura DCEL: parcurgerea frontierei unei regiuni (cont.)

Un posibil candidat pentru terminare: i == i1 (s-a ajuns n muchia din


care s-a plecat)
E corect? Exista cazuri cand prima muchie poate fi vizitata de doua ori?

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

34 / 46

Structura DCEL

Structura DCEL: parcurgerea frontierei unei regiuni (cont.)

i1

f este regiunea exterioara.


Conditia de terminare corecta: s-a ajuns n muchia din care s-a plecat prin
capatul opus.
leaveI1 = capatul prin care se pleaca din i1
reachI = capatul prin care se ajunge n i
Conditia de terminare: i == i1 and reachI != leaveI1
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

35 / 46

Structura DCEL

Structura DCEL: parcurgerea frontierei unei regiuni (cont.)


j = -1; i1 = i;
do {
j = j + 1;
edgesOf[f][j] = i;
iprec = i;
if (G[i].F1 == f) { // stanga
i = G[i].Ptr1;
if (iprec == i1) leaveI1 = 1; // nu e foarte efficient!
}
else {
// dreapta
i = G[i].Ptr2
if (iprec == i1) leaveI1 = 2;
}
if (G[i].V1 == G[iprec].V1 || G[i].V1 == G[iprec].V2) reachI = 1;
else reachI = 2;
} until (i == i1 and reachI != leaveI1)
Timpul n cazul cel mai nefavorabil: O(n), unde n este numarul de muchii.
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

36 / 46

Structura DCEL

Structura DCEL: parcurgerea tuturor regiunilor


Se utilizeaza o coada toBeVisisted, initial vida.
Se pleaca dintr-o muchie de pe frontiera PSGului (una din fete este
regiunea nemarginita). Presupunem ca aceasta este P7 P8 . Se viziteaza
fata marginita, F6 si se parcurge frontiera sa pentru a adauga fetele vecine
neprocesate n toBeVisisted (care devine egala cu [F5 ]).
P3

P1

vizitat

P2
F3

F2
F1
P6

F4
F5

F6
P7

D. Lucanu (FII - UAIC)

in coada

P5

P4

P8

F0

P0
Geometrie computational
a

F6

F5

PA 2014/2015

37 / 46

Structura DCEL

Structura DCEL: parcurgerea tuturor regiunilor (cont.)


Se continua pe frontiera regiunii nemarginite pana se ntalneste o regiune
nevizitata sau care nu e n toBeVisisted, F0 . Se viziteaza fata marginita,
F0 , apoi se parcurge frontiera sa pentru a adauga fetele vecine neprocesate
n toBeVisisted (care devine egala cu [F5 , F4 ]).
P3

P1

vizitat

P2
F3

F2
F1
P6

F4
F5

F6
P7

D. Lucanu (FII - UAIC)

in coada

P5

P4

P8

F0

P0

Geometrie computational
a

F6

F0

F5

F4

PA 2014/2015

38 / 46

Structura DCEL

Structura DCEL: parcurgerea tuturor regiunilor (cont.)


Se continua pe frontiera regiunii nemarginite pana se ntalneste o regiune
nevizitata sau care nu e n toBeVisisted, F3 . Se viziteaza fata marginita,
F3 , apoi se parcurge frontiera sa pentru a adauga fetele vecine neprocesate
n toBeVisisted (deoarece nu exista astfel de rgiuni, toBeVisisted
ramane neschimbata, [F5 , F4 ]).
P3

P1

vizitat

P2
F3

F2
F1
P6

F4
F5

F6
P7

D. Lucanu (FII - UAIC)

in coada

P5

P4

P8

F0

P0
Geometrie computational
a

F6

F0

F5

F4

F3

PA 2014/2015

39 / 46

Structura DCEL

Structura DCEL: parcurgerea tuturor regiunilor (cont.)


Se continua pe frontiera regiunii nemarginite pana se ntalneste o regiune
nevizitata sau care nu e n toBeVisisted, F2 . Se viziteaza fata marginita,
F0 si se parcurge frontiera sa pentru a adauga fetele vecine neprocesate n
toBeVisisted (care devine egala cu [F5 , F4 , F2 ]).
P3

P1

vizitat

P2
F3

F2
F1
P6

F4
F5

F6
P7

D. Lucanu (FII - UAIC)

in coada

P5

P4

P8

F0

P0

Geometrie computational
a

F6

F0

F5

F4

F3

F2
F1

PA 2014/2015

40 / 46

Structura DCEL

Structura DCEL: parcurgerea tuturor regiunilor (cont.)


Se continua pe frontiera regiunii nemarginite pana se ntalneste o regiune
nevizitata sau care nu e n toBeVisisted. Deoarece nu mai exista, se
conitinua cu vizitarea fetelor din toBeVisisted (egala cu [F5 , F4 , F2 ]).
Pentru fiecare fata vizitata, se parcurge frontiera sa pentru a adauga fetele
vecine neprocesate n toBeVisisted (daca e cazul).
P3

P1

vizitat

P2
F3

F2
F1
P6

F4
F5

F6
P7

D. Lucanu (FII - UAIC)

in coada

P5

P4

P8

F0

P0
Geometrie computational
a

F6

F0

F5

F4

F3

F2
F1

PA 2014/2015

41 / 46

Structura DCEL

Structura DCEL: parcurgerea tuturor regiunilor (cont.)

Sa se descrie algoritmul de parcurgere a tuturor regiunilor n limbaj


algoritmic. Sa se arate ca este corect si ca are timpul de executie O(n),
unde n este timpul de executie.

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

42 / 46

Localizarea unui punct

Plan

Introducere
Motivatie
Cunoasterea domeniului problemei
Operatii primitive

Structura DCEL

Localizarea unui punct

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

43 / 46

Localizarea unui punct

Localizarea unui punct fata de un PSLG

Input: Un PSLG G si un punct P.


Output: Regiunea la care apartine P.

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

44 / 46

Localizarea unui punct

Localizarea unui punct fata de un PSLG

banda (slab)

D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

45 / 46

Localizarea unui punct

Localizarea unui punct fata de un PSLG


1

Preprocesare
1
2

sorteaza benzile n ordine crescatoare dupa y


sorteaza segmentele de pe o banda n ordine crescatoare dupa x
Observatie: trapezele de pe o banda pot degenera si n triunghiuri

Procesare
1
2

cauta binar banda pe care apare P


cauta binar trapezul la care partine P pe banda gasita la punctul
anterior.

Timp:
preprocesare: O(n2 log n) (pot fi n2 segmente pe o banda n cazul cel mai
nefavorabil - exemplu pe tabla)
procesare: O(log n)
Preprocesarea se poate reduce la O(n2 ) printr-o tehnica de sweep plane.
Exercitiu: scrierea n limbajul Alk al algoritmului
D. Lucanu (FII - UAIC)

Geometrie computational
a

PA 2014/2015

46 / 46

Você também pode gostar