transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/gui/laboratoare_vechi/lab4.pdf ·...

22
Transformări grafice bidimensionale (1) În procesul de sinteză a imaginilor se folosesc frecvent diverse transformări. Transformările grafice permit reprezentarea desenelor la scara dorită, efectuarea operaţiilor de detaliere şi micşorare asupra imaginilor, realizarea animaţiei, etc. Transformările grafice pot fi privite din două puncte de vedere, complementare unul altuia. De exemplu, sistemul de ecuaţii 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 distanţa d (fig. 1.1a); b) Axa y a sistemului de coordonate cartezian 2D a fost translatată cu distanţa d spre stânga (fig. 1.1b). Figura 1.1 Prin urmare, există două interpretări ale unei transformări grafice a unui punct: a) se efectuează transformări asupra coordonatelor unui punct, păstrând acelaşi sistem de coordonate; b) se efectuează transformări asupra sistemului de coordonate. Prima interpretare corespunde transformării 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 transformări a sistemului de coordonate, ) , ( y x reprezentând coordonatele punctului P în noul sistem de coordonate. Această interpretare este utilizată mai ales în exprimarea operaţiilor de vizualizare a obiectelor 2D şi 3D care, de obicei, sunt definite într-un sistem de coordonate propriu aplicaţiei grafice, în timp ce reprezentarea lor pe ) , ( y x P ) , ( y x P y x O d ) , ( y x P y x Od y O a) b)

Upload: vannhi

Post on 06-Feb-2018

253 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

Transformări grafice bidimensionale (1)

În procesul de sinteză a imaginilor se folosesc frecvent diverse transformări. Transformările grafice permit reprezentarea desenelor la scara dorită, efectuarea operaţiilor de detaliere şi micşorare asupra imaginilor, realizarea animaţiei, etc. Transformările grafice pot fi privite din două puncte de vedere, complementare unul altuia. De exemplu, sistemul de ecuaţii care descrie transformarea coordonatelor unui punct

),( yxP :

yy

dxx

=′

+=′, (1.1)

poate fi interpretat în două moduri:

a) Punctul din plan ),( yxP a fost translatat spre dreapta cu distanţa d (fig. 1.1a); b) Axa y a sistemului de coordonate cartezian 2D a fost translatată cu distanţa d spre

stânga (fig. 1.1b).

Figura 1.1

Prin urmare, există două interpretări ale unei transformări grafice a unui punct:

a) se efectuează transformări asupra coordonatelor unui punct, păstrând acelaşi sistem de coordonate; b) se efectuează transformări asupra sistemului de coordonate.

Prima interpretare corespunde transformării unui punct raportat la un sistem de coordonate fix şi se formulează matematic ca o transformare geometrică aplicată punctului. În acest caz,

),( yx ′′ sunt coordonatele punctului care rezultă din transformarea lui P . Cea de-a doua interpretare corespunde unei transformări a sistemului de coordonate, ),( yx ′′ reprezentând coordonatele punctului P în noul sistem de coordonate. Această interpretare este utilizată mai ales în exprimarea operaţiilor de vizualizare a obiectelor 2D şi 3D care, de obicei, sunt definite într-un sistem de coordonate propriu aplicaţiei grafice, în timp ce reprezentarea lor pe

),( yxP ),( yxP ′′′

y

x O

d

),( yxP ′′′

y′

x O′

d

y

O

a) b)

Page 2: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

suprafaţa de afişare a unui echipament grafic este raportată la un sistem de coordonate propriu suprafeţei. 1. Transformări 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), ( )11, yx , ( )22 , yx , şi atributele de aspect (culoarea, tipul liniei etc.). Pentru un desen mai complicat, cum ar fi planul unei case, nu este suficientă cunoaşterea punctelor caracteristice trebuind să se specifice şi legăturile existente între punctele respective, adică atributele topologice. Transformarea geometrică a unui obiect constă în transformarea individuală a fiecărui punct din reprezentarea obiectului. De exemplu, pentru reducerea la o anumită scară a planului casei, se aplică aceeaşi transformare tuturor punctelor prin care este specificată, atributele topologice şi cele de aspect nefiind afectate de transformare. Este deci suficient să se cunoască formulările matematice ale transformărilor geometrice pentru un punct din plan. 1.1. Translaţia Translaţia este transformarea prin care un obiect este deplasat din poziţia sa, cu o distanţă dată, după o direcţie dată. Matematic, translaţia în plan este specificată printr-un vector: jtit yx

