Sunteți pe pagina 1din 22

Transformri grafice bidimensionale (1)

n procesul de sintez a imaginilor se folosesc frecvent diverse transformri.


Transformrile grafice permit reprezentarea desenelor la scara dorit, efectuarea operaiilor de
detaliere i micorare asupra imaginilor, realizarea animaiei, etc.
Transformrile grafice pot fi privite din dou puncte de vedere, complementare unul
altuia. De exemplu, sistemul de ecuaii care descrie transformarea coordonatelor unui punct
) , ( y x P :


y y
d x x
=
+ =
, (1.1)

poate fi interpretat n dou moduri:
a) Punctul din plan ) , ( y x P a fost translatat spre dreapta cu distana d (fig. 1.1a);
b) Axa y a sistemului de coordonate cartezian 2D a fost translatat cu distana d spre
stnga (fig. 1.1b).
Figura 1.1


Prin urmare, exist dou interpretri ale unei transformri grafice a unui punct:
a) se efectueaz transformri asupra coordonatelor unui punct, pstrnd acelai
sistem de coordonate;
b) se efectueaz transformri asupra sistemului de coordonate.
Prima interpretare corespunde transformrii unui punct raportat la un sistem de coordonate fix
i se formuleaz matematic ca o transformare geometric aplicat punctului. n acest caz,
) , ( y x sunt coordonatele punctului care rezult din transformarea lui P . Cea de-a doua
interpretare corespunde unei transformri a sistemului de coordonate, ) , ( y x reprezentnd
coordonatele punctului P n noul sistem de coordonate. Aceast interpretare este utilizat mai
ales n exprimarea operaiilor de vizualizare a obiectelor 2D i 3D care, de obicei, sunt definite
ntr-un sistem de coordonate propriu aplicaiei grafice, n timp ce reprezentarea lor pe
) , ( y x P ) , ( y x P
y
x
O
d
) , ( y x P
y
x
O
d
y
O
a) b)

suprafaa de afiare a unui echipament grafic este raportat la un sistem de coordonate propriu
suprafeei.


1. Transformri geometrice

Se consider un sistem de coordonate carteziene n plan. Orice obiect poate fi descris
printr-un set de atribute geometrice (coordonate), atribute topologice i atribute de aspect. De
exemplu, pentru un segment de dreapt este suficient s se specifice coordonatele capetelor
sale (atributele geometrice), ( )
1 1
, y x , ( )
2 2
, y x , i atributele de aspect (culoarea, tipul liniei
etc.). Pentru un desen mai complicat, cum ar fi planul unei case, nu este suficient cunoaterea
punctelor caracteristice trebuind s se specifice i legturile existente ntre punctele respective,
adic atributele topologice.
Transformarea geometric a unui obiect const n transformarea individual a fiecrui
punct din reprezentarea obiectului. De exemplu, pentru reducerea la o anumit scar a planului
casei, se aplic aceeai transformare tuturor punctelor prin care este specificat, atributele
topologice i cele de aspect nefiind afectate de transformare. Este deci suficient s se cunoasc
formulrile matematice ale transformrilor geometrice pentru un punct din plan.


1.1. Translaia

Translaia este transformarea prin care un obiect este deplasat din poziia sa, cu o distan dat,
dup o direcie dat. Matematic, translaia n plan este specificat printr-un vector:

j t i t
y x
r r
r
+ = v . (1.2)

Dac ( ) y x, sunt coordonatele unui punct P al unui obiect, atunci prin translaia obiectului cu
o distan egal cu mrimea vectorului v
r
, n direcia vectorului v
r
, punctul P se transform n
) , ( y x P (fig. 1.2), unde x i y sunt definite astfel:



Figura 1.2


y
( ) y x P ,
x
t
) , ( y x P
x
y
t
O
v
r


y
x
t y y
t x x
+ =
+ =
'
'
. (1.3)

Exemplu:
j i
r r
r
+ = 2 v , ) 5 , 5 ( = P . Prin translaia lui P cu vectorul v
r
se va obine punctul ) 6 , 7 ( = P .

Observaie. Obiectul este deplasat fr s se modifice forma, dimensiunea i orientarea.



1.2. Scalarea

Scalarea este transformare prin care un obiect este mrit sau micorat. n cazul 2D
scalarea este specificat prin dou numere, numite factorul de scalare pe axa x , respectiv
factorul de scalare pe axa y .Un factor de scalare supraunitar specific o mrire, iar unul
subunitar o micorare.

a) Scalarea fa de origine

