Documente Academic
Documente Profesional
Documente Cultură
Sergiu Corlat - Geometrie Computationala
Sergiu Corlat - Geometrie Computationala
campion
Sergiu CORLAT
Algoritmi i probleme
de geometrie computaional
Recenzeni:
Andrei Braicov,
doctor, confereniar universitar, UST
Emanuela Cerchez,
profesor gradul I, Liceul de Informatic
Grigore Moisil, Iai
Redactor:
Tatiana Rusu
Coperta:
Valentina Stratu
Cuprins
Introducere
1. Transformri de coordonate 7
1.1. Deplasri i rotaii
7
1.2. Coordonate polare 9
1.3. Implementri
10
12
12
14
16
3. nfurtoarea convex
17
17
20
26
26
28
29
31
31
35
39
44
2. Intersecii
4. Triangularizri
5. Apropiere i apartenen
48
6.1. Robot
6.2. Robot II
6.3. Piatra
6.4. Carcasa
6.5. Turnuri
6.6. Atac
6.7. Evadare
6.8. Arcai
6.9. Cetate
6.10. Druizi
48
50
52
54
56
57
61
62
68
69
Notaii
Bibliografie
75
76
Introducere
Cu toate c aparatul matematic necesar pentru rezolvarea problemelor de geometrie computaional este
relativ simplu, implementarea acestuia este nsoit de
necesitatea cercetrii unui numr considerabil de cazuri
speciale. Acesta este un motiv pentru care problemele de
geometrie computaional se consider printre cele mai
dificile, n special n condiii de concurs.
Cercetarea i optimizarea soluiilor propuse pentru
unele din problemele prezente n lucrare i vor permite
cititorului s capete o experien necesar la compartimentul rezolvare de probleme i, nu n ultimul rnd, la
generarea testelor pentru verificarea soluiilor.
La baza lucrrii se afl o serie de articole publicate
pe parcursul ultimilor ani n revista de matematic i
informatic Delta, materiale i probleme elaborate n
cadrul colilor de var la informatic (ediiile anilor
2001, 2002), precum i probleme propuse la concursul 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 colectivului
Catedrei de Informatic i Tehnologii Informaionale a
Universitii de Stat din Tiraspol.
Ianuarie 2009
Sergiu Corlat
1. Transformri de coordonate
1.1. Deplasri i rotaii
Rezolvarea oricrei probleme de geometrie computa
ional ncepe (dac e necesar) cu deplasarea coordonatelor elementelor cercetate (de cele mai dese ori, ale punctelor) ntr-un domeniu potrivit al sistemului de coordonate
(de obicei, n cadranul unu). n unele cazuri, deplasarea
poate fi nsoit i de rotaia sistemului de coordonate.
Fie ntr-un sistem cartezian de coordonate un punct p
de coordonate (x, y). Deplasarea de coordonate de-a lungul
axei Ox cu o valoare dat a implic o modificare a coordonatelor punctului conform formulelor:
x = x + a ,
y = y.
n cazul deplasrii de-a lungul
axei Oy cu valoarea b, transformarea
de coordonate va fi dat de sistemul:
x = x,
y = y + b.
x = x + a ,
y = y + b.
Urmtorul tip de transformare este rotaia cu un unghi
n unele cazuri,
operaia poate fi re
alizat invers: prin
rotaia originii siste
mului de coordonate
fa de un punct (sau
sistem de puncte) dat.
Atunci exist patru
numere a, b, c, d, care
permit de a trece univoc coordonatele ( x, y )
n ( x, y) , utiliznd
sistemul de ecuaii:
x = ax + by,
(1.1)
y = cx + dy.
Pentru a determina acest cuadruplu de numere, pot fi
folosite punctele (1, 0) i (0, 1).
Se observ c la rotaia cu un unghi punctul de coordonate (1, 0) trece n punctul (cos ,sin ) , iar punctul de
coordonate (0, 1) n ( sin , cos ) (fig. 1.2).
Dup substituia acestor valori, n calitate de coeficieni
ai sistemului (1.1) se obine:
x = a
a = cos ,
y = c
c = sin .
Analog:
x = b
b = sin ,
y = d
d = cos .
ordonate ia forma:
x = x cos y sin ,
y = x sin + y cos .
n cazul n care rotaia cu unghiul a punctului de
coordonate ( x, y ) este efectuat fa de punctul de coordonate ( x0 , y0 ) , diferit de originea sistemului de coordonate,
nti se transfer originea sistemului de coordonate n
centrul de rotaie, apoi se efectueaz rotaia n jurul noii
origini a sistemului de coordonate:
x x0 = ( x x0 ) cos ( y y0 ) sin
y y0 = ( x x0 ) sin + ( y y0 ) cos
sau
x = x0 + ( x x0 ) cos ( y y0 ) sin
y = y0 + ( x x0 ) sin + ( y y0 ) cos
Trecerea de la coordonatele carteziene (x, y) la cele polare este determinat de urmtoarele formule [1, p. 77]:
r= x +y ,
arctan y
+ arctan y
=
y>0
y<0
x = 0, y > 0
x = 0, y < 0
1.3. Implementri
n problemele de geometrie computaional pot aprea
diferite modele de transformare a coordonatelor: deplasri
dup o ax, deplasri combinate (dup ambele axe), rotaii
fa de un punct, deplasri nsoite de rotaii. Toate aceste
transformri presupun recalcularea coordonatelor unui
punct sau ale unui sistem de puncte.
Pentru rezolvarea eficient a problemelor de geometrie
este foarte important de a alege corect structurile de date.
Pentru implementarea transformrilor de coordonate este
necesar descrierea unei singure structuri punctul:
type point=record
x,y : real;
end;
11
2. Intersecii
n majoritatea proble
melor de geometrie compu
taional apare n calitate de
subproblem determinarea
coordonatelor punctului de
intersecie a dou drepte, a
dou segmente sau a unui
segment i unei drepte.
x x1
y y1
=
.
x2 x1 y2 y1
(2.1)
x( y2 y1 ) + y ( x1 x2 ) + ( x2 y1 x1 y2 ) = 0. (2.2)
Din (2.2) rezult formulele de calcul pentru coeficienii
ecuaiei generale:
A = y2 y1 ,
B = x1 x2 ,
(2.3)
C = x2 y1 x1 y2 .
Determinarea punctului de intersecie
a dou drepte
Fie dreptele p i l determinate de perechile de puncte
p1 ( x1 , y1 ) , p2 ( x2 , y2 ) i respectiv p3 ( x3 , y3 ) , p4 ( x4 , y4 ) .
Determinarea punctului q de intersecie a acestor
drepte se reduce la rezolvarea sistemului de ecuaii:
A1 x + B1 y + C1 = 0
A2 x + B2 y + C2 = 0,
unde A1 x + B1 y + C1 = 0 este ecuaia general a dreptei p
i A2 x + B2 y + C2 = 0 este ecuaia general a dreptei l.
Coeficienii acestor ecuaii pot fi calculai conform formulelor (2.3).
Pn la rezolvarea nemijlocit a sistemului urmeaz
s se verifice dac dreptele p i l sunt paralele sau coincid.
13
ysol =
C1 A2 A1C2
,
B2 A1 B1 A2
B y + C1
xsol = 1 sol
;
A1
b) dac A1 = 0 ,
C
ysol = 1 ,
B1
xsol
B y + C2
= 2 sol
.
A2
(2.4 a)
(2.4 b)
Cu ajutorul setului de formule (2.4) pot fi calculate coordonatele punctului de intersecie q a dreptelor p i l.
x2
= x1
x3
y2 1
y1 1 .
y3 1
va avea
valoare: pozitiv, dac dreapta l i segmentul s nu se in
tersecteaz (ambele extremiti ale segmentului sunt
situate de aceeai parte a dreptei, valorile determinantului sunt de acelai semn); nul, dac cel puin una dintre
extremiti aparine dreptei (pentru extremitatea segmentului care aparine dreptei, determinantul este egal cu 0);
negativ, dac dreapta l i segmentul s se intersecteaz
(extremitile segmentului sunt situate de pri diferite
ale vectorului, valorile determinantului au semne dife
rite).
Prin urmare, dac pentru dreapta l determinat de
punctele p1 i p2 i segmentul s cu extremitile s1 i s2
expresia Sarrus(p2,p1,s1)*Sarrus(p2,p1,s2) are valoare
negativ, atunci dreapta l i segmentul s se intersecteaz,
iar coordonatele punctului de intersecie pot fi calculate
conform formulelor (2.4).
Dac valoarea expresiei este nul, se verific nemijlocit
care dintre extremitile segmentului aparine dreptei. n
cazul n care ambele extremiti ale segmentului aparin
dreptei, ntreg segmentul este coninut de aceasta.
3. nfurtoarea convex
Problema determinrii nfu
rtoarei convexe este una dintre
problemele centrale ale geometriei
computaionale. Ea apare att n
cadrul unor aplicaii economice, financiare, ecologice, arhitecturale,
ct i n probleme geometrice ana
litice.
Fig. 3.1. nfurtoarea
Noiunea de nfurtoare con convex a unei mulimi de
puncte
vex n plan este intuitiv simpl:
pentru o mulime S de puncte ale planului, nfurtoarea
convex Q ( S ) este mulimea de vrfuri ale poligonului1
convex cu cea mai mic arie, care conine toate punctele
mulimii S. nfurtoarea convex poate fi modelat cu
ajutorul inei benzi elastice, ntinse n jurul mulimii S. La
eliberare, banda elastic va repeta conturul nfurtoarei
convexe (fig. 3.1).
17
Pseudocod
Pas 1 C S
Pas 2 Pentru toate punctele pi S
Pentru toate punctele p j S , p j pi
Pentru toate punctele pk S , pk pi , pk p j
Pentru toate punctele
p S , p pi , p p j , p pk
if
p pi p j pk
18
then
C C /{ p}
pi p j ,
narea
poziiei
punctului
p
fa
de
fiecare
din
vectorii
19
de vectorul p1 p3 .
z S.
p
p
de vectorul k i , atunci se efectueaz micarea
nainte: p p[urm] , altfel p2 se exclude
din lista Q i se efectueaz micarea napoi:
p p[ prec] .
22
Pas 5
Dac
pi +1
Q Sinf Ssup .
procedure conv;
var minx,maxx:longint;
j, imin, imax,i, nsus, njos: integer;
rem: boolean;
p1,p2,p3:nod;
begin
{1. determinarea extremelor dupa x}
minx:=drag[1].x; maxx:=drag[1].x;imin:=1; imax:=1;
for i:=2 to n do
if drag[i].x< minx then
begin minx:=drag[i].x; imin:=i; end
else if drag[i].x>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])<0
then
begin inc(njos); jos[njos]:=drag[i]; end
else
begin inc(nsus); sus[nsus]:=drag[i]; end;
inc(nsus);sus[nsus]:=drag[imax];
inc(njos);jos[njos]:=drag[imax];
{3. sortarea subseturilor }
qsort(sus,2,nsus-1);
qsort(jos,2,njos-1);
{crearea infurtoarei convexe}
{4. sus}
repeat
rem:=false; i:=2;
24
25
4. Triangularizri
Din punct de vedere geometric, triangularizarea T(S)
a mulimii de puncte S este
o divizare a nfurtoarei
convexe Q(S) n triunghiuri.
Suplimentar, se vor respecta
condiiile:
a) vrfri ale triunghiurilor
pot fi numai puncte
Fig. 4.1. Triangularizarea unei mul
din S;
imi de puncte
b) toate punctele mulimii
S vor fi utilizate n calitate de vrfuri (fig. 4.1).
type segment=record
p1,p2:nod; l:real;
end;
Pseudocod
Pas 1 m 0
Pas 2 for i 1 to N do
for j 1+i to N do
Begin
End;
m
Latura[m].l distant(p[i],p[j])
Latura[m].st p[i]
Latura[m].fin p[j]
Pas 3 qsort(Latura,m);
3
d ( a, b) =
xa xb + ya yb .
27
Pas 4 k 0
Pas 5 for i 1 to M do
begin
z false
for j 1 to k do
if intersect(Latura[i],Triang[j])
then z true
if NOT z then
begin
k ; Triang[k] Latura[i]
end;
end;
distant(p[i],p[j])
29
Pas 3 qsort(Latura,m);
Begin
Triang[i].st p[i]
Triang[i].fin p[i+1]
End;
Triang[N].st p[N]
Triang[N].fin p[1]
k N
Pas 5 for i 1 to M do
Begin
z 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;
5. Apropiere i apartenen
Capitolul este consacrat analizei unor probleme geometrice n plan: determinarea celei mai apropiate perechi de
puncte, apartenena punctului la un poligon, construcia
poligoanelor cu proprieti prestabilite. Soluiile directe ale
acestor probleme sunt relativ simple, dar nu i optime.
index1 1; index2 2;
min distance(s1, s2);
For i 1 to N do
For j 1+i to N do
If distance(si, sj) < min then
Begin
min distance(si, sj)
index1 i; index2 j;
End;
Acelai rezultat poate fi obinut ntr-un timp mai restrns, folosind algoritmul optim cu o complexitate de
O( N log N ) .
31
Algoritmul optim
Pentru a determina n
timp optim cea mai apro
piat pereche de puncte,
poate fi folosit tehno
logia recursiv desparte i
stpnete. Ideea major
este divizarea, la fiecare
Fig. 5.2. Divizarea mulimii n submulimi
pas recursiv, a mulimii separabile fa de dreapta l pentru reiniiale n dou submulimi zolvarea recursiv a problemei cea mai
liniar separabile i rezol- apropiat pereche de puncte
varea problemei pe fiecare
submulime n parte (fig. 5.2).
Cazul elementar, care permite calculul direct al soluiei,
este mulimea format din dou sau trei puncte. Numrul
de operaii la acest pas este constant. Specificul problemei
const n determinarea soluiei optime la etapa de asamblare: avnd dou submulimi S1 i S2, cea mai apropiat
pereche de puncte n S1 S 2 poate s fie determinat de
o pereche s, s : s S1 , s S 2 . Se poate demonstra c, la
etapa asamblrii soluiei, numrul necesar de verificri la
fiecare 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 ) . Dac
numrul de operaii necesare pentru determinarea soluiei
la un nivel de asamblare este proporional cu N, complexitatea final a algoritmului va fi O ( N log N ) . Pentru
soluionarea optim a problemei este necesar o preprocesare a mulimii: sortarea punctelor dup abscis (se obine
irul sortat X) i sortarea punctelor dup ordonata lor (se
obine irul sortat Y). Avnd complexitatea O ( N log N ) ,
sortarea nu modific complexitatea final a algoritmului.
4
{sortare dup x}
Y S, sort(Y)
{sortare dup y}
Procedure apr2p(S, X, Y)
If
S 4
then
formeaz S1 , S 2 , X 1 , X 2 , Y1 , Y2
min (apr2p( S1 , X 1 , Y1 ),apr2p( S 2 , X 2 , Y2 ))
formeaz Y
for i 1 to Y do
for j 1 to 8 do
if distance( Y [i], Y [i+j]) <
then distance ( Y [i], Y [i+j])
return
end elsereturn distana minim n S {calculat direct}
begin
34
begin {apart}
apart:=true;
for i:=1 to N do
if not
verific_punct(p[i].x,p[i].y,p[i+1].x,p[i+1].y,s.x,s.y)
then apart:=false;
end; {apart}
38
xm =
ym =
xi + x j
2
yi + y j
,
;
2
dreapta d care conine segmentul pi pj va fi descris
de ecuaia Ax+By+C = 0, unde
A = y j yi ,
B = xi x j ,
C =x y x y ;
j i
i j
orice dreapt lperpendicular pe segmentul pi pj va
avea ecuaia general de forma Ax+By+C= 0;
pentru dreapta l, perpendicular pe segmentul pi pj i
care trece prin punctul de mijloc al acestuia, valoa
rea coeficientului C este: Aym Bxm.
Odat ce este cunoscut ecuaia dreptei l, perpendicu
lare pe segmentul pi pj n mijlocul acestuia, poate fi determinat semiplanul R( j): p R ( j ), d ( p, pi ) < d ( p, p j ).
R( j ).
Atunci V (i ) =
j =1,.., N
j i
Pentru realizarea algoritmului poate fi construit un poligon R de restrngere a planului, astfel nct S R . Cel
mai simplu poligon R este un dreptunghi avnd laturile
paralele cu axele de coordonate, determinat de punctele
40
i =1,..., N
i =1,..., N
la numr) pentru nf
urtoarea
convex
comun a
mulimii
S1 S 2 , se determin
mijloacele acestor laturi m1, m2. Prin punctele m1, m2 se traseaz
vectorii perpendiculari
pe laturile adugate la
nfurtoarea conve
x. Pentru latura supe
rioar vectorul este
orientat spre latur,
pentru cea inferioar
de la ea (fig. 5.12). Din
nfurtoarea convex
pentru S1 S 2 sunt
eliminate lanurile interioare de laturi ale
nfurtoarelor separate pentru S1 i S2.
Etapa 2: Construirea
lanului de concatenare.
Construcia lanului ncepe pe vectorul superior, dintr-un punct care
precede toate intersec
iile vectorului cu razele
diagramelor construite
anterior.
Lanul se traseaz
de-a lungul vectorului,
pn la intersecia cu
42
Cazul elementar se obine pentru 2 S 3 . Procesarea acestuia este realizat printr-un numr de operaii
mrginit de o constant.
Divizarea consecutiv a mulimii pentru obinerea cazurilor elementare necesit o sortare prealabil a punctelor din S dup abscisa lor. Complexitatea preprocesrii
este O ( N log N ) . Numrul de divizri consecutive ale
mulimii curente n dou submulimi aproape egale6
este proporional cu log( N ) . Pentru concatenarea solu
iilor pariale, n cazul alegerii structurii de date adec
vate7, este necesar un numr de operaii proporional cu
numrul total de laturi din soluiile pariale. Deoarece
diagrama Voronoi este o divizare planar a unei mulimi
din N puncte, numrul de laturi va fi proporional cu N.
Prin urmare, complexitatea total a algoritmului optim
este O ( N log N ) .
5.4. Nuclee
Printre problemele geometrice de calcul se numr i
problema determinrii nucleului poligonului simplu. Nucleul unui poligon simplu P este, n general, format
din mulimea de puncte Q P , astfel nct:
x Q, y P, [ x, y ] P .
Cu alte cuvinte, nucleul poligonului este mulimea de puncte ale poligonului, astfel nct oricare dintre
6
7
Pseudocod
Pas 1 Iniializare
46
vectorului pi pi +1 .
*
c) Q Q
Pas 3 Repetare
end
else
Dac dreapta
nu intersecteaz poligonul Q, se verific doar poziia Q
fa de pi pi +1 . Dac poligonul e poziionat n stnga, nucleul final este
vid, altfel Q nu se modific la acest pas.
8
47
Un robot punctiform poate executa instruciuni de deplasare n 8 direcii (1 nord, 2 nord-est, 3 est, 4 sud-est,
5 sud, 6 sud-vest, 7 vest, 8 nord-vest). Lungimea pasului robotului este 1 pentru direciile 1, 3, 5, 7 i 2 pentru direciile 2, 4, 6, 8. Numrul de pai efectuai n direcia
aleas este un parametru al instruciunii de deplasare.
Fiind dat un set de instruciuni, s se determine coordonatele punctului final n care se va deplasa robotul.
Astfel, pentru setul
(1,3) (3,1) (1,1) (3,3)
(5,2) (7,1) coordonatele
finale vor fi (3,2).
S se scrie un program care, dup un set de instruciuni,
s determine coordonatele punctului final n care se va deplasa robotul. Se consider c axa Ox e orientat spre est, iar
Oy spre nord. Iniial robotul se afl n originea sistemului
de coordonate (0,0).
Date de intrare
Prima linie a fiierului de intrare conine numrul N
numrul de instruciuni (1 N 40). Urmtoarele N linii
conin instruciunile propriu-zise numrul direciei (un
numr ntreg de la 1 la 8) i numrul de pai (un numr
ntreg de la 1 la 1000), separate prin spaiu.
Date de ieire
Unica linie a fiierul de ieire va conine dou numere
ntregi x i y, separate prin spaiu, coordonatele punctului
final n care se deplaseaz robotul.
48
Exemple
date.in
6
1 3
3 1
1 1
3 3
5 2
7 1
1
8 10
-10 10
Rezolvare
program p01;
var
I,N:integer;
D,L,X,Y:Longint;
begin
assign(Input,date.in); reset(Input);
read(N);
X:=0; Y:=0;
{fixarea 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.
49
6.2. Robot II
date.in
3 2
130 4 1
45 1 7
91 0 3
60 0 6
date.out
-0.653 15.697
50
Rezolvare
program p02;
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.
51
6.3. Piatra
52
Exemplu
date.in
2 1 9 14
2 4 1 8
1 12 3 9
4 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
Rezolvare
program p03;
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.
53
6.4. Carcasa
3 N 1000
1000 xc , yc 1000
54
Exemplu
date.in date.out
10 6 16 3
3 14
13 4
23 14
33 4
33 14
23 24
13 14
3 24
-7 14
-7 4
Rezolvare
Deoarece carcasa se sprijin pe careva puncte extreme ale poligonului, pro
blema poate fi divizat n dou subpro
bleme relativ simple:
1) determinarea nfurtoarei
convexe a vrfurilor poligonului;
2) verificarea dac un triunghi are un unghi obtuz.
6.5. Turnuri
56
6.6. Atac
Exemplu
Rezolvare
Formularea abstract a problemei este urmtoarea:
Fie n plan un poligon convex P cu n vrfuri. n acelai
plan este dat o mulime M din m puncte. Se cere s se
determine cte puncte din M aparin interiorului P.
Rezolvarea se divide n cteva etape.
1. Se determin un punct interior
al poligonului de coordonate
(xcm , ycm) (de exemplu, centrul
de mas).
Fiind date coordonatele (xi , yi),
i = 1, n , ale vrfurilor poligonului
P, coordonatele centrului de mas
pot fi calculate dup formula:
n
xcm =
x
i =1
ycm =
y
i =1
semnul
determinantului
x1
x2
x3
y1 1
y2 1 ,
y3 1
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);
60
6.7. Evadare
61
Exemplu
6.8. Arcai
Secretul victoriilor faimo
sului comandant de oti MegaFlop este strategia lui de
alegere a poziiei arcailor pe
cmpul de lupt. Cmpul are
forma unui poligon simplu i
e nconjurat de pduri. MegaFlop plaseaz arcaii doar pe
poziii din care este vzut tot
cmpul de lupt. Se consider
c arcaii vd tot cmpul, dac din orice punct care aparine
poziiei lor de tragere se poate trage cu sgeata n orice alt
punct al cmpului. Traiectoria sgeii este liniar. Nimerind
n pdure, sgeata se pierde. Pentru tragere, fiecare arca
are nevoie de o unitate de suprafa. Astfel, numrul ma
xim de arcai care pot fi plasai pe poziii este determinat
de aria poligonului din care este vzut toat cmpia.
S se scrie un program care determin numrul maxim
de arcai care pot fi plasai pe poziii de tragere n cmpul
de lupt.
62
Date de intrare
Fiierul de intrare arcas.in va conine pe prima linie un
numr ntreg N numrul de vrfuri ale poligonului simplu care descrie perimetrul cmpului de lupt. Urmeaz N
linii care conin coordonatele vrfurilor poligonului, parcurse n sensul micrii acelor de ceasornic, cte un vrf
pe linie. Linia i+1 conine dou numere ntregi xi, yi,
separate prin spaiu, coordonatele vrfului i.
Date de ieire
Fiierul de ieire arcas.out va conine un singur numr
ntreg numrul maxim de arcai care pot fi plasai pe
poziii.
Restricii
3 N 1000
0 < xi, yi 10000
Exemplu
arcas.in arcas.out
9 11
2 5
3 6
2 7
4 7
6 9
8 6
7 2
5 4
3 4
Rezolvare
program p68;
type
lat=record x,y:real; end;
pol=array[0..1001] of lat;
63
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;
64
function sarrus(a,b,c:lat):real;
begin
sarrus:=a.x*b.y+b.x*c.y+a.y*c.x-c.x*b.y-b.x*a.y-c.y*a.x;
end;
procedure cut(j:integer);
65
66
67
6.9. Cetate
68
6.10. Druizi
Date de ieire
Fiierul de ieire va conine pentru fiecare set de date
cuvntul YES, dac exist cel puin un sector n care se
afl doi sau mai muli druizi, NO, n caz contrar. Fiecare
rspuns se va scrie ntr-o linie aparte, n ordinea apariiei
seturilor de date n fiierul de intrare.
Exemplu
druizi.in druizi.out
3 2 3 YES
2 2 NO
1 -1
-2 0
1 1 -1
0 1 -1
#
1 0 100
0 0
Rezolvare
Pentru implementare vor fi definite tipurile i structurile:
type pt=record x,y,a:real; T:char;
end;
dr=array[1..3003] of pt;
var
d:dr;
n,m,i:integer;
int,xint,r,a,b,c,ae,be,ce,de,
l1a,l2a,l1b,l2b,l1c,l2c: real;
d[i].t:=L; end;
Ox.
74
Notaii
cardinalul mulimii S
i incrementarea valorii i cu 1
k m variabilei k i se atribuie valoarea
variabilei m
[a, b]
interval cu extremitile a, b
{x X : Q}
75
Bibliografie
76