rrr+=v . (1.2)

Dacă ( )yx, sunt coordonatele unui punct P al unui obiect, atunci prin translaţia obiectului cu o distanţă egală cu mărimea vectorului v

r, în direcţia vectorului v

r, punctul P se transformă în

),( yxP ′′′ (fig. 1.2), unde x′ şi y′ sunt definite astfel:

Figura 1.2

y

( )yxP ,

xt

),( yxP ′′′

x

yt

O

vr

Page 3: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

y

x

tyy

txx

+=

+=

'

'. (1.3)

Exemplu:

jirrr

+= 2v , )5,5(=P . Prin translaţia lui P cu vectorul vr se va obţine punctul )6,7(=′P .

Observaţie. Obiectul este deplasat fără să se modifice forma, dimensiunea şi orientarea.

1.2. Scalarea

Scalarea este transformare prin care un obiect este mărit sau micşorat. Î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 mărire, iar unul subunitar o micşorare. a) Scalarea faţă de origine Scalarea unui punct ),( yxP cu factorii xs , ys faţă de origine înseamnă scalarea vectorului

poziţie OP , care uneşte originea cu punctul P . Vectorul rezultat din scalare, PO ′ are componentele x , y date de:

ysy

xsx

y

x

⋅=

⋅=

'

' (1.4)

Dacă yx ss = , atunci scalarea este uniformă (nu produce deformarea obiectului transformat).

În caz contrar, scalarea este neuniformă (obiectul este deformat). Exemplu: Fie pătratul cu vârfurile )1,1( , )1,3( , )3,3( , )3,1( (fig. 1.3a). Prin scalarea faţă de

origine cu factorii 2=xs , 3=ys se va obţine dreptunghiul cu vârfurile: )3,2( , )3,6( , )9,6( ,

)9,2( (fig. 1.3b). b) Scalarea faţă de un punct din plan Se consideră ),( ff yxF punctul din plan faţă de care se face scalarea unui punct ),( yxP .

Punctul F se numeşte punct fix al transformării, deoarece nu se modifică prin aplicarea transformării. Scalarea punctului P faţă de F cu factorii de scalare xs , ys înseamnă scalarea

vectorului FP . Componentele vectorului scalat PF ′ sunt:

Page 4: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

( )( )fyf

fxf

yysyy

xxsxx

−⋅=−

−⋅=−

'

'.

Din relaţiile anterioare rezultă:

yffy

xffx

syysyy

sxxsxx

⋅−+⋅=

⋅−+⋅=

'

'. (1.5)

Exemplu: Prin scalarea pătratului din fig.1.3a cu aceiaşi factori de scalare 2=xs , 3=ys ,

faţă de punctul )1,1( , se obţine dreptunghiul din figura 1.3c.

Figura 1.3

1.3. Rotaţia a) Rotaţia faţă de origine

Rotaţia este o transformare specificată printr-un unghi. Dacă unghiul este pozitiv, atunci rotaţia este efectuată în sensul trigonometric (invers faţă de sensul de rotaţie al acelor de ceas). Dacă dorim să efectuăm rotaţia în sens invers trigonometric, unghiul va fi negativ. Coordonatele punctului ),( yxP ′′′ , obţinut prin rotaţia cu α a punctului P în jurul originii se obţin uşor utilizând legătura dintre coordonatele carteziene şi cele polare ale lui P , respectiv P′ (fig. 1.4). Pentru punctul P putem scrie:

θθ

sin

cos

ry

rx

=

=, (1.6)

iar pentru punctul P′ :

)(sin

)(cos

θαθα

+=′

+=′

ry

rx, (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)

Page 5: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

unde r reprezintă lungimea vectorului de poziţie OP , iar θ , unghiul său cu orizontala. (fig. 1.3a). Înlocuind )cos( θα + şi )sin( θα + cu expresiile lor trigonometrice şi ţinând cont de relaţia (1.6) se obţine:

αααα

cossin

sincos

yxy

yxx

+=′

−=′. (1.8)

Figura 1.4

b) Rotaţia faţă de un punct oarecare din plan Fie ),( yxP punctul din plan care se roteşte în jurul unui punct ),( ff yxF . La fel ca în cazul

scalării, punctul F nu este afectat de transformare. Coordonatele punctului P′ , rezultat din rotaţia punctului P în jurul lui F cu un unghi α , se obţin din expresiile care calculează componentele vectorului PF ′ (fig. 1.4b):

uyyuxxyy

uyyuxxxx

fff

fff

cos)(sin)(

sin)(cos)(

−+−=−′

−−−=−′. (1.9)

De fapt relaţiile (1.9) pot fi scrise direct din relaţiile (1.8) după ce schimbăm originea sistemului în punctul F , printr-o translaţie cu fx , respectiv fy . Din relaţiile (1.9) rezultă:

uyuxyuyuxy

uyuxxuyuxx

fff

fff

cossincossin

sincossincos

−−++=′

+−+−=′ (1.10)

),( yxP ′′′

),( yxP

θ α

y

x O

),( yxP ′′′

),( yxP α

y

x O

r

r

),( ff yxF

a) b)

