Documente Academic
Documente Profesional
Documente Cultură
x′ = x + d
, (1.1)
y′ = y
y y′ y
P( x, y ) P ′( x ′, y ′) P ′( x ′, y ′)
d d
O x O′ O x
a) b)
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,
( x ′, y ′) sunt coordonatele punctului care rezultă din transformarea lui P . Cea de-a doua
interpretare corespunde unei transformări a sistemului de coordonate, ( x ′, y ′) 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
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), ( x1 , y1 ) , ( x2 , y 2 ) , ş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:
r r r
v = tx i + t y j . (1.2)
Dacă ( x, y ) sunt coordonatele unui punct P al unui obiect, atunci prin translaţia obiectului cu
r r
o distanţă egală cu mărimea vectorului v , în direcţia vectorului v , punctul P se transformă în
P ′( x ′, y ′) (fig. 1.2), unde x ′ şi y ′ sunt definite astfel:
y r P ′( x ′, y ′)
v
ty
tx
P ( x, y )
x
O
Figura 1.2
x' = x + t x
. (1.3)
y' = y + t y
Exemplu:
r r
r r
v = 2i + j , P = (5, 5) . Prin translaţia lui P cu vectorul v se va obţine punctul P ′ = (7, 6) .
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.
x' = s x ⋅ x
(1.4)
y' = s y ⋅ y
Dacă s x = s y , 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) , (3,1) , (3,3) , (1,3) (fig. 1.3a). Prin scalarea faţă de
origine cu factorii s x = 2 , s y = 3 se va obţine dreptunghiul cu vârfurile: (2,3) , (6,3) , (6,9) ,
(2,9) (fig. 1.3b).
Se consideră F ( x f , y f ) punctul din plan faţă de care se face scalarea unui punct P( x, y ) .
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 s x , s y înseamnă scalarea
vectorului FP . Componentele vectorului scalat FP ′ sunt:
(
x'− x f = s x ⋅ x − x f )
= s y ⋅ (y − y f )
.
y '− y f
x' = x ⋅ s x + x f − x f ⋅ sx
. (1.5)
y' = y ⋅ s y + y f − y f ⋅ s y
y y 2,6 4,6 y
1,4 3,4
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 P ′( x ′, y ′) , 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:
x = r cosθ
, (1.6)
y = r sin θ
x′ = r cos (α + θ )
, (1.7)
y′ = r sin (α + θ )
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:
x′ = x cos α − y sin α
. (1.8)
y′ = x sin α + y cos α
y y P ′( x ′, y ′)
P ′( x ′, y ′)
r
α P( x, y )
r P ( x, y )
α
θ F(x f , y f )
O x O x
a) b)
Figura 1.4
Fie P( x , y ) punctul din plan care se roteşte în jurul unui punct F ( x f , y f ) . 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 FP ′ (fig. 1.4b):
x′ − x f = ( x − x f ) cos u − ( y − y f ) sin u
. (1.9)
y′ − y f = ( x − x f ) sin u + ( y − y f ) cos u
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 x f , respectiv y f . Din relaţiile (1.9) rezultă:
Î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 P = [ x, y ] sau
vectori coloană P T = [x y ]T . 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 M T .
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
x ′ s x 0 x
y ′ = 0 ⇔ P′ = S P , (1.12)
s y y
x ′ cos α − sin α x
y ′ = sin α ⇔ P′ = R P , (1.13)
cos α y
cos α sin α
[x ′, y ′] = [x, y ] . (1.14)
− sin α cos α
Coordonate omogene
a y−bx =0 (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 P ( 2,1) în coordonate plane carteziene, devine în coordonate omogene (2,1,1) sau
(4,2,2), etc.
În grafică se utilizează w = 1 , ceea ce înseamnă că:
Translaţia
x ′ 1 0 t x x
y ′ = 0 1 t y ⇔ P′ = T P , (1.18)
y
1 0 0 1 1
unde
x x ′ 1 0 t x
P = y , P ′ = y ′ , T = 0 1 t y , (1.19)
1 1 0 0 1
x ′ s x 0 0 x
y ′ = 0 sy 0 y ⇔ P' = S P , (1.20)
1 0 0 1 1
sx 0 0
S = 0 sy 0 . (1.21)
0 0 1
x ′ cos α − sin α 0 x
y ′ = sin α cos α 0 y ⇔ P' = R P , (1.22)
1 0 0 1 1
cos α − sin α 0
R (α ) = sin α cos α 0 . (1.23)
0 0 1
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 F ( x f , y f ) punctul fix al transformării, α unghiul de rotaţie şi s x , respectiv s y
factorii de scalare.
x ′ 1 0 x f s x 0 0 1 0 − x f x
y ′ = 0 1 y ⋅ 0 sy 0 ⋅ 0 1 − y f ⋅ y
f
1 0 0 1 0 0 1 0 0 1 1
(1.25)
Observaţie:
x ′ 1 0 x f s x 0 − sx x f x
y ′ = 0 1 y f ⋅ 0 s y − s y y f ⋅ y =
1 0 0 1 0 0 1 1
sx 0 − s x x f + x f x x sx + x f − sx x f
= 0 sy − s y y f + y f ⋅ y = y s y + y f − s y y f ,
0 0 1 1 1
adică am obţinut relaţiile (1.5).
P ′ = T ( x f , y f ) ⋅ R(α ) ⋅ T ( − x f ,− y f ) ⋅ P (1.26)
x ′ 1 0 x f cos α − sin α 0 1 0 − x f x
y ′ = 0 1 y f ⋅ sin α cos α 0 ⋅ 0 1 − y f ⋅ y
1 0 0 1 0 0 1 0 0 1 1
(1.27)
y y
O x O x
a) b)
O x
c)
Figura 1.5
x ′ − 1 0 0 x
x′ = − x y ′ = 0 1 0 ⋅ y ,
,
y′ = y
1 0 0 1 1
− 1 0 0
O y = 0 1 0 (1.32)
0 0 1
x ′ − 1 0 0 x
x′ = − x y ′ = 0 − 1 0 ⋅ y ,
,
y′ = − y
1 0 0 1 1
− 1 0 0
Oo = 0 − 1 0 (1.33)
0 0 1
P( x, y )
b
−b a
O x
De exemplu, coordonatele punctului P ′( x ′, y ′) din figura 1.6, care este simetricul lui P ( x, y )
faţă de dreapta y = ax + b , sunt date de P′ = M ⋅ P .
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:
T1 ⋅ T2 = T2 ⋅ T1 ,
R1 ⋅ R2 = R2 ⋅ R1 , (1.35)
S1 ⋅ S 2 = S 2 ⋅ S1 .
x′ = x − t x
⇔ P ′ = TC ⋅ P (1.36)
y′ = y − t y
1 0 − t x
TC (t x , t y ) = 0 1 − t y (1.37)
0 0 1
y y′
P( x, y ) y
P( x ′, y ′)
P( x, y )
y′
P ′( x ′, y ′)
O′ x′
v x′ α
tx
θ
O tx x O, O ′ x
a) b)
Figura 1.7
Fie sistemul x ′O ′y ′ 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:
x = r cos α
, (1.39)
y = r sin α
iar în sistemul x ′O ′y ′ :
x ′ = r cos(α − θ )
. (1.40)
y ′ = r sin(α − θ )
cos θ sin θ 0
RC (θ ) = − sin θ cos θ 0 . (1.42)
0 0 1
2.3. Scalarea
1
x′ = x ⋅ , y, y ′
sx
(1.44)
1 P′(1,2)
y′ = y ⋅ , •
sy P (100,200)
O, O ′ x, x ′
Fig. 1.8
iar matricea transformării de coordonate:
1 0 0
sx
SC ( s x , s y ) = 0 1 0 . (1.45)
sy
0 0 1
Se observă că
[ ]
SC ( s x , s y ) = S 1 , 1 = S ( s x , s y ) −1 (1.46)
sx sy
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
apelând funcţia DrawLine. Funcţia init_obiect calculează coordonatele vârfurilor pătratului în
poziţia sa iniţială.
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 n = 10 .
int N;
Graphics ^g=e->Graphics;
//suprafata de desenare
Rectangle rect = Form::ClientRectangle;
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.
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;
N = 10;
//culoarea de desenare
Drawing::Pen ^myPen = gcnew Pen(Color::Black);
//culoarea fondului
g->Clear(Color::Beige);
//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}};
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];
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
pătrat (centrul pătratului diferit de centrul ecranului) şi apoi să se realizeze simetricul lui faţă
de dreapta y = x şi y = − x .
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.