Scalarea unui punct ) , ( y x P cu factorii
x
s ,
y
s fa de origine nseamn scalarea vectorului
poziie OP , care unete originea cu punctul P . Vectorul rezultat din scalare, P O are
componentele x , y date de:


y s y
x s x
y
x
=
=
'
'
(1.4)

Dac
y x
s s = , atunci scalarea este uniform (nu produce deformarea obiectului transformat).
n caz contrar, scalarea este neuniform (obiectul este deformat).
Exemplu: Fie ptratul cu vrfurile ) 1 , 1 ( , ) 1 , 3 ( , ) 3 , 3 ( , ) 3 , 1 ( (fig. 1.3a). Prin scalarea fa de
origine cu factorii 2 =
x
s , 3 =
y
s se va obine dreptunghiul cu vrfurile: ) 3 , 2 ( , ) 3 , 6 ( , ) 9 , 6 ( ,
) 9 , 2 ( (fig. 1.3b).

b) Scalarea fa de un punct din plan

Se consider ) , (
f f
y x F punctul din plan fa de care se face scalarea unui punct ) , ( y x P .
Punctul F se numete punct fix al transformrii, deoarece nu se modific prin aplicarea
transformrii. Scalarea punctului P fa de F cu factorii de scalare
x
s ,
y
s nseamn scalarea
vectorului FP. Componentele vectorului scalat P F sunt:



( )
( )
f y f
f x f
y y s y y
x x s x x
=
=
'
'
.

Din relaiile anterioare rezult:


y f f y
x f f x
s y y s y y
s x x s x x
+ =
+ =
'
'
. (1.5)

Exemplu: Prin scalarea ptratului din fig.1.3a cu aceiai factori de scalare 2 =
x
s , 3 =
y
s ,
fa de punctul ) 1 , 1 ( , se obine dreptunghiul din figura 1.3c.

Figura 1.3


1.3. Rotaia

a) Rotaia fa de origine

Rotaia este o transformare specificat printr-un unghi. Dac unghiul este pozitiv,
atunci rotaia este efectuat n sensul trigonometric (invers fa de sensul de rotaie al acelor de
ceas). Dac dorim s efectum rotaia n sens invers trigonometric, unghiul va fi negativ.
Coordonatele punctului ) , ( y x P , obinut prin rotaia cu a punctului P n jurul originii se
obin uor utiliznd legtura dintre coordonatele carteziene i cele polare ale lui P , respectiv
P (fig. 1.4).
Pentru punctul P putem scrie:

sin
cos
r y
r x
=
=
, (1.6)

iar pentru punctul P :


) ( sin
) ( cos


+ =
+ =
r y
r x
, (1.7)
2,2
1,1
x
y
a)
O
2,3
4,6
x O
y
1,1
3,4
x O
y
2,1
2,1
4,3
2,6
3,1
1,4
b)
c)
unde r reprezint lungimea vectorului de poziie OP , iar , unghiul su cu orizontala. (fig.
1.3a). nlocuind ) cos( + i ) sin( + cu expresiile lor trigonometrice i innd cont de
relaia (1.6) se obine:




cos sin
sin cos
y x y
y x x
+ =
=
. (1.8)




Figura 1.4



b) Rotaia fa de un punct oarecare din plan

Fie ) , ( y x P punctul din plan care se rotete n jurul unui punct ) , (
f f
y x F . La fel ca n cazul
scalrii, punctul F nu este afectat de transformare. Coordonatele punctului P , rezultat din
rotaia punctului P n jurul lui F cu un unghi , se obin din expresiile care calculeaz
componentele vectorului P F (fig. 1.4b):


u y y u x x y y
u y y u x x x x
f f f
f f f
cos ) ( sin ) (
sin ) ( cos ) (
+ =
=
. (1.9)

De fapt relaiile (1.9) pot fi scrise direct din relaiile (1.8) dup ce schimbm originea
sistemului n punctul F , printr-o translaie cu
f
x , respectiv
f
y . Din relaiile (1.9) rezult:


u y u x y u y u x y
u y u x x u y u x x
f f f
f f f
cos sin cos sin
sin cos sin cos
+ + =
+ + =
(1.10)



) , ( y x P
) , ( y x P


y
x
O
) , ( y x P
) , ( y x P


y
x
O
r
r
) , (
f f
y x F
a) b)