Page 6: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

1.4. Formularea matricială a transformărilor În cele mai multe cazuri, transformarea care trebuie aplicată unui obiect la un moment dat este compusă din mai multe transformări elementare. În aceste cazuri, formula oricărei transformări compuse se poate obţine uşor folosind expresiile matriciale ale transformărilor elementare. Coordonatele punctelor se pot reprezenta prin vectori de linie ],[ yxP = sau

vectori coloană [ ]TT yxP = . Notăm cu M matricea de transformare rezultată. Dacă se folosesc vectori linie, atunci se efectuează înmulţire la dreapta cu matricea de transformare

M , iar pentru vectori coloană înmulţirea se face la stânga cu TM . Observaţie: În OpenGL se folosesc vectori coloană. În continuare se utilizează vectori coloană. Dacă sunt de efectuat mai multe transformări înseamnă că se efectuează compunerea de matrici. Translaţia Translaţia nu poate fi exprimată ca un produs matricial. Relaţiile (1.3) pot fi scrise ca o adunare de vectori, în coordonate carteziene neexistând o matrice de transformare pentru translaţie.

PMP +=′ , unde vectorul M este

=

y

x

t

tM . (1.11)

Scalarea faţă de origine

Relaţiile (1.4) pot fi scrise matricial astfel:

=

y

x

s

s

y

x

y

x

0

0 ⇔ PSP =′ , (1.12)

S fiind matricea transformării de scalare.

Rotaţia faţă de origine Relaţiile (1.8) scrise matricial devin:

−=

y

x

y

x

αααα

cossin

sincos ⇔ PRP =′ , (1.13)

unde prin R s-a notat matricea transformării de rotaţie. Observaţie: Pentru vectori linie relaţia (1.13) devine:

[ ] [ ]

=′′αααα

cossin

sincos,, yxyx . (1.14)

Page 7: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

Coordonate omogene

Deoarece pentru translaţie, în coordonate carteziene, nu există o matrice de transformare, pentru a uniformiza notaţiile se folosesc coordonate omogene. Acest sistem de coordonate permite reprezentarea tuturor transformărilor ca produs de matrici. Unui punct 2D din plan, ),( yx , îi corespunde, în coordonate omogene un triplet ),,( wyx , în care:

w

yy

w

xx

w

w

=

=. (1.15)

Observaţie: Dacă 0=w , atunci pentru [ ]0,, ba , punctul se consideră la infinit pe dreapta: 0=− xbya (1.16) Exemple: 1) [1,0,0] – punctul de la infinit pe axa Ox pozitivă; 2) [1,1,0] – punctul de la infinit în direcţia [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,,(),( enecoord.omogezienecoord.cart yxPyxP → . (1.17) Dacă în urma unor transformări se obţine 1≠w , se efectuează împărţirea cu w. În general, transformările geometrice primitive conservă valoarea lui w şi deci dacă se alege 1=w împărţirea nu mai este necesară. Cele trei transformări elementare examinate anterior, într-un sistem omogen de coordonate se exprimă astfel: Translaţia Relaţiile (1.11) devin:

=

1100

10

01

1

y

x

t

t

y

x

y

x

⇔ PTP =′ , (1.18)

unde

=

1

y

x

P ,

=′

1

y

x

P ,

=

100

10

01

y

x

t

t

T , (1.19)

T fiind matricea de translaţie.

Page 8: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

Scalarea faţă de origine

=

1100

00

00

1

y

x

s

s

y

x

y

x

⇔ PSP =' , (1.20)

matricea de scalare faţă de origine fiind:

=

100

00

00

y

x

s

s

S . (1.21)

Rotaţia faţă de origine

=

1100

0cossin

0sincos

1

y

x

y

x

αααα

⇔ PRP =' , (1.22)

matricea transformării de rotaţie faţă de origine fiind:

=

100

0cossin

0sincos

)( αααα

αR . (1.23)

Observaţie: La aplicarea a două transformări asupra unui punct trebuie avut în vedere că produsul matricial nu e comutativ. Excepţie fac transformările de acelaşi tip. Expresiile matematice ale scalării şi rotaţiei faţă de un punct oarecare se pot obţine prin compunerea următoarelor transformări: 1. – translaţia prin care punctul fix al transformării ajunge în origine 2. – scalarea/rotaţia faţă de origine 3. – translaţia inversă celei de la punctul 1. Considerăm ),( ff yxF punctul fix al transformării, α unghiul de rotaţie şi xs , respectiv ys

factorii de scalare. Scalarea faţă de un punct fix Conform celor afirmate anterior, coordonatele punctului P′ sunt date de:

Page 9: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

PyxTssSyxTP ffyxff ⋅−−⋅⋅=′ ),(),(),( , (1.24)

=

1100

10

01

100

00

00

100

10

01

1

y

x

y

x

s

s

y

x

y

x

f

f

f y

xf

(1.25)

Observaţie:

=

=

1100

0

0

100

10

01

1

y

x

yss

xss

y

x

y

x

fyy

fxx

f

f

,

11100

0

0

−+

−+

=

+−

+−

= fyfy

fxfx

ffyy

ffxx

ysysy

xsxsx

y

x

yyss

xxss

adică am obţinut relaţiile (1.5). Rotaţia faţă de un punct fix Coordonatele punctului P′ le obţinem din:

PyxTRyxTP ffff ⋅−−⋅⋅=′ ),()(),( α (1.26)

=

1100

10

01

100

0cossin

0sincos

100

10

01

1

y

x

y

x

y

x

y

x

f

f

f

f

αααα

(1.27)

1.5. Transformări geometrice inverse Fiecare dintre transformările geometrice elementare are o inversă, adică o transformare care exprimă operaţia opusă celei corespunzătoare transformării. Se pot verifica uşor următoarele relaţii:

[ ] ),(),( 1yxyx ttTttT −−=− (1.28)

[ ] )1,1(),( 1yxyx ssSssS =− (1.29)

[ ] )()( 1 αα RR =− (1.30)

Page 10: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

De exemplu, pentru relaţia (1.28) avem:

=

=−−⋅

100

010

001

100

10

01

100

10

01

),(),( y

x

y

x

yxyx t

t

t

t

ttTttT q.e.d.

1.6. Alte transformări simple Oglindirea (Reflexia) Faţă de axa x (figura 1.5a):

yy

xx

−=′

=′,

−=

1100

010

001

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)

Page 11: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

−=

100

010

001

xO . (1.31)

Faţă de axa y (figura 1.5b):

yy

xx

=′

−=′,

=

1100

010

001

1

y

x

y

x

,

deci matricea de oglindire faţă de axa y este:

=

100

010

001

yO (1.32)

Faţă de origine (figura 1.5c)

yy

xx

−=′

−=′,

=

1100

010

001

1

y

x

y

x

,

rezultă că matricea de oglindire faţă de origine este:

=

100

010

001

oO (1.33)

Oglindirea faţă de o dreaptă oarecare Fie dreapta baxy += (fig. 1.6). Se poate exprima oglindirea faţă de dreapta baxy += , ca o transformare compusă din următoarele transformări elementare:

1. O translaţie astfel încât o dreaptă să treacă prin origine ),0( bT − ; 2. O rotaţie a dreptei pentru a o alinia cu una din axele de coordonate, de exemplu cu axa

Ox , ))arctan(( aR − ; 3. Oglindirea faţă de axa pe care a fost suprapusă, în cazul nostru Ox ; 4. Rotaţie inversă celei de la punctul 2, ))(arctan(aR ; 5. Translaţie inversă celei de la punctul 1, ),0( bT .

Page 12: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

Fig. 1.6 Oglindirea faţă de o dreaptă oarecare Prin urmare, matricea transformării este: ),())arctan(())(arctan(),( baTaROaRbaTM x ⋅−⋅⋅⋅= . (1.34)

De exemplu, coordonatele punctului ),( yxP ′′′ din figura 1.6, care este simetricul lui ),( yxP faţă de dreapta baxy += , sunt date de PMP ⋅=′ . Observaţii:

1) Ordinea de acţionare a matricilor care compun transformarea este de la dreapta la stânga în cazul vectorilor coloană (cazul considerat) şi de la stânga la dreapta în cazul vectorilor linie.

2) Pentru două transformări de acelaşi tip avem:

