algoritmi şi probleme geometrie computationala

Upload: andrei-malai

Post on 06-Apr-2018

328 views

Category:

Documents


2 download

TRANSCRIPT

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    1/76

    Copie autorizata pentru .campion

    \

    Sergiu CORLAT

    Algoritmi i problemede geometrie computaional

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    2/76

    Copie autorizata pentru .campion

    Aprobat la edina Senatului Universitii de Stat dinTiraspol din 26 ianuarie 2009.

    Toate drepturile asupra acestei ediii aparin autorului.

    Reproducerea integral sau parial a textului sau ailustraiilor din aceast ediie este permis doar cu acor-dul scris al autorului.

    Autor: Sergiu Corlat, lector superior, UST

    Recenzeni: Andrei Braicov,doctor, confereniar universitar, UST

    Emanuela Cerchez,

    profesor gradul I, Liceul de Informatic

    Grigore Moisil, Iai

    Redactor: Tatiana Rusu

    Coperta: Valentina Stratu

    Sergiu Corlat, 2009 EdituraPrut Internaional, 2009

    Editura Prut Internaional, str. George Enescu, nr. 6,bl.1, Chiinu MD 2064Tel.: 75 18 74, 74 93 18; fax: 50 87 20; e-mail: [email protected]

    CZU 519.6+514 C15

    ISBN 978-9975-69-377-6

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    3/76

    Copie autorizata pentru .campion

    Cuprins

    Introducere 5

    1. Transformri de coordonate 7

    1.1. Deplasri i rotaii 71.2. Coordonate polare 91.3. Implementri 10

    2. Intersecii 12

    2.1. Intersecia dreptelor 122.2. Intersecia dreptei cu un segment 142.3. Intersecia segmentelor 16

    3. nfurtoarea convex 17

    3.1. Algoritmul elementar 173.2. Algoritmul Graham 20

    4. Triangularizri 26

    4.1. Un algoritm greedy pentrumulimi de puncte 26

    4.2. Triangularizarea poligoanelor convexe 28

    4.3. Triangularizarea poligoanelor simple 29

    5. Apropiere i apartenen 31

    5.1. Cea mai apropiat pereche de puncte 315.2. Apartenena punctului la un domeniu 355.3. Poligonul i diagrama Voronoi 395.4. Nuclee 44

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    4/76

    Copie autorizata pentru .campion

    6. Probleme geometrice de concurs 48

    6.1. Robot 486.2. Robot II 506.3. Piatra 526.4. Carcasa 546.5. Turnuri 566.6. Atac 576.7. Evadare 616.8. Arcai 62

    6.9. Cetate 686.10. Druizi 69

    Notaii 75Bibliograe 76

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    5/76

    5

    Copie autorizata pentru .campion

    Introducere

    Geometria computaional constituie una din ramurile

    importante ale matematicii aplicate moderne. Pornindde la cercetarea unor elemente geometrice simple (punct,segment, dreapt), se ajunge la o modelare complex agurilor geometrice n plan i a corpurilor n spaiul tri-dimensional.

    Algoritmii geometriei computaionale stau la baza tutu -ror aplicaiilor de proiectare i modelare grac (aplicaii

    CAD, procesoare de grac vectorial, aplicaii de modelare3D). Fr ei ar imposibil proiectarea construciilor ar-hitecturale moderne, realizarea proiectelor GPS, apariiamajoritii absolute a produselor cinematograce de suc-ces din ultimii ani. Enumerarea domeniilor de aplicarepoate continuat la nesfrit.

    Domeniul vast de aplicare i multitudinea fenome-

    nelor i situaiilor reale, descrise n termenii geometrieicomputaionale, au impus apariia unor probleme geome-trice n cadrul concursurilor de programare de cele maidiferite nivele.

    Prezenta lucrare este conceput ca un curs de iniiere nalgoritmii de geometrie computaional pentru studeniifacultilor de prol, pentru profesorii de informatic,precum i pentru elevii claselor liceale, participani laconcursurile naionale i internaionale de programare.

    Un alt scop este de a-i forma cititorului abiliti deanaliz i proiectare a algoritmilor. n acest sens, algo-ritmii i soluiile problemelor sunt nsoite de descrieriale structurilor de date, fragmente de cod, de calcule alecomplexitii.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    6/76

    6

    Copie autorizata pentru .campion

    Cu toate c aparatul matematic necesar pentru re-zolvarea problemelor de geometrie computaional esterelativ simplu, implementarea acestuia este nsoit de

    necesitatea cercetrii unui numr considerabil de cazurispeciale. Acesta este un motiv pentru care problemele degeometrie computaional se consider printre cele maidicile, n special n condiii de concurs.

    Cercetarea i optimizarea soluiilor propuse pentruunele din problemele prezente n lucrare i vor permitecititorului s capete o experien necesar la comparti-

    mentul rezolvare de probleme i, nu n ultimul rnd, lagenerarea testelor pentru vericarea soluiilor.La baza lucrrii se a o serie de articole publicate

    pe parcursul ultimilor ani n revista de matematic iinformatic Delta, materiale i probleme elaborate ncadrul colilor de var la informatic (ediiile anilor2001, 2002), precum i probleme propuse la concur-

    sul de pregtire continu la informatic .campion(campion.edu.ro).in s aduc sincere mulumiri tuturor celor care au

    contribuit la apariia acestei cri, n special colectivuluiCatedrei de Informatic i Tehnologii Informaionale aUniversitii de Stat din Tiraspol.

    Ianuarie2009 Sergiu Corlat

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    7/76

    7

    Copie autorizata pentru .campion

    1. Transformri de coordonate

    1.1. Deplasri i rotaiiRezolvarea oricrei probleme de geometrie computa-

    ional ncepe (dac e necesar) cu deplasarea coordonate-lor elementelor cercetate (de cele mai dese ori, ale puncte-lor) ntr-un domeniu potrivit al sistemului de coordonate(de obicei, n cadranul unu). n unele cazuri, deplasareapoate nsoit i de rotaia sistemului de coordonate.

    Fie ntr-un sistem cartezian de coordonate un punct pde coordonate (x,y). Deplasarea de coordonate de-a lungulaxei Ox cu o valoare dat a implic o modicare a coordo-natelor punctului conform formulelor:

    ,

    .

    x x a

    y y

    = + =

    n cazul deplasrii de-a lungulaxei Oy cu valoarea b, transformareade coordonate va dat de sistemul:

    ,

    .

    x x

    y y b

    = = +

    Modicarea combinat a coordo-

    natelor cu a dup axa Ox i b dupOy va dat de sistemul:

    ,

    .

    x x a

    y y b

    = + = +

    Urmtorul tip de transformare este rotaia cu un unghia punctului (punctelor) fa de originea sistemului decoordonate (g. 1.1).

    Fig. 1.1. Rotaia punctuluicu un unghi

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    8/76

    8

    Copie autorizata pentru .campion

    n unele cazuri,operaia poate re-alizat invers: prin

    rotaia originii siste-mului de coordonatefa de un punct (sausistem de puncte) dat.

    Atunci exist patrunumere a, b, c, d, carepermit de a trece uni-

    voc coordonatele ( , )x y n ( , )x y , utilizndsistemul de ecuaii:

    ,(1.1)

    .

    x ax by

    y cx dy

    = + = +

    Pentru a determina acest cuadruplu de numere, pot

    folosite punctele (1, 0) i (0, 1).Se observ c la rotaia cu un unghi punctul de coor-donate (1, 0) trece n punctul (cos ,sin ) , iar punctul decoordonate (0, 1) n ( sin ,cos ) (g. 1.2).

    Dup substituia acestor valori, n calitate de coecieniai sistemului (1.1) se obine:

    =

    =

    =

    =

    x a

    y c

    a

    c

    cos ,

    sin .

    Analog: =

    =

    =

    =

    x b

    y d

    b

    d

    sin ,

    cos .

    Fig.1.2. Determinarea cuadruplului a, b, c, d fo-losind punctele (1, 0) i (0, 1)

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    9/76

    9

    Copie autorizata pentru .campion

    Astfel, sistemul de ecuaii pentru rotaia cu un unghi a unui punct arbitrar n jurul originii sistemului de co-ordonate ia forma:

    = = +

    x x y

    y x y

    cos sin ,

    sin cos .

    n cazul n care rotaia cu unghiul a punctului decoordonate ( , )x y este efectuat fa de punctul de coordo-nate 0 0( , )x y , diferit de originea sistemului de coordonate,nti se transfer originea sistemului de coordonate n

    centrul de rotaie, apoi se efectueaz rotaia n jurul noiiorigini a sistemului de coordonate: =

    = +

    x x x x y y

    y y x x y y

    0 0 0

    0 0 0

    ( ) cos ( ) sin

    ( ) sin ( ) cos

    sau = +

    = + +

    x x x x y y

    y y x x y y

    0 0 0

    0 0 0

    ( ) cos ( ) sin

    ( ) sin ( ) cos

    1.2. Coordonate polare

    Problemele n care apare necesitatea parcurgerii uneimulimi de puncte , 1,i p i N = de coordonate (xi, yi) dupunghiurile formate de vectorii

    iOp

    cu axa Ox se rezolvmai simplu n coordonate

    polare, unde ecare punct peste determinat de perechea( , )r , unde r este distanade la punct pn la origineasistemului de coordonate, iar unghiul format de vecto-rul Op

    cu axa Ox (g. 1.3). Fig. 1.3. Coordonatele polare alepunctului de coordonate carteziene

    (x, y)

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    10/76

    10

    Copie autorizata pentru .campion

    Trecerea de la coordonatele carteziene (x, y) la cele po-lare este determinat de urmtoarele formule [1, p. 77]:

    r x y

    xy

    y

    x

    yy

    x y

    x y

    = + =

    >

    +

    = maxx then

    begin maxx:=drag[i].x; imax:=i; end;

    {2. separarea in submultimi}

    nsus:=1; njos:=1;

    sus[1]:=drag[imin]; jos[1]:=drag[imin];

    for i:=1 to n do

    if not (i in [imin, imax])then

    if sarrus(drag[imin],drag[imax],drag[i])

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    25/76

    25

    Copie autorizata pentru .campion

    while i0 then i:=i+1

    else beginrem:=true;

    for j:=i to nsus-1 do

    sus[j]:=sus[j+1];

    dec(nsus);

    end;

    end;

    until not rem;

    {si jos}

    repeatrem:=false; i:=2;

    while i

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    26/76

    26

    Copie autorizata pentru .campion

    4. TriangularizriDin punct de vedere geo-

    metric, triangularizarea T(S)a mulimii de puncte S esteo divizare a nfurtoareiconvexe Q(S) n triunghiuri.Suplimentar, se vor respecta

    condiiile:a) vrfri ale triunghiurilorpot numai punctedin S;

    b) toate punctele mulimiiSvor utilizate n calitate de vrfuri (g. 4.1).

    4.1. Un algoritm greedypentru mulimi de puncte

    Fie mulimea de puncte SiN=|S|. Fiecare punct p S este descris prin coordonatele sale carteziene ( , )x y . Tri-angularizarea T(S) poate cercetat ca un graf planar cumulimea de noduri S. Prin urmare, numrul de laturiM n S este proporional cu N (conform formulei Euler,

    3 6M N ).O soluie simpl n plan este generarea tuturor seg-mentelor posibile cu extremiti n S, sortarea lor duplungime, apoi adugarea consecutiv n triangularizare.n proces se veric dac latura curent intersecteaz la-turile adugate anterior. Dac interseciile lipsesc, laturaeste adugat, n caz contrar, se trece la cercetarea laturii

    urmtoare.

    Fig. 4.1. Triangularizarea unei mul-imi de puncte

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    27/76

    27

    Copie autorizata pentru .campion

    Numrul total de laturi posibile pe punctele din Seste2 2N . Fiecare latur poate cercetat ca un segment de-

    scris prin extremitile sale:

    type segment=recordp1,p2:nod; l:real;

    end;

    Prin urmare, vericarea interseciei laturilor poate realizat folosind o procedur identic cu procedura devericare a interseciei segmentelor ( 2.3).Function intersect (A,B: segment): boolean;

    Begin

    if

    sarrus(A.p2,A.p1,B.s1)*sarrus(A.p2,A.p1,B.s2) 0 and sarrus(B.s2,B.s1,A.p1)*Sarrus(B.s2,B.s1,A.p2) 0then

    intersect:= true else intersect:= false

    End;

    Calculul distanei3 dintre dou puncte ,i j p p S (lungi-mea laturii) poate realizat printr-o funcie elementar:Function distant (p[i],p[j]: nod): real;

    Begin

    distant:= sqrt(sqr(p[i].x-p[j].x)+ sqr(p[i].y-p[j].y));

    End;

    Pseudocod

    Pas 1 m 0

    Pas 2 for i 1 to N do for j 1+i to N do Begin m

    Latura[m].l distant(p[i],p[j])Latura[m].st p[i]Latura[m].n p[j]

    End;

    Pas 3 qsort(Latura,m);

    3 Pentru dou puncte a, b date prin coordonatele ( , ), ( , )a a b bx y x y ,2 2

    ( , ) a b a bd a b x x y y= + .

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    28/76

    28

    Copie autorizata pentru .campion

    Pas 4 k 0

    Pas 5 for i 1 to M do begin

    z false for j 1 to k doif intersect(Latura[i],Triang[j])

    then z true if NOT z then

    begin

    k ; Triang[k] Latura[i] end;

    end;

    Numrul total de laturi generate este proporionalcu 2N . Sortarea lor va necesita un numr de operaiiproporional cu 2 log( )N N . Complexitatea pasului 5 estedeterminat de numrul de vericri ale interseciilor,care nu depete 3N . Prin urmare, complexitatea algo-ritmului greedy este 3( )O N , ceea ce las de dorit pentruvalori mari ale lui N.

    4.2. Triangularizarea poligoanelor convexe

    Este o problem elementar, care poate rezolvat ntimp liniar.

    FiePun poligon convex, datprin lista vrfurilor p

    1, ... ,p

    Nn

    ordinea parcurgerii lor. Pentrua construi o triangularizare nP, este sucient s e constru-ite segmentele diago nale 1 3p p ,..., 1 1Np p (g. 4.2). Numruldiagonalelor este proporionalcu N (numrul de vrfuri alepoligonului). Construirea uneidiagonale necesit un numr

    Fig. 4.2. Triangularizarea unui po-

    ligon convex

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    29/76

    29

    Copie autorizata pentru .campion

    constant de operaii. Triangularizarea poligonului convexpoate util pentru calculul ariei lui. Aria poligonului esteegal cu suma ariilor triunghiurilor din triangularizare.

    4.3. Triangularizarea poligoanelor simpleMetoda greedy

    n cazul poligoanelor simple nu este posibil de a realizadirect metoda din compartimentul precedent, deoareceapar dou condiii suplimentare care trebuie vericate:

    1) aparine oare latura curent poligonului sau exte-riorului poligonului triangularizat;

    2) laturile care formeaz frontiera poligonului urmea-z s e incluse n triangularizare indiferent de loculocupat n lista distanelor.

    Vericarea primei condiii este echivalent cu verica-rea apartenenei mijlocului laturii la poligon. Algoritmul

    care rezolv aceast problem este prezentat n 5.1.Problema a doua se rezolv elementar: prin includerealaturilor ce formeaz frontiera P n nceputul listei caredescrie triangularizarea.

    Fie P un poligon simplu, dat prin lista de vrfurip

    1, ...,p

    N, n ordinea parcurgerii lor. Algoritmul greedy va

    descris de urmtorul pseudocod:

    Pas 1 m 0

    Pas 2 for i 1 toNdofor j 2+i toNdo

    Begin

    m Latura[m].l distant(p[i],p[j])

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    30/76

    30

    Copie autorizata pentru .campion

    Latura[m].st p[i]Latura[m].n p[j]

    End;

    Pas 3 qsort(Latura,m);Pas 4 for i 1 to N-1 do

    Begin

    Triang[i].st p[i]Triang[i].n p[i+1]

    End;

    Triang[N].st p[N]Triang[N].n p[1]

    k N

    Pas 5 for i 1 to M doBeginz false

    for j 1 to k do if intersect(Latura[i],Triang[j])

    then z true if NOT z then

    Begin

    x,y middle(Latura[i]) if apart(x,y,P)then

    Begin

    k ; Triang[k] Latura[i] End;

    End;

    End;

    Calculul coordonatelor mijlocului segmentului necesitun numr constant de operaii:Procedure middle(a: segment; var x,y:real);

    Beginx:=(a.st.x+ a.n.x)/2; y:=(a.st.y+ a.n.y)/2;

    End;

    Vericarea apartenenei unui punct la un poligon are ocomplexitate liniar fa de numrulNde laturi ale aces-tuia. Prin urmare, complexitatea pasului 5 i complexi-tatea total a algoritmului rmne aceeai ca i pentrualgoritmul descris n 4.1.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    31/76

    31

    Copie autorizata pentru .campion

    5. Apropiere i apartenen

    Capitolul este consacrat analizei unor probleme geome-trice n plan: determinarea celei mai apropiate perechi depuncte, apartenena punctului la un poligon, construciapoligoanelor cu proprieti prestabilite. Soluiile directe aleacestor probleme sunt relativ simple, dar nu i optime.

    5.1. Cea mai apropiat pereche de puncteFie n plan o mulime de

    puncte { }1,..., NS s s= . Se ceres se determine o pereche de

    puncte (g. 5.1)* *, , :i js s i j

    * *

    1,...,1,...,

    ( , ) min ( , ).i j i ji Nj Ni j

    d s s d s s==

    =

    Calculul direct al tuturordistanelor dintre N punctenecesit un numr de operaiiproporional cu 2N :

    index1 1; index2 2;min distance(s

    1, s

    2);

    For i1 to N doFor j

    1+i to N do

    If distance(si, s

    j) < min then

    Begin

    min distance(si, s

    j)

    index1 i; index2 j; End;

    Acelai rezultat poate obinut ntr-un timp mai re-strns, folosind algoritmul optim cu o complexitate de

    ( log )O N N .

    Fig. 5.1. Cea mai apropiat perechede puncte

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    32/76

    32

    Copie autorizata pentru .campion

    Algoritmul optim

    Pentru a determina ntimp optim cea mai apro-

    piat pereche de puncte,poate folosit tehno-logia recursiv desparte istpnete. Ideea majoreste divizarea, la ecarepas recursiv, a mulimiiiniiale n dou submulimi

    liniar separabile i rezol-varea problemei pe ecaresubmulime n parte (g. 5.2).

    Cazul elementar, care permite calculul direct al soluiei,este mulimea format din dou sau trei puncte. Numrulde operaii la acest pas este constant. Specicul problemeiconst n determinarea soluiei optime la etapa de asam-blare: avnd dou submulimi S

    1

    i S2

    , cea mai apropiatpereche de puncte n 1 2S S poate s e determinat deo pereche 1 2, : ,s s s S s S . Se poate demonstra c, laetapa asamblrii soluiei, numrul necesar de vericri laecare nivel este liniar fa de numrul de puncte din mul-imile asamblate. Numrul de divizri consecutive ale mul-imii n submulimi balansate4 nu va depi log( )N . Dacnumrul de operaii necesare pentru determinarea soluiei

    la un nivel de asamblare este proporional cu N, com-plexitatea nal a algoritmului va ( log )O N N . Pentrusoluionarea optim a problemei este necesar o preproce-sare a mulimii: sortarea punctelor dup abscis (se obineirul sortat X) i sortarea punctelor dup ordonata lor (seobine irul sortat Y). Avnd complexitatea ( log )O N N ,sortarea nu modic complexitatea nal a algoritmului.

    Fig. 5.2. Divizarea mulimii n submulimiseparabile fa de dreapta l pentru re-zolvarea recursiv a problemei cea maiapropiat pereche de puncte

    4 Numrul de elemente din ecare submulime difer cu cel mult 1.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    33/76

    33

    Copie autorizata pentru .campion

    Fie la un nivel de divizare mulimea S, irul Xal ele-mentelor din Ssortate dup abscisax, irul Ycu elemen-tele Ssortate dup ordonatay.

    Aparent, procesul de asamblare a soluiei la un niveldat are o complexitate 2( )O N : maxim Npuncte n S1

    imaxim Npuncte n S

    2, dintre care urmeaz s e calcu-

    late distanele. n realitate,numrul de operaii estemult mai mic.

    Fie S a fost divizat nsubmulimile S

    1

    i S2

    , pecare au fost determinatedistanele minime 1 i2 , precum i perechilerespective de puncte. Seconsider = min( , )1 2 (g. 5.3).

    Pentru determinarea soluiei optime pe 1 2S S este

    necesar de a cerceta doar punctele situate n fia delime de la dreapta lcare separ submulimile. Cele-lalte puncte din submulimi se a, evident, la o distanmai mare dect unul de altul i nu pot mbuntisoluia. Aceast restrngere nu garanteaz efectuareaunui numr liniar de operaii,deoarece pentru un punct cer-cetat 1s S n fia poate unnumr de puncte proporional cu

    2S . O analiz mai detaliat per-mite excluderea din cercetare atuturor punctelor care se a nexteriorul dreptunghiului de di-mensiunile 2 , asociat pun-ctului s (g. 5.4). Numrul de

    puncte ale mulimii S2 care se pot

    Fig. 5.3. Determinarea punctelor poten-

    iale pentru soluia pe 1 2S S

    Fig. 5.4. Zona de cercetare n

    S2pentru un punct dat 1s S

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    34/76

    34

    Copie autorizata pentru .campion

    aa n aceast zon nu poate mai mare dect 6. Prin urmare,numrul de vericri la etapa de

    asamblare nu va depi 6N.Folosind irurile X i Y, se

    formeaz irul Y , care coninepunctele din S situate n fia[ , ]l l + , sortate dup y mulimea punctelor care potmbunti soluia. Pentru e-

    care element din Y se calcu-leaz distanele doar pn la urmtoarele 8 elemente: elereprezint (n cel mai ru caz) simetric 6 puncte din S

    2

    plus 6 puncte din S1minus 3 puncte care coincid, minus

    punctul cercetat (g. 5.5).

    Pseudocod

    Preprocesare

    X S, sort(X) {sortare dupx}

    Y S, sort(Y) {sortare dupy}

    Procedure apr2p(S, X, Y)

    If 4S thenbegin formeaz 1 2 1 2 1 2, , , , ,S S X X Y Y

    min (apr2p( 1 1 1, ,S X Y),apr2p( 2 2 2, ,S X Y ))

    formeaz Y fori 1toY do

    forj 1to8do ifdistance( Y [i], Y [i+j]) <

    then distance ( Y [i], Y [i+j]) return

    end else return distana minim n S{calculat direct}

    Fig. 5.5. Numrul elementelorconsecutive Y care pot modicadistana minim nu depete 9

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    35/76

    35

    Copie autorizata pentru .campion

    5.2. Apartenena punctului la un domeniu

    Apartenena punctului la un poligon convex

    Problema determinrii apar-tenenei unui punct la un poli-gon convex este una simpl ipoate rezolvat cu ajutorul al-goritmilor cercetai anterior. Seobserv uor (g. 5.6) c poziiaunui punct interior fa de e-care din vectorii determinai devrfurile consecutive ale poli-gonului este una i aceeai ladreapta, dac vrfurile sunt par-curse n direcia micrii acelorde ceasornic, i la stnga, ncazul parcurgerii vrfurilor ndirecie opus.

    Poziia punctului s fa de un vector i jp p

    poate determinat n timp constant ( 3.1). Prin urmare,complexitatea algoritmului este proporional doar cunumrul de laturi ale poligonului. Fie punctuls de coor-donate (x

    s, y

    s) i poligonul convex

    1 2( , , ... , )N P p p p= cuNlaturi, descris prin lista vrfurilor parcurse consecutiv(coordonatele vrfurilor sunt stocate n tabloul liniar dearticole P cu cmpurile x i y). Pentru a simplica imple-mentarea, n lista de vrfuri ale poligonului este inclus unvrf virtual 1 1Np p+ .function apart : boolean;

    var i : integer;

    function veric_punct(x1,y1,x2,y2,x3,y3:real):boolean;

    begin

    if x1*y2+x2*y3+y1*x3-x3*y2-x2*y1-y3*x1 > 0 then

    veric_punct:=true else veric_punct:=false;

    end;

    Fig. 5.6. Punctele interioare suntplasate de aceeai parte a vecto-rilor determinai de vrfurile con-secutive ale poligonului, poziiacelor exterioare poate varia.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    36/76

    36

    Copie autorizata pentru .campion

    begin {apart}

    apart:=true;

    for i:=1 to N do

    if not

    verifc_punct(p[i].x,p[i].y,p[i+1].x,p[i+1].y,s.x,s.y)

    then apart:=false;

    end; {apart}

    Apartenena punctului la un poligon stelatFie un poligon arbitrar

    1 2( , , ... , )N P p p p= cu N laturi.Dac nPexist un punct interi-

    or c, astfel nct toate intervalele1 2[ , ],[ , ],...,[ , ]Nc p c p c p aparin

    integralP, poligonul se numetestelat (g. 5.7).

    n cazul n care punctul in-terior c este cunoscut apriori,determinarea apartenenei unui

    punct arbitrar s la poligonul P se reduce la vericareaexistenei unui triunghi5 1,i icp p + 1,i N= , care s coninpunctuls n calitate de punct interior.

    Numrul triunghiurilor este N, numrul de operaiinecesare pentru vericarea apartenenei punctului lainteriorul unui triunghi este mrginit de o constant. Prinurmare, complexitatea determinrii apartenenei punctu-lui la un poligon stelat va ( )O N n condiia c punctulc este cunoscut.

    Apartenena punctului la un poligon simplu

    Problema apartenenei unui puncts la un poligon sim-plu P poate rezolvat prin triangularizarea P i prin

    5

    VrfulpN+1 este unul virtual i coincide cup1.

    Fig. 5.7. P - poligon stelat

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    37/76

    37

    Copie autorizata pentru .campion

    vericarea ulterioar a apartenenei s la unul din tri-unghiurile formate n procesul triangularizrii.

    Un algoritm mai ecient este bazat pe numrarea

    interseciilor ale dreptei orizontale l care trece prinpunctul dats cu laturile poligonuluiP(g. 5.8). Se va cer-ceta partea dreptei spre stngade s. Pentru latura curent sedetermin:

    poziia punctului fa deaceasta;

    intersecia laturii cu semi-dreapta l.Dac numrul interseciilor

    spre stnga de s este impar,punctul se a n interiorul po-ligonului; pentru un numr parde intersecii, punctul se a nexterior. Demonstraia este elementar: la parcurgereaspre stnga, prima intersecie marcheaz intrarea semi-dreptei n interiorul poligonului, urmtoarea ieirea.Fiecare pereche urmtoare de intersecii are aceeaisemnicaie.

    Pentru stabilirea interseciei semidreptei cu laturacurent pot utilizate metodele descrise n 2.2.

    Cazuri specialeA. Dreapta ltrece printr-un vrfp

    ial

    poligonuluiPla stnga des. Vr-furilep

    i-1i p

    i+1se a de pri

    diferite ale dreptei l. Numrul deintersecii se incrementeaz cu1.

    Fig. 5.8. Numrul de interseciiale semidreptei l cu laturile poli-gonului determin apartenenapunctuluis la poligonulP

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    38/76

    38

    Copie autorizata pentru .campion

    B. Dreapta lconine laturapi-1

    pi+1

    a

    poligonuluiPla stnga des. Vr-furilep

    i-1ip

    i+2se a de pri

    diferite ale dreptei l. Numrulde intersecii se incrementeazcu 1.

    C. Dreapta l trece printr-un vrfp

    ial poligonului P la stnga

    de s. Vrfurile pi-1

    i pi+1

    se ade aceeai parte a dreptei l.

    Numrul de intersecii nu seincrementeaz.

    D. Dreapta lconine laturapi-1

    pi+1

    a

    poligonuluiPla stnga des. Vr-furilep

    i-1ip

    i+2se a de aceeai

    parte a dreptei l. Numrul deintersecii nu se incrementeaz.

    Numrul de laturi procesate este N. Determinareainterseciei laturii cu dreapta l este realizat ntr-unnumr constant de operaii. Procesarea cazurilor specialeeste realizat de asemenea ntr-un numr de operaiimrginit de o constant. Prin urmare, complexitatea al-goritmului este ( )O N .

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    39/76

    39

    Copie autorizata pentru .campion

    5.3. Poligonul i diagrama Voronoi

    O alt problem de apro-

    piere n plan este problemadeterminrii poligonului Vo-ronoi pentru o mulime depuncte.

    Fie n plan mulimea depuncte 1{ ,..., }NS p p= . Fie-care punct , 1, ,i p i N = este descris de coordonatelecarteziene (x

    i, y

    i). Pentru un

    punct dat ip S se cere s sedetermine poligonul V(i) careva conine toate puncteleplanului, mai apropiate dep

    idect de oricare alt punct

    , j i j p S p p (g. 5.9).

    Problema generalizatpentru toate punctele mul-imii S este cunoscut subnumele diagrama Voronoi(g. 5.10).

    De menionat c pentruunele puncte ale mulimiiS, domeniul determinat depoligonul Voronoi poate unul innit. Se poate demonstra c aceast proprietate oposed punctele care formeaz nfurtoarea convex amulimii S.

    Algoritmul direct pentru determinarea poligonuluiVoronoi V(i) se bazeaz pe urmtoarea observaie:

    Dreapta l, perpendicular pe segmentul pip

    ji care tre-

    ce prin mijlocul acestuia, conine punctele egal deprtate

    Fig. 5.9. Poligonul Voronoi V(i) pentrupunctulp

    i.

    Fig. 5.10 Diagrama Voronoi pentru

    mulimea S

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    40/76

    40

    Copie autorizata pentru .campion

    att depi, ct i dep

    j. Punctele mai apropiate dep

    idect

    depj

    vor forma semiplanul determinat de dreapta li careconine punctulp

    i.

    Fiecare punct p S este descris prin coordonatele salecarteziene (x, y). Prin urmare, pentru perechea de punctep

    i,p

    j,

    mijlocul m al segmentului pip

    jva determinat de

    punctul de coordonate:

    ,2

    ;2

    i j

    m

    i j

    m

    x xx

    y yy

    +=

    +=

    dreapta dcare conine segmentulpip

    jva descris

    de ecuaiaAx+By+C = 0, unde,

    ,

    ;

    j i

    i j

    j i i j

    A y y

    B x x

    C x y x y

    =

    =

    = orice dreapt lperpendicular pe segmentulp

    ip

    jva

    avea ecuaia general de forma Ax+By+C= 0; pentru dreapta l, perpendicular pe segmentulp

    ip

    ji

    care trece prin punctul de mijloc al acestuia, valoa-rea coecientului Ceste: Ay

    m Bx

    m.

    Odat ce este cunoscut ecuaia dreptei l, perpendicu-

    lare pe segmentulpipj n mijlocul acestuia, poate deter-minat semiplanulR(j): ( ), ( , ) ( , ).i jp R j d p p d p p <

    Atunci1,..,

    ( ) ( ).j Nj i

    V i R j=

    =

    Pentru realizarea algoritmului poate construit un po-ligonR de restrngere a planului, astfel nct S R . Celmai simplu poligon R este un dreptunghi avnd laturile

    paralele cu axele de coordonate, determinat de punctele

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    41/76

    41

    Copie autorizata pentru .campion

    diagonale (xmin

    ,ymin

    ), (xmax

    ,ymax

    ):

    1,...,min ( ) 1min i

    i Nx x

    == ,

    1,...,max ( ) 1max ii N

    x x=

    = + ,

    1,...,min ( ) 1min ii Ny y== , 1,...,max ( ) 1max ii Ny y== + .Complexitatea algoritmului direct pentru construirea

    poligonului Voronoi V(i) este 2( )O N :Etapa 1: Determinarea poligonului de restrngere

    necesit un numr de operaii proporional cuN.Etapa 2: Determinarea ecuaiei dreptei l, perpendi-

    culare pe segmentul pip

    j, necesit un numr de operaii

    mrginit de o constant.Etapa 3: Determinarea interseciei dreptei l cu poli-

    gonulR i restrngerea ulterioar a acestuia necesit unnumr de operaii proporional cu numrul de laturi alepoligonuluiR (nu mai mare dectN).

    Etapele 23 se repet pentru toate punctele, ip S p p . Prin urmare, numrul de operaii nece-

    sare pentru determinarea poligonului Voronoi va proporional cu 2N .

    Nu este ecient de a aplica direct algoritmul descrisanterior pentru determinarea diagramei Voronoi: com-plexitatea lui crete pn la 3( )O N .

    Pentru realizarea ecient a algoritmului de determi-nare a diagramei Voronoi se aplic tehnica divizrii con-

    secutive a problemei n mulimi liniar separabile, pn laatingerea cazurilor elementare, i asamblarea ulterioara soluiei [12, pag. 258 269].

    Fie 1 2S S S= i au fost construite diagramele Voronoi

    1 2( ), ( ) DV S DV S (g. 5.11). Pentru asamblarea soluieivor realizate urmtoarele etape:

    Etapa 1: Determinarea vectorilor de intrare (ieire) ailanului de concatenare: se construiesc laturile lips (dou

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    42/76

    42

    Copie autorizata pentru .campion

    la numr) pentru nf-urtoarea convexcomun a mulimii

    1 2S S , se determinmijloacele acestor la-turi m

    1, m

    2. Prin punc-

    tele m1, m

    2se traseaz

    vectorii perpendicularipe laturile adugate lanfurtoarea conve-

    x. Pentru latura supe-rioar vectorul esteorientat spre latur,pentru cea inferioar de la ea (g. 5.12). Dinnfurtoarea convexpentru 1 2S S sunteliminate lanurile in-terioare de laturi alenfurtoarelor sepa-rate pentru S

    1i S

    2.

    Etapa 2: Construirealanului de concatenare.Construcia lanului n-cepe pe vectorul superi-

    or, dintr-un punct careprecede toate intersec-iile vectorului cu razelediagramelor construiteanterior.

    Lanul se traseazde-a lungul vectorului,

    pn la intersecia cu

    Fig. 5.13. Construirea lanului de conca-tenare

    Fig. 5.11. Diagramele VoronoiDV(S1) i DV(S

    2)

    pn la concatenare.

    Fig. 5.12 Construirea

    nfurtoarei convexe

    pentru Sprin adugarea

    laturilor. Trasarea vecto-

    rilor de intrare (ieire) ai

    lanului de concatenare

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    43/76

    43

    Copie autorizata pentru .campion

    una din laturile diagramelorDV(S1) sauDV(S

    2). n punctul de

    intersecie direcia vec torului se modic (g. 5.13).Modicarea direciei lanului este determinat de modi-

    carea perechii de puncte ntre care se traseaz acesta. Fie,iniial, lanul marcheaz frontiera dintre punctele p

    ii

    pj. Atingerea unei laturi a diagramelor construite anterior

    semnic e nlocuireapi

    prinpk(dac latura atins separ

    punctulpidep

    k), e nlocuireap

    jprinp

    k(dac latura atins

    separ punctulpj

    depk). Direcia nou a lanului de conca-

    tenare este determinat de perpendiculara pe segmentul

    ce unete perechea nou creat i care trece prin punctul demijloc al acestuia. Procesul ia sfrit n momentul atingeriivectorului inferior al lanului de concatenare.

    Etapa 3: Modicarea laturilor diagramei (g. 5.14).Laturile innite (semidrepte) intersectate de lanul deconcatenare se transform n segmente delimitate deoriginea semidreptei i punctul de intersecie a acesteiacu lanul de concatenare, construit la etapa 2.

    Laturile nite (segmentele) i modic unul din punc-tele extreme, acestaind nlocuit prinpunctul de interseciecu lanul de conca-tenare.

    Laturile dinDV(S1),

    situate integral ndreapta de lanul deconcatenare, i latu-rile din DV(S

    2), situ-

    ate integral n stngaacestuia, se excluddin diagrama nal

    pentru 1 2S S .Fig. 5.14. Concatenarea diagramelor

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    44/76

    44

    Copie autorizata pentru .campion

    Cazul elementar se obine pentru 2 3S . Proce-sarea acestuia este realizat printr-un numr de operaiimrginit de o constant.

    Divizarea consecutiv a mulimii pentru obinerea ca-zurilor elementare necesit o sortare prealabil a punc-telor din Sdup abscisa lor. Complexitatea preprocesriieste ( log )O N N . Numrul de divizri consecutive alemulimii curente n dou submulimi aproape egale6este proporional cu log( )N . Pentru concatenarea solu-iilor pariale, n cazul alegerii structurii de date adec-

    vate7

    , este necesar un numr de operaii proporional cunumrul total de laturi din soluiile pariale. Deoarecediagrama Voronoi este o divizare planar a unei mulimidin Npuncte, numrul de laturi va proporional cu N.Prin urmare, complexitatea total a algoritmului optimeste ( log )O N N .

    5.4. Nuclee

    Printre problemele geometrice de calcul se numr iproblema determinrii nucleului po-ligonului simplu. Nucleul unui poli-gon simpluPeste, n general, formatdin mulimea de puncte Q P , ast-fel nct:

    , , [ , ]x Q y P x y P .Cu alte cuvinte, nucleul poligonu-

    lui este mulimea de puncte ale po-ligonului, astfel nct oricare dintre

    6S1

    este aproape egal cu S2, dac 1 2 1S S .

    7 O structur optim este lista bidirecional a laturilor.

    Fig. 5.15. Poligon simplucu nucleu (partea colorata poligonului)

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    45/76

    45

    Copie autorizata pentru .campion

    ele, ind unit cu orice alt punct alpoligonului, formeaz un segment ceaparine n ntregime poligonului (g.

    5.15).Nu ntotdeauna un poligon simplu

    are nucleu nevid (g. 5.16).Nucleul poligonului (dac el exist)

    este i el un poligon, dar, spre deose-bire de poligonul iniial, este ntot-deauna convex.

    Algoritmul pentru determinareanucleului unui poligon simplu

    Date iniiale. Fie un poligon simplu Pcu Nvrfuri.Se consider c poligonul este descris prin lista vrfurilorsale 1 2 1( , ,..., , )N N p p p p , parcurse n direcia micriiacelor de ceasornic. Fiecare vrfp

    ieste descris de coordo-

    natele sale (xi, y

    i).

    Algoritmul de determinare a nucleului necesit oconstrucie secundar: un poligon convex Q care, iniial,conine poligonul P. Pentru determinarea poligonului Qpot abordate dou metode:

    a) construirea nfurtoarei convexe pentruP;b) construirea unui dreptunghi care conineP.

    Metoda a doua este mult mai simpl. Ea se reduce ladeterminarea, pentru coordonatele vrfurilorP, a valori-lor minime i maxime ale abscisei i ale ordonatei. ncalitate de Q poate considerat dreptunghiul cu vrfuri-le max max( 1, 1)x y+ + , max min( 1, 1)x y+ , min min( 1, 1)x y ,

    min max( 1, 1)x y + . Extinderea valorilor extreme nu este ocondiie obligatorie.

    Fig. 5.16. Poligon simplufr nucleu

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    46/76

    46

    Copie autorizata pentru .campion

    Dup construirea poligonului Q poate determinatnemijlocit nucleul. Metoda (sau cel puin descrierea ei nlimbajul uman) este foarte simpl:

    Se analizeaz consecutiv laturile poligonului P, indparcurse n direcia micrii acelor de ceasornic. Laturacurentp

    ip

    i+1se cerceteaz ca o dreapt l. Se determin

    partea poligonului Q care se a n stnga vectorului1i ip p +

    i se exclude din Q. Dac poligonul Q este situat

    integral n stnga vectorului 1i ip p +

    , cercetarea ia sfrit poligonulPnu are nucleu.

    Procedeul se repet pn nu sunt analizate toate la-turile poligonuluiP.n nal, Q conine nucleul luiP(g. 5.17).

    Fig. 5.17. Construirea consecutiv a nucleului poligonului simplu

    PseudocodPas 1 Iniializare

    La sfritul listei de vrfuri (duppN

    ) se adaugvrful virtual p

    N+1. Se construiete poligonul Q

    (nucleul iniial), conform uneia din metodele de-scrise anterior. 1.i

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    47/76

    47

    Copie autorizata pentru .campion

    Pas 2 Procesarea laturii i

    Fie 1 2( , ,... )kQ q q q= . Pentru dreapta lce coninelatura i a poligonului Pdenit de vrfurile p

    i

    ,

    pi+1

    se determin punctele de intersecie cu poli-gonul Q, precum i laturile intersectate. Fie d

    1,

    d2punctele de intersecie a dreptei l cu Q, iar la-

    turile intersectate qj

    qj+1

    i qk

    qk+1

    .8

    a) Se formeaz poligoanele1 1 1 2( , , ... , , )j kQ d q q d +=

    i 2 2 1 1 1( , , ... , , , ... , , )k N jQ d q q q q d += .

    b) Se determin * 1 2{ , }Q Q Q care se a n dreaptavectorului 1i ip p +

    .

    c) *Q Q

    Pas 3 Repetare

    if i N< then begin i goto pas 2 end elseSTOP Q este nucleul.

    Complexitatea algoritmului este 2( )O N . Se preluc-reazNlaturi ale poligonuluiP. Pentru ecare latur severic intersecia cu maximum Nlaturi ale poligonuluiQ. Fiecare intersecie este determinat ntr-un numr deoperaii mrginit de o constant.

    8 Dac dreapta nu intersecteaz poligonul Q, se veric doar poziia Q

    fa de 1i ip p +

    . Dac poligonul e poziionat n stnga, nucleul nal este

    vid, altfel Qnu se modic la acest pas.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    48/76

    48

    Copie autorizata pentru .campion

    6. Probleme geometrice de concurs

    6.1. RobotUn robot punctiform poate executa instruciuni de depla-

    sare n 8 direcii (1 nord, 2 nord-est, 3 est, 4 sud-est,5 sud, 6 sud-vest, 7 vest, 8 nord-vest). Lungimea pa-sului robotului este 1 pentru direciile 1, 3, 5, 7 i 2 pen-tru direciile 2, 4, 6, 8. Numrul de pai efectuai n direciaaleas este un parametru al instruciunii de deplasare.

    Fiind dat un set de instruciuni, s se determine coordo-natele punctului nal n care se va deplasa robotul.

    Astfel, pentru setul(1,3) (3,1) (1,1) (3,3)(5,2) (7,1) coordonatelenale vor (3,2).

    S se scrie un program care, dup un set de instruciuni,s determine coordonatele punctului nal n care se va de-plasa robotul. Se consider c axa Ox e orientat spre est, iarOy spre nord. Iniial robotul se a n originea sistemuluide coordonate (0,0).

    Date de intrarePrima linie a ierului de intrare conine numrul N

    numrul de instruciuni (1 N 40). Urmtoarele N liniiconin instruciunile propriu-zise numrul direciei (unnumr ntreg de la 1 la 8) i numrul de pai (un numrntreg de la 1 la 1000), separate prin spaiu.

    Date de ieireUnica linie a ierul de ieire va conine dou numere

    ntregi x i y, separate prin spaiu, coordonatele punctuluinal n care se deplaseaz robotul.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    49/76

    49

    Copie autorizata pentru .campion

    Exemple

    date.in date.out

    6 3 2

    1 33 1

    1 1

    3 3

    5 2

    7 1

    1

    8 10 -10 10

    Rezolvareprogramp01;

    var I,N:integer;

    D,L,X,Y:Longint;

    begin

    assign(Input,date.in); reset(Input);

    read(N);

    X:=0; Y:=0; {xarea pozitiei initiale}

    for I:=1 to N do

    begin {modelarea deplasarii}read(D,L);

    case D of

    1: Y:=Y+L; { deplasare nord cu L}

    2:begin X:=X+L; Y:=Y+L; end; {nord-est cu L}

    3: X:=X+L; {est cu L}

    4:begin X:=X+L; Y:=Y-L; end; {sud-est cu L}

    5: Y:=Y-L; {sud cu L}

    6:begin X:=X-L; Y:=Y-L; end; {sud-vest cu L}

    7: X:=X-L; {vest cu L}

    8:begin X:=X-L; Y:=Y+L; end; {nord-vest cu L}end;

    end;

    assign(Output,date.out); rewrite(Output);

    write(X, ,Y);

    close(Input); close(Output);

    end.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    50/76

    50

    Copie autorizata pentru .campion

    6.2. Robot II

    Sistemul de comand al unuirobot care poate executa instruc-iuni de deplasare s-a deteriorat.Robotul continu s primeascinstruciuni, dar le interpreteaznu ntotdeauna corect. Fiecareinstruciune este un triplet denumere (u,vx,vy) ntregi pozi-tive. Dac u > 90, atunci robotul

    se deplaseaz cu vx dup axa Ox i cu vy dup axa Oy. Dacu 90, robotul se deplaseaz pe un arc de msura u al cercu-lui de centru (vx,vy) mpotriva micrii acelor de ceasornic.Raza cercului este segmentul care unete robotul cu centrulcercului.

    S se scrie un program care, dup coordonatele iniialeale robotului i un set dat de instruciuni, determin punctulnal n care va poziionat acesta.

    Date de intrarePrima linie a ierului de intrare conine dou numere

    ntregi coordonatele iniiale ale robotului. Urmtoarelelinii conin cte o instruciune, format din trei numerentregi, separate prin spaiu.

    Date de ieire

    Unica linie a ierul de ieire va conine dou numere xi y, separate prin spaiu, coordonatele nale ale robotu-lui, indicate cu cel puin 3 cifre dup virgul.

    Exemplu date.in date.out

    3 2 -0.653 15.697

    130 4 1

    45 1 7

    91 0 3

    60 0 6

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    51/76

    51

    Copie autorizata pentru .campion

    Rezolvare

    programp02;const pi=3.141592;

    type point=record

    x,y : real;

    end;

    var P: point;

    alfa,xn,yn:real;

    procedure move(var P:point; vx,vy:real);

    begin

    P.x:=P.x+vx;

    P.y:=P.y+vy;

    end;

    procedure rotate (var P:point; u,vx,vy:real);

    var old:point;

    begin

    old:=P;

    P.x:=vx+(old.x-vx)*cos(u*pi/180)-

    (old.y-vy)*sin(u*pi/180);P.y:=vy +(old.x-vx)*sin(u*pi/180)+

    (old.y-vy)*cos(u*pi/180);

    end;

    begin

    assign(input,data.in); reset(input);

    assign(output,data.out); rewrite(output);

    readln(P.x,P.y);

    while not eof do

    begin

    readln(alfa,xn,yn);

    if alfa>90 then move(P,xn,yn)

    else rotate(P,alfa,xn,yn);

    end;

    writeln(P.x:10:3, ,P.y:10:3);

    close(input); close(output);

    end.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    52/76

    52

    Copie autorizata pentru .campion

    6.3. Piatra

    ... i unde nu pornete stnca la vale, sltnd tot mai sus deun stat de om; i trece prin gardul i prin tinda Irinuci, pela capre, i se duce drept n Bistria, de clocotea apa!

    Ion Creang. Amintiri din copilrie

    Piatra pornit de Ion Creang se rostogolea n liniedreapt, drmnd totul n calea sa. Casa Irinuci aremuli perei, unii nimerind n calea pietrei. Fiind date

    coordonatele a dou puncte prin care trece piatra iextremitile segmentelor care descriu baza pereilor ca-sei, s se determine ci perei vor drmai de piatran cdere. Peretele atins ntr-un punct extrem rmne n-treg.

    S se scrie un program care determin numrul deperei drmai de piatr.

    Date de intrareFiierul de intrare date.in conine N (N < 1000) linii a

    cte patru numere ntregi. Prima linie conine descriereaa dou puncte prin care trece piatra, n formax

    1, y

    1, x

    2, y

    2

    (|xi, y

    i|

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    53/76

    53

    Copie autorizata pentru .campion

    Exemplu date.in date.out

    2 1 9 14 4

    2 4 1 8

    1 12 3 94 14 6 11

    7 14 9 10

    9 14 7 16

    6 10 8 8

    3 6 6 6

    4 2 4 5

    11 10 12 14

    8 6 10 8

    12 8 14 4

    Rezolvareprogramp03;

    type point=record x,y: real; end;

    segment=record e1,e2: point; end;

    var g: array[1..1000] of segment;

    l: segment;

    n,i,k: integer;

    function sarrus(p1,p2,p3:point): real;

    begin sarrus:=p1.x*p2.y+p2.x*p3.y+p1.y*p3.x-p3.x*p2.y-p3.y*p1.x-p1.y*p2.x;

    end;

    begin

    assign(input, date.in); reset(input); n:=0;

    readln(l.e1.x,l.e1.y,l.e2.x,l.e2.y);

    while not eof do

    begin

    inc(n); readln( g[n].e1.x,

    g[n].e1.y,g[n].e2.x,g[n].e2.y); end;

    k:=0;

    for i:=1 to n do

    if

    sarrus(l.e1,l.e2,g[i].e1)*sarrus(l.e1,l.e2,g[i].e2) < 0

    then inc(k);

    assign(output, date.out); rewrite(output);

    writeln(k); close(input); close(output);

    end.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    54/76

    54

    Copie autorizata pentru .campion

    6.4. Carcasa

    Fie o carcas avnd forma

    unui poligon simplu. Pentrua poziionat vertical pe osuprafa plan, carcasa trebuies aib centrul de mas situatstrict ntre 2 puncte de contactcu suprafaa. Centrul de maseste ntotdeauna un punct interior al carcasei i nu coin-

    cide cu nici un vrf al ei.S se scrie un program care va determina numrulpoziiilor n care poate stabilizat vertical carcasa.

    Date de intrarePrima linie a ierului de intrare date.inconine trei

    numere ntregi, separate prin spaiu: N numrul devrfuri ale carcasei i

    xc, yc coordonatele centrului de

    mas.Urmeaz N linii ce conin cte dou numere ntregix

    i,y

    i

    (1000 xi, y

    i 1000), separate prin spaiu, coordonatele

    vrfurilor poligonului n ordinea parcurgerii lor.

    Date de ieireFiierul de ieire date.out va conine un singur numr

    ntreg numrul de poziii n care poate stabilizat ver-tical carcasa.

    Restricii3 N 1000

    1000 xc, y

    c 1000

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    55/76

    55

    Copie autorizata pentru .campion

    Exempludate.in date.out

    10 6 16 3

    3 14

    13 423 14

    33 4

    33 14

    23 24

    13 14

    3 24

    -7 14

    -7 4

    Rezolvare

    Deoarece carcasa se sprijin pe care-va puncte extreme ale poligonului, pro-blema poate divizat n dou subpro-bleme relativ simple:

    1) determinarea nfurtoareiconvexe a vrfurilor poligonului;

    2) vericarea dac un triunghi are un unghi obtuz.

    Prima subproblem este rezolvat cu ajutorul algorit-mului descris anterior ( 3.2).

    Dup determinarea nfurtoareiconvexe, problema poate reformulatn felul urmtor:

    Fie un poligon convex Pi un punctinterior c, unit prin linii drepte cu vrfurile poligonului. n

    cte dintre triunghiurile formate nlimea construit dinpunctul c se proiecteaz ntr-un punct interior al laturiipoligonului care aparine triunghiului?

    Evident, nlimea construit din c se proiecteaz pelatur dac niciunul dintre unghiurile alturate laturii poli-gonului nu este obtuz. Vericarea unghiurilor se realizeazelementar cu ajutorul teoremei cosinusurilor. Complexi-

    tatea etapei este liniar dup numrul de vrfuri.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    56/76

    56

    Copie autorizata pentru .campion

    6.5. TurnuriBitlanda este o ar care se extinde permanent, lini-

    ar. Frontiera rii reprezint o linie frnt nchis, fr

    autointersecii. Pentru a apra frontierele sale, dup e-care extindere, n noile puncte extreme ale frontierei seconstruiesc turnuri de veghe. Exist N turnuri de veghe,date prin coordonatele lor (x

    i, y

    i) numere ntregi. Regele

    Bitlandei, Bytezar, a decis sa trimit la vatr garnizoaneleturnurilor care nu se mai a la hotarele rii.

    S se scrie un program care va determina cte turnurivor lipsite de garnizoane.

    Date de intrarePrima linie a ierului de intrare conine un numr

    ntreg: N (1 N 10000) numrul de turnuri de veghen Bitlanda.

    Urmeaz N linii ce conin cte dou numere ntregixi

    ,yi

    (1000 xi, y

    i 1000), separate prin spaiu, coordonatele

    turnurilor de veghe.

    Date de ieireFiierul de ieire va conine un numr ntreg numrul

    de turnuri care pot lipsite de garnizoane.

    Exempluturn.in turn.out10 52 13 46 36 68 510 311 712 69 1115 8

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    57/76

    57

    Copie autorizata pentru .campion

    6.6. Atac

    Agenia Spaial a planetei Bitterra (ASB) a recepionat unroi meteoritic, care se apropie de planet. Fiecare stat de pe

    Bitterra a fost anunat despre pericol i a primit lista punctelorde cdere a meteoriilor, calculate de ASB. Serviciile pentrusituaii excepionale ale ecrui stat urmeaz s determineci meteorii vor cdea pe teritoriul rii. Frontiera oricruistat de pe Bitterra este un poligon convex; meteoriii sunt punc-tiformi. Punctele de pe frontier nu se consider aparinndstatului. Frontiera poate conine mai multe vrfuri consecutive

    coliniare.

    S se scrie un program care va determina numrul demeteorii ce cad pe teritoriul unui stat dat.

    Date de intrarePrima linie a ierului de intrare atac.in conine numrul

    n numrul de vrfuri ale poligonului care descrie frontiera

    unui stat. Urmtoarele n linii conin descrierea consecutiv avrfurilor frontierei: ecare linie va conine cte o pereche denumere separate prin spaiu coordonatele unui vrf. Urmeazo linie care conine un numr ntreg m numrul de meteorii,apoi m linii, care conin cte dou numere, separate prin spaiu, coordonatele punctelor de cdere a meteoriilor.

    Date de ieire

    Fiierul de ieire atac.out va conine un singur numr n-treg cel al meteoriilor care cad pe teritoriul statului dat.

    Restricii1. Coordonatele vrfurilor poligonului i ale punctelor de

    cdere a meteoriilor sunt numere ntregi din intervalul[-1000000, 1000000].

    2. 3 n 20000.

    3. 2 m 20000.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    58/76

    58

    Copie autorizata pentru .campion

    Exempluatac.in atac.out Explicaie

    4 2

    2 4

    8 46 8

    4 6

    4

    3 5

    4 7

    5 5

    6 7

    RezolvareFormularea abstract a problemei este urmtoarea:Fie n plan un poligon convexPcu n vrfuri. n acelai

    plan este dat o mulime Mdin m puncte. Se cere s sedetermine cte puncte din Maparin interioruluiP.

    Rezolvarea se divide n cteva etape.

    1. Se determin un punct interior

    al poligonului de coordonate(x

    cm, y

    cm) (de exemplu, centrul

    de mas).

    Fiind date coordonatele (xi, y

    i),

    1,i n= , ale vrfurilor poligonuluiP, coordonatele centrului de maspot calculate dup formula:

    1 1, .

    n n

    i i

    i icm cm

    x y

    x yn n

    = == =

    2. Fiind dat un punct interior (xcm

    , ycm

    ) al poligonului,se calculeaz unghiurile pe care le formeaz cu axa Oxsemidreptele duse din acesta prin vrfurile (c

    x, c

    y).

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    59/76

    59

    Copie autorizata pentru .campion

    function angle(cx,cy:real): real;

    begin

    sinus:=(cy -ycm)/ sqrt(sqr(cy-ycm)+sqr(cx-xcm));

    cosinus:= (cx -xcm)/ sqrt(sqr(cy-ycm)+sqr(cx-xcm));if cosinus=0 then

    if sinus>0 then angle:= pi/2

    else if sinus0) and(cosinus>0)

    then angle:=arctan(sinus/cosinus);

    if (sinus>0) and(cosinus

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    60/76

    60

    Copie autorizata pentru .campion

    then begin st:=k; dr:=k+1; end

    else begin

    if (alfa < a[1].u)

    then begin st:=k+1; dr:=n+1; end

    else begin st:=1; dr:=k; end;repeat

    mj:=(st + dr) div 2;

    if a[mj].u >alfa then dr:=mj else st:=mj

    until dr=st+1;

    end;

    5. Se determin poziia centrului de mas i a punctu-lui curent al mulimii M fa de latura determinat.

    Dac sunt de aceeai parte, punctul curent esten interior. Pentru determinarea poziiei se

    folosete semnul determinantului1 1

    2 2

    3 3

    1

    1

    1

    x y

    x y

    x y

    ,

    unde (x1, y

    1), (x

    2, y

    2) sunt coordonatele vrfurilor care

    determin latura, iar (x3, y3) coordonatele pun ctuluicercetat (respectiv coordonatele centrului de mas).

    q:=semn(a[st].x,a[st].y,a[dr].x,a[dr].y,b[i].x,b[i].y);

    p:=semn(a[st].x,a[st].y,a[dr].x,a[dr].y,xcm,ycm);

    if p*q>0 then inc(s);

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    61/76

    61

    Copie autorizata pentru .campion

    6.7. Evadare

    Un grup de pinguini a decis s evadeze din grdina

    zoologic. n acest scop ei au spat un tunel liniar. Dinnefericire, zidul grdinii zoologice formeaz un poligonsimplu cu N (3N10000) laturi, astfel nct, ieind dintunel, pinguinii nu pot arma cu certitudine dac se an interiorul grdinii zoologice sau n afara ei.

    S se scrie un program care, dup coordonatele punc-

    telor extreme ale tunelului i coordonatele vrfurilor po-ligonului ce stabilesc perimetrul grdinii zoologice, va de-termina dac evadarea s-a soldat cu succes sau nu.

    Date de intrarePrima linie a ierului de intrare evadare.in conine

    patru numere ntregi, separate prin spaiu, coordonatelepunctelor extreme ale tunelului. Urmtoarele linii conindescrierea consecutiv a vrfurilor zidului: ecare linie vaconine cte o pereche de numere, separate prin spaiu, coordonatele unui vrf.

    Date de ieireFiierul de ieire evadare.out va conine un singur cu-

    vnt: DA n cazul n care punctul nal al tunelului este

    n afara grdinii zoologice; NU n caz contrar.

    RestriciiCoordonatele vrfurilor poligonului i ale punctelor

    extreme ale tunelului sunt numere ntregi din intervalul[-1000, 1000].

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    62/76

    62

    Copie autorizata pentru .campion

    Exemplu

    evadare.in evadare.out explicaie

    5 3 7 7 DA

    1 22 6

    6 4

    6 7

    7 5

    10 4

    7 2

    3 1

    6.8. ArcaiSecretul victoriilor faimo-

    sului comandant de oti Mega-Flop este strategia lui dealegere a poziiei arcailor pecmpul de lupt. Cmpul areforma unui poligon simplu ie nconjurat de pduri. Mega-Flop plaseaz arcaii doar pepoziii din care este vzut totcmpul de lupt. Se considerc arcaii vd tot cmpul, dac din orice punct care aparinepoziiei lor de tragere se poate trage cu sgeata n orice altpunct al cmpului. Traiectoria sgeii este liniar. Nimerind

    n pdure, sgeata se pierde. Pentru tragere, ecare arcaare nevoie de o unitate de suprafa. Astfel, numrul ma-xim de arcai care pot plasai pe poziii este determinatde aria poligonului din care este vzut toat cmpia.

    S se scrie un program care determin numrul maximde arcai care pot plasai pe poziii de tragere n cmpulde lupt.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    63/76

    63

    Copie autorizata pentru .campion

    Date de intrareFiierul de intrarearcas.inva conine pe prima linie un

    numr ntreg N numrul de vrfuri ale poligonului sim-

    plu care descrie perimetrul cmpului de lupt. Urmeaz Nlinii care conin coordonatele vrfurilor poligonului, par-curse n sensul micrii acelor de ceasornic, cte un vrfpe linie. Linia i+1 conine dou numere ntregi x

    i, y

    i,

    separate prin spaiu, coordonatele vrfului i.

    Date de ieire

    Fiierul de ieire arcas.outva conine un singur numrntreg numrul maxim de arcai care pot plasai pepoziii.

    Restricii3 N 10000 < x

    i, y

    i 10000

    Exempluarcas.in arcas.out

    9 11

    2 5

    3 6

    2 7

    4 7

    6 9

    8 6

    7 2

    5 43 4

    Rezolvareprogramp68;

    type

    lat=record x,y:real; end;

    pol=array[0..1001] of lat;

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    64/76

    64

    Copie autorizata pentru .campion

    var

    nuc,camp:pol;

    i,nnuc,ncamp:integer;

    xint,yint:real;

    procedure init;

    var square : array[1..5,1..2] of integer;

    i: integer;

    begin

    {initializare nucleu}

    nuc[1].x:=0; nuc[1].y:=0;

    nuc[2].x:=0; nuc[2].y:=10001;

    nuc[3].x:=10001; nuc[3].y:=10001;

    nuc[4].x:=10001; nuc[4].y:= 0;

    nuc[5].x:=nuc[1].x; nuc[5].y:= nuc[1].y;nnuc:=4;

    { si initializare poligon}

    readln(ncamp);

    for i:=1 to ncamp do readln(camp[i].x,camp[i].y);

    camp[ncamp+1].x:=camp[1].x;camp[ncamp+1].y:=camp[1].y;

    end;

    function intersect

    (al,bl,cl,ad,bd,cd:real;i,j:integer): boolean;

    {determin intersecia dreptei i laturii

    + coordonate punctului de intersecie}

    begin

    {1. dreapta i latura sunt paralele}

    if Ad*Bl=Bd*Al then begin intersect:=false; exit; end;

    {2. dreapta intersecteaz 2 laturi adiacente n punct

    extrem}

    if (camp[j+1].x=nuc[i].x) and(camp[j+1].y=nuc[i].y)

    then begin

    intersect:=true; xint:=nuc[i].x; yint:=nuc[i].y;

    exit;

    end;

    if (camp[j].x=nuc[i+1].x) and(camp[j].y=nuc[i+1].y)

    then begin

    intersect:=true; xint:=nuc[i+1].x;

    yint:=nuc[i+1].y; exit;

    end;

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    65/76

    65

    Copie autorizata pentru .campion

    {3. Dreapta i latura nu sunt paralele}

    if (Ad*BlBd*Al) then

    if Al0 then begin

    yint:=(Ad*Cl-Cd*Al)/(Bd*Al-Ad*Bl);

    xint:=(-Bl*yint-Cl)/Al; end

    else

    begin yint:=-Cl/Bl;

    xint:=(-Bd*yint-Cd)/Ad;

    end;

    if (((xint>=nuc[i].x) and(xint=nuc[i+1].x) and(xint=nuc[i].y) and(yint=nuc[i+1].y) and(yint

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    66/76

    66

    Copie autorizata pentru .campion

    begin

    nr:=nr+1;

    inter[nr].x:=xint;

    inter[nr].y:=yint;

    index[nr]:=i; end;

    end;

    if nr>=2 then

    begin

    if sarrus(camp[j],camp[j+1],nuc[index[1]])>=0

    then

    begin

    ii:=1;

    copy[1].x:=inter[1].x;

    copy[1].y:=inter[1].y;

    for k:=index[1]+1 to index[2] do

    begin

    inc(ii); copy[ii]:=nuc[k];

    end;

    inc(ii); copy[ii].x:=inter[2].x;

    copy[ii].y:=inter[2].y;

    nnuc:=ii;

    inc(ii); copy[ii].x:=inter[1].x;

    copy[ii].y:=inter[1].y; end

    else

    begin

    ii:=0;

    for k:=1 to index[1] do

    begin inc(ii); copy[ii]:=nuc[k]; end;

    inc(ii);

    copy[ii].x:=inter[1].x;copy[ii].y:=inter[1].y;

    inc(ii);

    copy[ii].x:=inter[2].x;copy[ii].y:=inter[2].y;

    for k:=index[2]+1 to nnuc do

    begin inc(ii); copy[ii]:=nuc[k]; end;

    nnuc:=ii; inc(ii); copy[ii]:=nuc[1]

    end;

    nuc:=copy;

    end

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    67/76

    67

    Copie autorizata pentru .campion

    else

    if sarrus(camp[j],camp[j+1],nuc[1])>=0 then

    begin

    writeln(0); close(output); halt;

    end;end;

    function area(a:pol;n:integer):real;

    {aria poligonului simplu}

    var s:real;

    i:integer;

    begin

    s:=0;

    for i:=1 to n do

    s:=s+(a[i+1].x-a[i].x)*(a[i+1].y+a[i].y)/2;

    area:=s;

    end;

    {programul principal}

    begin

    assign(input,arcas.in);

    reset(input);assign(output,arcas.out);

    rewrite(output);

    init;

    for i:=1 to ncamp do

    cut(i);

    writeln(area(nuc,nnuc));

    close(input);

    close(output);

    end.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    68/76

    68

    Copie autorizata pentru .campion

    6.9. Cetate Arheologii din Bitlanda n timpul

    spturilor au descoperit nite pietre

    aezate oarecum straniu. Ei au ajunsla concluzia ca acestea formeaz frag-mente ale unui zid circular, care ncon-jura o cetate veche.

    Pentru a proteja de turiti i decurioi fragmentele descoperite, arheo-logii au decis s le nconjoare cu un gard din plas metalic.

    Deoarece este destul de complicat i incomod de a nconjuraecare fragment, s-a luat decizia de a mprejmui toate frag-mentele mpreun.

    S se scrie un program care s determine lungimea minima plasei necesare pentru a ngrdi fragmentele zidului.

    Date de intrarePrima linie a ierului de intrare conine dou numere:

    n (1n180) numrul fragmentelor de zid; r (1r100) raza zidului. Urmeaz n perechi de numere ntregi, caredescriu fragmentele de zid: a

    i, b

    i msura unghiurilor

    (n grade) care descriu nceputul i sfritul fragmentu-lui. Unghiurile se msoar ncepnd cu direcia nord dela centrul cetii, n sens opus micrii acelor de ceasornic(0 a

    i; b

    i< 360, a

    i b

    i). Fiecare fragment este descris

    la fel mpotriva direciei de micare a acelor de ceasornic.

    Fragmentele de zid nu au puncte comune.Date de ieire

    Fiierul de ieire va conine lungimea minim a plaseinecesare, cu trei cifre dup virgul.Exemplu

    cetate.in cetate.out

    2 10 61.888

    330 30

    90 270

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    69/76

    69

    Copie autorizata pentru .campion

    6.10. Druizi

    Ruinele din Stonehenge se af-

    l ntr-un loc special, unde seintersecteaz M linii energeticeale Pmntului. Liniile energe-tice mpart cmpia Stonehengen sectoare. n ecare an, n ceamai scurt zi a anului, N druizise adun n cmpie pentru unritual, ce asigur o road bogatpentru anul urmtor. Pentru succesul ritualului este necesarca n ecare sector al cmpiei, delimitat de liniile energetice,s se ae nu mai mult dect un druid. Cmpia are forma unuiptrat cu centrul n originea sistemului de coordonate i careare lungimea laturii 2L. Liniile energetice sunt linii drepte.Druizii sunt punctiformi i nu se pot aa pe liniile energetice.

    S se scrie un program care determin dac exist sec-

    toare ale cmpiei n care se a 2 sau mai muli druizi.Date de intrare

    Fiierul de intrare conine cteva (cel mult 5) seturi dedate, separate prin cte o linie ce conine semnul #.

    Prima linie a ecrui set de date conine numerele N, M iL (1 N 1000, 0 M 1000, 1 L 2000).

    Urmeaz N linii ce conin cte dou numere ntregi xi, y

    i

    coordonatele druizilor. Toi druizii se a n interiorul cm-piei, oricare doi druizi nu coincid.Urmtoarele M linii ale setului de date conin cte un

    triplet de numere ntregi ai, b

    i, c

    i. Numerele corespund

    coecienilor ecuaiei Aix + B

    iy + C

    i= 0, care descrie linia

    energetic i. Niciun druid nu se a pe o careva linie. Oricaredou linii nu coincid. Valorile a

    i, b

    i, c

    inu depesc 10000

    dup modul.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    70/76

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    71/76

    71

    Copie autorizata pentru .campion

    for i:=1 to m do

    begin

    readln(a,b,c);

    if i=1 then begin l1a:=a; l1b:=b; l1c:=c; end;

    if i=2 then begin l2a:=a; l2b:=b; l2c:=c; end;ae:=b*b+a*a;

    be:=2*b*c;

    ce:=c*c-a*a*2*r*r;

    de:=be*be-4*ae*ce;

    if a0 then begin

    inc(n);

    d[n].y:=(-be-sqrt(de))/2/ae;

    d[n].x:=(-b*d[n].y-c)/a;

    d[n].t:=D;

    inc(n);

    d[n].y:=(-be+sqrt(de))/2/ae;

    d[n].x:=(-b*d[n].y-c)/a;

    d[n].t:=D;

    end

    else begin

    inc(n);

    d[n].y:=-c/b;

    d[n].x:=sqrt(2*r*r-c*c/b/b);

    d[n].t:=D;inc(n);

    d[n].y:=d[n-1].y;

    d[n].x:=-d[n-1].x;

    d[n].t:=D;

    end;

    end;

    end; {readdata}

    n rezolvare vor parcurse urmtoarele etape:

    1. Toate liniile se intersecteaz ntr-un punct, care trebuiedeterminat. Dac numrul de linii este 0 sau 1, suntcteva cazuri elementare, care se cerceteaz aparte.Dac numrul de linii este mai mare sau egal cu doi,atunci se folosesc oricare dou linii pentru a determinacoordonatele punctului de intersecie.

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    72/76

    72

    Copie autorizata pentru .campion

    2. Druizii se a n interiorulptratului cu latura 2L icentul n originea sistemu-

    lui de coordonate. Ei se ai n interiorul cercului deraz 2L i centrul n ori-ginea sistemului de coordo-nate. Pentru ecare din lini-ile energetice se determinpunctele ei de intersecie cu

    cercul de raz 2L i centrul n originea sistemuluide coordonate. Aceste puncte se marcheaz aparinnddreptelor (D) de separare a sectoarelor.

    3. Originea sistemului decoordonate se deplaseaz npunctul de intersecie a drepte-lor (liniilor energetice). Apoi setrece la coordonatele polarepentru punctele ce reprezintdruizii i interseciile liniilorenergetice cu cercul (realizare

    proceduramovecenter).

    procedure movecenter;

    begin

    {se determin punctul de intersectie al dreptelor}

    if l1a0 then

    begin yint:=(l1c*l2a-l1a*l2c)/(l2b*l1a-l2a*l1b);

    xint:=(-l1b*yint-l1c)/l1a;

    end

    else begin yint:=-l1c/l1b;

    xint:=(-l2b*yint-l2c)/l2a;

    end;

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    73/76

    73

    Copie autorizata pentru .campion

    for i:=1 to n do

    begin {se transfer originea..}

    d[i].x:=d[i].x - xint; d[i].y:=d[i].y - yint;

    { ... si se determin coordonatele polare - unghiul!}

    if d[i].x0 then

    begin

    d[i].a:=180/pi*arctan(abs(d[i].y/d[i].x));

    if (d[i].x0) then d[i].a:=180-d[i].a;

    if (d[i].x4))

    then writeln(YES);

    if (m=1) and(n=4) then

    begin

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    74/76

    74

    Copie autorizata pentru .campion

    {se determin pozitia druizilor fata de dreapta}

    if sarrus(d[3],d[4],d[1])*sarrus(d[3],d[4],d[2]) < 0

    then writeln(NO) else writeln(YES); end;

    if m>=2 then

    begin

    {... si cazul general}

    movecenter;

    qsort(d,1,n);

    vec:=FALSE;

    for i:=1 to n-1 do

    if (d[i].t=L) and(d[i+1].t=L)

    then vec:=TRUE;

    if vec then writeln(YES) else writeln(NO);

    end;

    end; {solve}

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    75/76

    75

    Copie autorizata pentru .campion

    Notaii

    1 2p p segment orientat (vector) cuoriginea n punctul p

    1

    1{ ,..., }NS p p= mulimea S, cu elementelep1, ..., pN

    |S| cardinalul mulimii S

    i incrementarea valorii i cu 1

    k m variabilei ki se atribuie valoareavariabilei m

    [a, b] interval cu extremitile a, b

    abc triunghi cu vrfurile a, b, c

    DV(S) diagrama Voronoi pentru mulimea S

    T(S) triangularizarea mulimii S

    Q(S) nfurtoarea convex a mulimii S

    A B dinA rezultB

    A B A este echivalent cuB

    , ( )x X x X x aparine (nu aparine) mulimiiX

    { }: x X Q submulimea elementelorx dinX, care

    satisfac condiia QA B A se conine nB (A este submulime

    a mulimiiB)

    qsort(A,n) apel al procedurii pentru sortareastructurii de dateAdin n elemente

  • 8/3/2019 Algoritmi i probleme geometrie computationala

    76/76

    Copie autorizata pentru .campion

    Bibliograe

    1. Ammeraal, Leen.Programming Principles in ComputerGraphics. John Wiley and Sons, 1986.

    2. Ammeraal, Leen. Computer Graphics for the IBM PC. JohnWiley and Sons, 1986.

    3. Cerchez, Emanuela.Programarea n limbajul C/C++ pen-tru liceu. Vol III. Iai: Polirom, 2007.

    4. Cormen, Thomas. Introducere n algoritmi. Cluj: Agora.

    5. Foley, James; Andries, Van Dam. Fundamentals of Interac-tive Computer Graphics. Addison-Wesley Publishing, 1984.

    6. Giumale, Cristian. Introducere n analiza algoritmilor. Iai:Polirom, 2004.

    7. Sedgewick, Th.Algorithms in C. Addison Wesley, 2001.

    8. Williamson, Gill. Combinatorics for Computer Science. NewYork: Dover publications, 2002.

    9. , . ++. : , 1997.

    10. , . . : ,1986.

    11. , . . . : , 2001.

    12. , . .