1.4. Formularea matricial a transformrilor


n cele mai multe cazuri, transformarea care trebuie aplicat unui obiect la un moment
dat este compus din mai multe transformri elementare. n aceste cazuri, formula oricrei
transformri compuse se poate obine uor folosind expresiile matriciale ale transformrilor
elementare. Coordonatele punctelor se pot reprezenta prin vectori de linie ] , [ y x P = sau
vectori coloan | |
T T
y x P = . Notm cu M matricea de transformare rezultat. Dac se
folosesc vectori linie, atunci se efectueaz nmulire la dreapta cu matricea de transformare
M , iar pentru vectori coloan nmulirea se face la stnga cu
T
M .
Observaie: n OpenGL se folosesc vectori coloan.
n continuare se utilizeaz vectori coloan. Dac sunt de efectuat mai multe transformri
nseamn c se efectueaz compunerea de matrici.

Translaia

Translaia nu poate fi exprimat ca un produs matricial. Relaiile (1.3) pot fi scrise ca o
adunare de vectori, n coordonate carteziene neexistnd o matrice de transformare pentru
translaie.
P M P + = , unde vectorul M este
(

=
y
x
t
t
M . (1.11)

Scalarea fa de origine

Relaiile (1.4) pot fi scrise matricial astfel:


(

=
(

y
x
s
s
y
x
y
x
0
0
P S P = , (1.12)

S fiind matricea transformrii de scalare.

Rotaia fa de origine

Relaiile (1.8) scrise matricial devin:


(


=
(

y
x
y
x


cos sin
sin cos
P R P = , (1.13)

unde prin R s-a notat matricea transformrii de rotaie.
Observaie: Pentru vectori linie relaia (1.13) devine:

| | | |
(

=


cos sin
sin cos
, , y x y x . (1.14)
Coordonate omogene

Deoarece pentru translaie, n coordonate carteziene, nu exist o matrice de
transformare, pentru a uniformiza notaiile se folosesc coordonate omogene. Acest sistem de
coordonate permite reprezentarea tuturor transformrilor ca produs de matrici. Unui punct 2D
din plan, ) , ( y x , i corespunde, n coordonate omogene un triplet ) , , ( w y x , n care:

w
y
y
w
x
x
w
w
=
=
. (1.15)

Observaie: Dac 0 = w , atunci pentru | | 0 , , b a , punctul se consider la infinit pe dreapta:

0 = x b y a (1.16)

Exemple:
1) [1,0,0] punctul de la infinit pe axa Ox pozitiv;
2) [1,1,0] punctul de la infinit n direcia [1,1].
3) Punctul ) 1 , 2 ( P n coordonate plane carteziene, devine n coordonate omogene (2,1,1) sau
(4,2,2), etc.
n grafic se utilizeaz 1 = w , ceea ce nseamn c:

) 1 , , ( ) , ( ene coord.omog eziene coord.cart y x P y x P . (1.17)

Dac n urma unor transformri se obine 1 w , se efectueaz mprirea cu w. n general,
transformrile geometrice primitive conserv valoarea lui w i deci dac se alege 1 = w
mprirea nu mai este necesar.
Cele trei transformri elementare examinate anterior, ntr-un sistem omogen de
coordonate se exprim astfel:

Translaia

Relaiile (1.11) devin:


(
(
(

(
(
(

=
(
(
(

1 1 0 0
1 0
0 1
1
y
x
t
t
y
x
y
x
P T P = , (1.18)
unde

(
(
(

=
1
y
x
P ,
(
(
(

=
1
y
x
P ,
(
(
(

=
1 0 0
1 0
0 1
y
x
t
t
T , (1.19)

T fiind matricea de translaie.

Scalarea fa de origine


(
(
(

(
(
(

=
(
(
(

1 1 0 0
0 0
0 0
1
y
x
s
s
y
x
y
x
P S P = ' , (1.20)

matricea de scalare fa de origine fiind:


(
(
(

=
1 0 0
0 0
0 0
y
x
s
s
S . (1.21)






Rotaia fa de origine


(
(
(

(
(
(


=
(
(
(

1 1 0 0
0 cos sin
0 sin cos
1
y
x
y
x


P R P = ' , (1.22)

matricea transformrii de rotaie fa de origine fiind:


(
(
(


=
1 0 0
0 cos sin
0 sin cos
) (

R . (1.23)

Observaie: La aplicarea a dou transformri asupra unui punct trebuie avut n vedere c
produsul matricial nu e comutativ. Excepie fac transformrile de acelai tip.
Expresiile matematice ale scalrii i rotaiei fa de un punct oarecare se pot obine prin
compunerea urmtoarelor transformri:
1. translaia prin care punctul fix al transformrii ajunge n origine
2. scalarea/rotaia fa de origine
3. translaia invers celei de la punctul 1.
Considerm ) , (
f f
y x F punctul fix al transformrii, unghiul de rotaie i
x
s , respectiv
y
s
factorii de scalare.

Scalarea fa de un punct fix

Conform celor afirmate anterior, coordonatele punctului P sunt date de:



P y x T s s S y x T P
f f y x f f
= ) , ( ) , ( ) , (
, (1.24)


(
(
(

(
(
(

(
(
(

(
(
(

=
(
(
(

1 1 0 0
1 0
0 1
1 0 0
0 0
0 0
1 0 0
1 0
0 1
1
y
x
y
x
s
s
y
x
y
x
f
f
f y
x f
(1.25)


Observaie:

=
(
(
(

(
(
(

(
(
(

=
(
(
(

1 1 0 0
0
0
1 0 0
1 0
0 1
1
y
x
y s s
x s s
y
x
y
x
f y y
f x x
f
f


,
1 1 1 0 0
0
0
(
(
(

+
+
=
(
(
(

(
(
(

+
+
=
f y f y
f x f x
f f y
y
f f x x
y s y s y
x s x s x
y
x
y y s s
x x s s

adic am obinut relaiile (1.5).




Rotaia fa de un punct fix

Coordonatele punctului P le obinem din:


P y x T R y x T P
f f f f
= ) , ( ) ( ) , (
(1.26)



(
(
(

(
(
(

(
(
(

(
(
(

=
(
(
(

1 1 0 0
1 0
0 1
1 0 0
0 cos sin
0 sin cos
1 0 0
1 0
0 1
1
y
x
y
x
y
x
y
x
f
f
f
f


(1.27)



1.5. Transformri geometrice inverse

Fiecare dintre transformrile geometrice elementare are o invers, adic o transformare
care exprim operaia opus celei corespunztoare transformrii.
Se pot verifica uor urmtoarele relaii:

| | ) , ( ) , (
1
y x y x
t t T t t T =

(1.28)
| | ) 1 , 1 ( ) , (
1
y x y x
s s S s s S =

(1.29)
| | ) ( ) (
1
R R =

(1.30)


De exemplu, pentru relaia (1.28) avem:

(
(
(

=
(
(
(

(
(
(

=
1 0 0
0 1 0
0 0 1
1 0 0
1 0
0 1
1 0 0
1 0
0 1
) , ( ) , (
y
x
y
x
y x y x
t
t
t
t
t t T t t T q.e.d.


1.6. Alte transformri simple

Oglindirea (Reflexia)

Fa de axa x (figura 1.5a):

y y
x x
=
=
,
(
(
(

(
(
(

=
(
(
(

1 1 0 0
0 1 0
0 0 1
1
y
x
y
x
,


Figura 1.5


deci matricea de oglindire fa de axa x este:

y
x
O
a)
y
x
O
b)
y
x
O
c)

(
(
(

=
1 0 0
0 1 0
0 0 1
x
O . (1.31)


Fa de axa y (figura 1.5b):


y y
x x
=
=
,
(
(
(

(
(
(

=
(
(
(

1 1 0 0
0 1 0
0 0 1
1
y
x
y
x
,

deci matricea de oglindire fa de axa y este:


(
(
(

=
1 0 0
0 1 0
0 0 1
y
O (1.32)

Fa de origine (figura 1.5c)


y y
x x
=
=
,
(
(
(

(
(
(

=
(
(
(

1 1 0 0
0 1 0
0 0 1
1
y
x
y
x
,

rezult c matricea de oglindire fa de origine este:


(
(
(

=
1 0 0
0 1 0
0 0 1
o
O (1.33)

Oglindirea fa de o dreapt oarecare

Fie dreapta b ax y + = (fig. 1.6). Se poate exprima oglindirea fa de dreapta b ax y + = , ca o
transformare compus din urmtoarele transformri elementare:
1. O translaie astfel nct o dreapt s treac prin origine ) , 0 ( b T ;
2. O rotaie a dreptei pentru a o alinia cu una din axele de coordonate, de exemplu cu axa
Ox , )) arctan( ( a R ;
3. Oglindirea fa de axa pe care a fost suprapus, n cazul nostru Ox ;
4. Rotaie invers celei de la punctul 2, )) (arctan(a R ;
5. Translaie invers celei de la punctul 1, ) , 0 ( b T .



Fig. 1.6 Oglindirea fa de o dreapt oarecare


Prin urmare, matricea transformrii este:

) , ( )) arctan( ( )) (arctan( ) , ( b a T a R O a R b a T M
x
= . (1.34)

De exemplu, coordonatele punctului ) , ( y x P din figura 1.6, care este simetricul lui ) , ( y x P
fa de dreapta b ax y + = , sunt date de P M P = .

Observaii:
1) Ordinea de acionare a matricilor care compun transformarea este de la dreapta la
stnga n cazul vectorilor coloan (cazul considerat) i de la stnga la dreapta n cazul
vectorilor linie.
2) Pentru dou transformri de acelai tip avem:

1 2 2 1
T T T T = ,

1 2 2 1
R R R R = , (1.35)

1 2 2 1
S S S S = .

Dac
y x
s s = , atunci are loc S R R S =
3) Pentru mai multe transformri n secven, ordinea este, de regul, urmtoarea:
scalarea se aplic naintea rotaiei.


2. Transformri ale sistemului de coordonate

Considerm dou sisteme de coordonate n plan, xOy i y O x . Unui punct fix din
plan, P , i corespund dou reprezentri: ) , ( y x n sistemul xOy i ) , ( y x n sistemul y O x .
Sistemul y O x se poate obine prin transformarea sistemului xOy , transformare ce se poate
defini prin relaia dintre cele dou reprezentri ale punctului P .

) , ( y x P
) , ( y x P
b
a b
O
x
y
2.1. Translaia

Dac sistemul y O x s-a obinut prin translaia sistemului xOy cu vectorul de
translaie (fig. 1.7a)
j t i t
y x
r r
+ = v ,
atunci relaia dintre coordonatele lui P n cele dou sisteme este:


y
x
t y y
t x x
=
=
P T P
C
= (1.36)

cu matricea de translaie a transformrii de coordonate:


(
(
(

=
1 0 0
1 0
0 1
) , (
y
x
y x C
t
t
t t T (1.37)

Figura 1.7

Observaie. Legtura dintre matricea transformrii sistemului de coordonate
C
T i matricea
transformrii geometrice T (n ideea n care transformrile nu se aplic sistemului de
coordonate ci se aplic punctului P ) este:


1
)] , ( [ ) , ( ) , (

= =
y x y x y x C
t t T t t T t t T , (1.38)

deci, matricea transformrii de coordonate este inversa matricii transformrii geometrice.




) , ( y x P
) , ( y x P
y y
x
x O
O
x
t
x
t
v
y
y
x
x O O ,
a)
b)
) , ( y x P
) , ( y x P



2.2. Rotaia

Fie sistemul y O x obinut prin rotaia axelor lui xOy cu unghiul fa de axa x
(fig. 1.7b). Pentru punctul P n sistemul xOy are coordonatele:

sin
cos
r y
r x
=
=
, (1.39)

iar n sistemul y O x :


) sin(
) cos(


=
=
r y
r x
. (1.40)

Din relaiile (1.39) i (1.40) rezult:




cos cos sin cos cos sin
sin cos sin sin cos cos
y x r r y
y x r r x
+ = =
+ = + =
. (1.41)

Notnd cu ) (
C
R matricea transformrii n cazul rotaiei unui sistem de coordonate avem:


(
(
(

=
1 0 0
0 cos sin
0 sin cos
) (

C
R . (1.42)

Se observ c ) (
C
R este inversa matricii transformrii geometrice de rotaie a punctului P
fa de origine vechiului sistem:

| |
1
) ( ) ( ) (

= = R R R
C
(1.43)

2.3. Scalarea

Considerm c formm un nou sistem de coordonate cu aceeai origine i orientare a
axelor, dar cu alte uniti de msur de-a lungul axelor x i y . Dac noile uniti de msur
se obin prin scalarea vechilor uniti cu factorii
x
s , respectiv
y
s , atunci relaia dintre
coordonatele aceluiai punct n cele dou sisteme este:


,
1
,
1
y
x
s
y y
s
x x
=
=
(1.44)

x x ,
y y ,
O O ,

) 2 , 1 ( P
) 200 , 100 ( P
Fig. 1.8
iar matricea transformrii de coordonate:


(
(
(
(

=
1 0 0
0
1
0
0 0
1
) , (
y
x
y x C
s
s
s s S . (1.45)

Se observ c
| |
1
) , (
1
,
1
) , (

= |

\
|
=
y x
y x
y x C
s s S
s s
S s s S (1.46)

unde prin S am notat matricea transformrii de scalare geometric (a coordonatelor
punctului).


3. Transformarea de instaniere

Obiectele se definesc n mod obinuit ntr-un sistem de coordonate propriu (local),
numit sistem de coordonate obiect. Acest sistem este caracterizat prin uniti de msur
adecvate, de exemplu metri sau milimetri. Pentru a reprezenta obiectul respectiv ntr-un desen
asupra lui trebuie efectuat o transformare. Operaia de trecere din sistemul local n alt spaiu
de desenare (care are alt origine i alte coordonate), se numete instaniere, iar transformarea
respectiv, transformare de instaniere.
Reprezentarea n diverse poziii, dimensiuni i orientri n noul spaiu se numete
instan a obiectului. Transformarea de instaniere este compus, n general, din scalare,
rotaie i translaie, dar pot fi necesare i alte transformri (oglindire, etc.).
Observaie: Translaia este ultima transformare care se aplic.
n exemplul 3, n programul AVION.CPP, utilizm o astfel de transformare pentru
obinerea instanei avionului.


4. Aplicaii

Pentru a exemplifica modul de implementare a transformrilor analizate anterior vom
considera trei exemple:
1. Rotirea de n ori a unui ptrat construit din linii n jurul centrului ecranului, cu un unghi
specificat.
2. Translaia unui ptrat astfel nct centrul su s parcurg circumferina unui arc de cerc cu
centrul n centrul ecranului.
3. Realizarea unor instane ale unui avion i apoi rotirea acestuia n jurul centrului ecranului.
Pentru aceste aplicaii utilizm mediul de programare Visual C++ 8.0 (Microsoft
Visual Studio 2005). La programele corespunztoare primelor dou aplicaii se vor folosi
funciile desen() i init_obiect(raza, latura). Funcia desen traseaz conturul ptratului

apelnd funcia DrawLine. Funcia init_obiect calculeaz coordonatele vrfurilor ptratului n
poziia sa iniial.

Exemplul 1. S se roteasc un ptrat n jurul centrului ecranului. Se vor efectua n
rotaii succesive (n sensul trigonometric) cu pasul n 2 .

Indicaii. n Visual C++ 8.0 se creeaz un proiect de tipul Windows Forms Application. n
namespace-ul cu denumirea dat proiectului va fi creat o clas denumit implicit Form1.
Pentru aceast clas definii o funcie care s trateze evenimentul Paint asociat cu Form1 (o
denumire uzual pentru aceast funcie este On_Paint). Funcia On_Paint va conine
instruciunile necesare pentru afiarea ptratului.


Structura funciilor care realizeaz cerinele problemei este prezentat mai jos. Trebuie
completate prile lips ale aplicaiei. Prin utilizarea comentariilor sunt prezentate explicaii
ale principalelor aciuni. n figura 1.9 este redat imaginea care trebuie obinut pentru 10 = n .


Fig. 1.9 Rotaii succesive ale unui ptrat

int xc, yc; //centrul suprafetei de desenare


void desen(Graphics ^g, Pen ^p, float x[4], float y[4])
{
//functie ce deseneaza patratul
... ... ... ... ... ... ...
}

void init_obiect(int raza, int latura, float x[4], float y[4])
{
//fuctie ce calculeaza coordonatele varfurilor in pozitia initiala
... ... ... ... ... ... ...
}

private: System::Void On_Paint(System::Object^ sender,
System::Windows::Forms::PaintEventArgs^ e) {
double u;
float x[4], y[4];

int N;
Graphics ^g=e->Graphics;

//suprafata de desenare
Rectangle rect = Form::ClientRectangle;

xc = rect.X + rect.Width / 2; //centrul ecranului
yc = rect.Y + rect.Height / 2;

N = 10;
double du = 2*System::Math::PI/N;
double c = System::Math::Cos(du);
double s = -System::Math::Sin(du);

//culoarea de desenare
Drawing::Pen ^myPen = gcnew Pen(Color::Black);
//culoarea fondului
g->Clear(Color::Beige);
init_obiect(60,50, x, y);

... ... ... ... ... ... ...

}



Exemplul 2. S se efectueze translaia unui ptrat, astfel nct centrul su s parcurg
circumferina unui cerc cu centrul n centrul ecranului.
Indicaie. Structura programului corespunztor este prezentat mai jos. n figura 1.10 este
redat imaginea care trebuie obinut pentru 10 translaii succesive.


Fig. 1.10 Translaii succesive ale unui ptrat





int xc, yc; //centrul suprafetei de desenare

void init_obiect(int raza, int latura, float x[4], float y[4])
{
//fuctie ce calculeaza coordonatele varfurilor in pozitia initiala
... ... ... ... ... ... ...
}

void desen(Graphics ^g, Pen ^p, float x[4], float y[4])
{
//functie ce deseneaza patratul
... ... ... ... ... ... ...
}

private: System::Void On_Paint(System::Object^ sender,
System::Windows::Forms::PaintEventArgs^ e) {

double u;
float x[4], y[4]; //coordonatele varfurilor patratului
int xcp, ycp; //coordonatele centrului patratului
int raza=60, latura=50;

int N;

Graphics ^g=e->Graphics;

Rectangle rect = Form::ClientRectangle;

xc = rect.X + rect.Width / 2; //centrul ecranului
yc = rect.Y + rect.Height / 2;

N = 10;

//calculeaza du, sin, cos
... ... ... ... ... ... ...

//culoarea de desenare
Drawing::Pen ^myPen = gcnew Pen(Color::Black);

//culoarea fondului
g->Clear(Color::Beige);

init_obiect(raza, latura, x, y);

//se calculeaza coordonatele initiale ale centrului patratului
xcp = xc + raza;
ycp = yc;

for(u = 0; u < 2*System::Math::PI ; u += du)
{
desen(g, myPen, x, y); //se afiseaza conturul patratului

//se calculeaza noua pozitie a centrului patratului
...
//se calculeaza componentele vectorului de translatie
...
//se aplica translatia fiecarui varf al patratului
...
//se actualizeaza pozitia curenta a centrului patratului
...
//se aplica un delay
...
}
}


Exemplul 3. Se consider un avion descris ntr-un sistem de coordonate propriu prin:
A(-30,0), B(-5,30), C(-5,40), D(0,45), E(5,40), F(5,30), G(30,0), H(5,20), I(5,-30), J(15,-40),
K(0,-35), L(-15,-40), M(-5,-30), N(-5,20). Se cere:
- S se deseneze avionul orientat spre dreapta, n sus, spre stnga i n jos, (scalarea fiind
facut cu 50/(latura max)), deplasat fa de centru cu 50 pixeli la dreapta, respectiv n sus, n
stnga i n jos.
- S se roteasc avionul n jurul centrului ecranului n sens trigonometric. Se consider o alt
instaniere a avionului, iniial orientat la dreapta i deplasat fa de centru cu 150 pixeli
(scalarea se va face cu 70/(latura max)).
Indicaii. Structura programului care realizeaz cerinele anterioare este prezentat mai jos.
Pentru afiarea avionului intr-o nou poziie, se utilizeaz un timer cu ajutorul cruia la un
anumit interval de timp se actualizeaz suprafaa de desenare.

using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;

bool firstTime = true;
typedef struct{
float x,y;
} coord2D;
const int np = 14;
coord2D avionRot[np]; //avionul care se roteste

//descrierea avionului
coord2D obiect[14]={{-30,0},{-5,30},{-5,40},{0,45},{5,40},{5,30},
{30,0},{5,20},{5,-30},{15,-40},{0,-35},
{-15,-40},{-5,-30},{-5,20}};

void afisare(coord2D corp[], Pen ^pen, Graphics ^g)
{
... ... ... ... ... ... ...
}

//extensie-determina laturile dreptunghiului de incadrare a obiectului
void extensie(coord2D corp[], int np, float &latx, float &laty)
{
int i;

float xmin, ymin, xmax, ymax;
xmin=xmax=corp[0].x;
ymin=ymax=corp[0].y;
for(i=1; i<np; i++)
{
if(corp[i].x < xmin) xmin=corp[i].x;
if(corp[i].x > xmax) xmax=corp[i].x;
if(corp[i].y < ymin) ymin=corp[i].y;
if(corp[i].y > ymax) ymax=corp[i].x;
}
latx=xmax-xmin;
laty=ymax-ymin;
}

//instantiere avion transformat fata de originea s.c.
void instantiere(coord2D avion[], float u, float scal, int tx, int ty)
{
//u - unghiul de rotatie
//scal - factorul de scalare
//tx, ty - componentele vectorului de translatie
... ... ... ... ... ... ...
}

private: System::Void On_Paint(System::Object^ sender,
System::Windows::Forms::PaintEventArgs^ e) {

int xc, yc;
float c, s, latx, laty, scal;

Rectangle rect = Form::ClientRectangle; //suprafata de desenare
xc = rect.X + rect.Width / 2; //centrul suprafetei de desenare
yc = rect.Y + rect.Height / 2;

extensie(obiect,np,latx,laty);
scal = (latx>laty)? 50/latx : 50/laty;

Graphics ^g = e->Graphics;
Drawing::Pen ^myPen = gcnew Pen(Color::Red); //setam culoarea de desenare

coord2D avion[np];

//instantiere avion orientat dreapta
instantiere(avion, ..., ..., ..., ...);
afisare(avion, myPen, g);

//instantiere avion orientat in sus
... ... ... ... ... ... ...
afisare(avion, myPen, g);

//instantiere avion orientat stanga
... ... ... ... ... ... ...
afisare(avion, myPen, g);

//instantiere avion orientat in jos
... ... ... ... ... ... ...
afisare(avion, myPen, g);

if(firstTime)
{
//calculeaza coordonatele initiale ale avionului care se roteste
instantiere(avionRot, 180, scal, xc + 150, yc);
//desenare in pozitia initiala
afisare(avionRot, myPen, g);
firstTime = false;
}
else
{
//calculeaza sin/cos de 3 grade
c=System::Math::Cos(Math::PI/60);
s=-System::Math::Sin(Math::PI/60);

//actualizeaza coordonatele varfurilor avionului care se roteste
for(int i = 0; i < np; i++)
{
float xx = avionRot[i].x;
avionRot[i].x = xx*c - avionRot[i].y*s + xc - xc*c + yc*s;
avionRot[i].y = xx*s + avionRot[i].y*c + yc - xc*s - yc*c;
}
//desenare in noua pozitie
afisare(avionRot, myPen, g);
}
}

private: System::Void On_Tick(System::Object^ sender,
System::EventArgs^ e) {
this->Refresh();
}

n urma rulrii programului trebuie s se obin, la un moment dat, o imagine ca cea
redat n fig. 1.11.

Fig. 1.11 Rotirea unui avion n jurul unui grup de patru avioane



Probleme propuse

1. Se consider originea sistemului de coordonate n centrul ecranului. S se deseneze un
ptrat (centrul ptratului diferit de centrul ecranului) i apoi s se realizeze simetricul lui fa
de dreapta x y = i x y = .

2. S se transleze grupul celor patru avioane din exemplul 3 atfel nct centrul figurii grupului
celor patru avioane s descrie circumferina unui cerc cu centrul n centrul ecranului. Cel de-al
cincilea avion se va roti tot timpul n jurul grupului celor patru avioane.

S-ar putea să vă placă și