1221 TTTT ⋅=⋅ ,

1221 RRRR ⋅=⋅ , (1.35)

1221 SSSS ⋅=⋅ .

Dacă yx ss = , atunci are loc SRRS ⋅=⋅

3) Pentru mai multe transformări în secvenţă, ordinea este, de regulă, următoarea: scalarea se aplică înaintea rotaţiei.

2. Transformări ale sistemului de coordonate Considerăm două sisteme de coordonate în plan, xOy şi yOx ′′′ . Unui punct fix din plan, P , îi corespund două reprezentări: ),( yx în sistemul xOy şi ),( yx ′′ în sistemul yOx ′′′ . Sistemul yOx ′′′ se poate obţine prin transformarea sistemului xOy , transformare ce se poate defini prin relaţia dintre cele două reprezentări ale punctului P .

),( yxP

),( yxP ′′′

b ab−

O x

y

Page 13: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

2.1. Translaţia Dacă sistemul yOx ′′′ s-a obţinut prin translaţia sistemului xOy cu vectorul de

translaţie (fig. 1.7a)

jtit yx

rr+=v ,

atunci relaţia dintre coordonatele lui P în cele două sisteme este:

y

x

tyy

txx

−=′

−=′ ⇔ PTP C ⋅=′ (1.36)

cu matricea de translaţie a transformării de coordonate:

=

100

10

01

),( y

x

yxC t

t

ttT (1.37)

Figura 1.7

Observaţie. Legătura dintre matricea transformării sistemului de coordonate CT şi matricea

transformării geometrice T (în ideea în care transformările nu se aplică sistemului de coordonate ci se aplică punctului P ) este:

1)],([),(),( −=−−= yxyxyxC ttTttTttT , (1.38)

deci, matricea transformării de coordonate este inversa matricii transformării geometrice.

),( yxP ),( yxP ′′

y y′

x′

x O

O′

xt

xt

v

y′

y

x′

x OO ′,

a) b)

),( yxP ),( yxP ′′′

θ θ α

Page 14: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

2.2. Rotaţia Fie sistemul yOx ′′′ obţinut prin rotaţia axelor lui xOy cu unghiul θ faţă de axa x (fig. 1.7b). Pentru punctul P în sistemul xOy are coordonatele:

αα

sin

cos

ry

rx

=

=, (1.39)

iar în sistemul yOx ′′′ :

)sin(

)cos(

θαθα

−=′

−=′

ry

rx. (1.40)

Din relaţiile (1.39) şi (1.40) rezultă:

θθθαθα

θθθαθαcoscossincoscossin

sincossinsincoscos

yxrry

yxrrx

+−=−=′

+=+=′. (1.41)

Notând cu )(θCR matricea transformării în cazul rotaţiei unui sistem de coordonate avem:

−=

100

0cossin

0sincos

)( θθθθ

θCR . (1.42)

Se observă că )(θCR este inversa matricii transformării geometrice de rotaţie a punctului P

faţă de origine vechiului sistem:

[ ] 1)()()( −=−= θθθ RRRC (1.43)

2.3. Scalarea

Considerăm că formăm un nou sistem de coordonate cu aceeaşi origine şi orientare a axelor, dar cu alte unităţi de măsură de-a lungul axelor x şi y . Dacă noile unităţi de măsură

se obţin prin scalarea vechilor unităţi cu factorii xs , respectiv ys , atunci relaţia dintre

coordonatele aceluiaşi punct în cele două sisteme este:

,

1

,1

y

x

syy

sxx

⋅=′

⋅=′

(1.44)

xx ′,

yy ′,

OO ′,

• )2,1(P′

)200,100(P

Fig. 1.8

Page 15: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

iar matricea transformării de coordonate:

=

100

010

001

),(y

x

yxC s

s

ssS . (1.45)

Se observă că

[ ] 1),(1,1),( −=

= yxyx

yxC ssSss

SssS (1.46)

unde prin S am notat matricea transformării de scalare geometrică (a coordonatelor punctului).

3. Transformarea de instanţiere

Obiectele se definesc în mod obişnuit într-un sistem de coordonate propriu (local), numit sistem de coordonate obiect. Acest sistem este caracterizat prin unităţi de măsură adecvate, de exemplu metri sau milimetri. Pentru a reprezenta obiectul respectiv într-un desen asupra lui trebuie efectuată o transformare. Operaţia de trecere din sistemul local în alt spaţiu de desenare (care are altă origine şi alte coordonate), se numeşte instanţiere, iar transformarea respectivă, transformare de instanţiere. Reprezentarea în diverse poziţii, dimensiuni şi orientări în noul spaţiu se numeşte instanţă a obiectului. Transformarea de instanţiere este compusă, în general, din scalare, rotaţie şi translaţie, dar pot fi necesare şi alte transformări (oglindire, etc.). Observaţie: Translaţia este ultima transformare care se aplică. În exemplul 3, în programul AVION.CPP, utilizăm o astfel de transformare pentru obţinerea instanţei avionului. 4. Aplicaţii Pentru a exemplifica modul de implementare a transformărilor analizate anterior vom considera trei exemple: 1. Rotirea de n ori a unui pătrat construit din linii în jurul centrului ecranului, cu un unghi

specificat. 2. Translaţia unui pătrat astfel încât centrul său să parcurgă circumferinţa unui arc de cerc cu

centrul în centrul ecranului. 3. Realizarea unor instanţe ale unui avion şi apoi rotirea acestuia în jurul centrului ecranului. Pentru aceste aplicaţii utilizăm mediul de programare Visual C++ 8.0 (Microsoft Visual Studio 2005). La programele corespunzătoare primelor două aplicaţii se vor folosi funcţiile desen() şi init_obiect(raza, latura). Funcţia desen trasează conturul pătratului

Page 16: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

apelând funcţia DrawLine. Funcţia init_obiect calculează coordonatele vârfurilor pătratului în poziţia sa iniţială. Exemplul 1. Să se rotească un pătrat în jurul centrului ecranului. Se vor efectua n rotaţii succesive (în sensul trigonometric) cu pasul nπ2 . Indicaţii. Î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ă definiţi o funcţie care să trateze evenimentul Paint asociat cu Form1 (o denumire uzuală pentru această funcţie este On_Paint). Funcţia On_Paint va conţine instrucţiunile necesare pentru afişarea pătratului. Structura funcţiilor care realizează cerinţele problemei este prezentată mai jos. Trebuie completate părţile lipsă ale aplicaţiei. Prin utilizarea comentariilor sunt prezentate explicaţii ale principalelor acţiuni. În figura 1.9 este redată imaginea care trebuie obţinută pentru 10=n .

Fig. 1.9 Rotaţii succesive ale unui pătrat 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;

Page 17: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

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 translaţia unui pătrat, astfel încât centrul său să parcurgă circumferinţa unui cerc cu centrul în centrul ecranului. Indicaţie. Structura programului corespunzător este prezentată mai jos. În figura 1.10 este redată imaginea care trebuie obţinută pentru 10 translaţii succesive.

Fig. 1.10 Translaţii succesive ale unui pătrat

Page 18: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

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

Page 19: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

... //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 stânga şi în jos, (scalarea fiind facută cu 50/(latura max)), deplasat faţă de centru cu 50 pixeli la dreapta, respectiv în sus, în stânga şi în jos. - Să se rotească avionul în jurul centrului ecranului în sens trigonometric. Se consideră o altă instanţiere a avionului, iniţial orientat la dreapta şi deplasat faţă de centru cu 150 pixeli (scalarea se va face cu 70/(latura max)). Indicaţii. Structura programului care realizează cerinţele anterioare este prezentată mai jos. Pentru afişarea avionului intr-o nouă poziţie, se utilizează un timer cu ajutorul căruia la un anumit interval de timp se actualizează suprafaţa 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;

Page 20: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

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);

Page 21: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

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 rulării programului trebuie să se obţină, 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

Page 22: Transformări grafice bidimensionale (1)web.info.uvt.ro/~mgaianu/GUI/Laboratoare_vechi/Lab4.pdf · Matematic, translaţia în plan este specificată printr-un vector ... adunare de

Probleme propuse 1. Se consideră originea sistemului de coordonate în centrul ecranului. Să se deseneze un pătrat (centrul pătratului diferit de centrul ecranului) şi apoi să se realizeze simetricul lui faţă de dreapta xy = şi xy −= . 2. Să se transleze grupul celor patru avioane din exemplul 3 atfel încât centrul figurii grupului celor patru avioane să descrie circumferinţa unui cerc cu centrul în centrul ecranului. Cel de-al cincilea avion se va roti tot timpul în jurul grupului celor patru avioane.