Documente Academic
Documente Profesional
Documente Cultură
⎧x' = x + a
⎨ ' (1.3)
⎩y = y + b
⎧ x ' = ax + by
⎨ ' (1.4)
⎩ y = cx + dy
⎧x ' = a ⎧a = cos ϕ
⎨ ' ⇒⎨ (1.5.1)
⎩y = c ⎩ c = sin ϕ
Analogic:
⎧ x' = b ⎧b = − sin ϕ
⎨ ' ⇒⎨ (1.5.2)
⎩y = d ⎩ d = cos ϕ
În cazul, când rotirea cu unghiul ϕ a punctului cu coordonatele (x,y) este efectuară în raport cu
un punct (x0,y0), diferit de originea coordonatelor, mai întâi se transferă originea în centrul de
rotire (deplasarea de coordonate), apoi se efectuază rotirea în jurul noului „centru de
coordonate”:
⎧ x ' − x0 = ( x − x0 ) cos(ϕ ) − ( y − y 0 ) sin(ϕ )
⎨ ' sau
⎩ y − y 0 = ( x − x0 ) sin(ϕ ) + ( y − y 0 ) cos(ϕ )
⎧ x ' = x0 + ( x − x0 ) cos(ϕ ) − ( y − y 0 ) sin(ϕ )
⎨ ' (1.7)
⎩ y = y 0 + ( x − x0 ) sin(ϕ ) + ( y − y 0 ) cos(ϕ )
1.3 Implementări
În problemele de concurs pot apare diferite modele de transformări ale coordonatelor: deplasări
după o axă, deplasări combinate (după ambele axe), rotaţii faţă de un punct, deplasări însoţite de
rotaţii. Toate aceste transformări presupun recalcularea coordonatelor unui punct sau a unui
sistem de puncte.
Pentru rezolvarea eficientă a problemelor de geometrie este foarte importantă alegerea
corectă a structurilor de date. La moment se va implementa o singură structură – punctul:
type point=record
x,y : real;
end;
Să gaseşti o comoară ascunsă de către piraţi este simplu – dacă ai o hartă. De obicei harta este
însoţită de un algoritm ce descrie deplasarea spre comoară. De exemplu: „Găseşte stânca albă.
Mergi 30 de paşi spre pădure, apoi 15 spre lac, ... , şi 20 prin peşteră. Comoara e sub semnul
desenat pe peretele drept”. Cea mai mare parte a indicaţiilor se reduce la deplasarea cu un anumit
număr de paşi în una din direcţiile date (1 – nord, 2 – nord-est, 3 – est, 4 – sud-est, 5 – sud, 6 –
sud-vest, 7 – vest, 8 – nord-vest). Lungimea pasului este considerată 1 pentru direcţiile 1,3,5, 7 şi
2 pentru direcţiile 2, 4, 6, 8.
Călătoria după traseul descris e foarte simplă, dar cere mult timp. Căutătorii de comori vor să
ajungă direct la comoară. De exemplu, în loc să meargă 3 paşi la nord, 1 la est, 1 – la nord, 3 la
est, 2 la sud şi 1 pas la vest, se poate de mers direct, făcând doar aproximativ 3.6 paşi (des. 3).
Cerinţă
Scrieţi un program, care după indicaţiile piraţilor determină punctul, în care este ascunsă
comoara. Se consideră că axa Ox e îndreptată spre est, iar Oy – spre nord. Iniţial căutătorul de comori se
află în originea sistemului de coordonate (punctul cu coordonatele (0, 0)).
Input
Prima linie a fişierului de intrare conţine numărul N – numărul de indicaţii (1≤N≤40). Următoarele N
linii conţii indicaţiile propriu-zise – numărul direcţiei (un număr întreg de la 1 la 8) şi numărul de paşi (un
număr întreg de la 1 la 1000), separate prin spaţiu.
Output
Unica linie a fişierul de ieşire va conţine două numere întregi X şi Y separate prin spaţiu –
coordonatele punctului în care este ascunsă comoara.
Exemple
Comoara.in comoara.out
6 3 2
1 3
3 1
1 1
3 3
5 2
7 1
1 -10 10
8 10
Rezolvare
Program comori;
Var
I,N:integer;
D,L:Longint;
X,Y:Longint;
Begin
Assign(Input,'comori.in');
Reset(Input);
Read(N);
X:=0; Y:=0; {fixarea pozitiei initiale}
For I:=1 To N Do
Begin {modelarea deplasarii conform instructiilor}
Read(D,L);
case D of
1: Y:=Y+L; { deplasare spre nord cu L pasi}
2: begin X:=X+L; Y:=Y+L; end; { deplasare spre nord - est cu L pasi}
3: X:=X+L; { deplasare spre est cu L pasi}
4: begin X:=X+L; Y:=Y-L; end; { deplasare spre sud - est cu L pasi}
5: Y:=Y-L; { deplasare spre sud cu L pasi}
6: begin X:=X-L; Y:=Y-L; end; { deplasare spre sud - vest cu L pasi}
7: X:=X-L; { deplasare spre vest cu L pasi}
8: begin X:=X-L; Y:=Y+L; end; { deplasare spre nord - vest cu L pasi}
End;
End;
Close(Input);
Assign(Output,'comori.out');
Rewrite(Output);
Write(X,' ',Y);
Close(Output);
End.
1.4.2 Robotul defectat
În urma unei lovituri de meteorit sistemul de comandă al unui robot care se deplasează pe
suprafaţa planetei Marte a fost deteriorat. Robotul continuă să primească instrucţiuni, dar le
interpretează în felul său. Fiecare instrucţiune este un set din trei numere (u,vx,vy) întregi,
pozitive. Dacă valoarea u > 90, atunci robotul se deplasează cu vx după axa 0X şi cu vy după axa
0Y. Dacă, însă u ≤ 90, atunci robotul se deplasează pe un arc de mărime u împotriva acelor de
ceasornic a circumferinţei cu centrul în punctul (vx,vy). (des.4) Raza circumferinţei este
segmentul care uneşte robotul cu centrul ei.
Cerinţă
Input
Prima linie a fişierului de intrare
conţine două numere întregi –
coordonatele iniţiale ale robotului.
Următoarele linii conţii câte o
instrucţiune, formată din trei numere
întregi, separate prin spaţiu.
Output
Unica linie a fişierul de ieşire va
conţine două numere X şi Y separate
prin spaţiu – coordonatele punctului în
care se află robotul defectat, indicate cu
cel puţin 3 cifre după virgulă.
Exemplu
Robot.in (desen) Robot.out
3 2 -0.653 15.697
130 4 1
45 1 7
91 0 3
60 0 6
Rezolvare
program transformari;
const pi=3.141592;
type point=record
x,y : real;
end;
var
P: point;
alfa:real;
xn,yn:real;
f,g:text;
begin
assign(f,'robot.in');
reset(f);
assign(g,'rob.out');
rewrite(g);
readln(f,P.x,P.y);
while not eof(f) do
begin
readln(f,alfa,xn,yn);
if alfa>90 then move(P,xn,yn) else rotate(P,alfa,xn,yn);
end;
writeln(g,P.x:10:3,' ',P.y:10:3);
close(g);
end.
Bibliografie