Sunteți pe pagina 1din 11

Transformri grafice bidimensionale (2) 1.

Transformarea de vizualizare 2D
Desenele produse cu ajutorul calculatorului sunt descrise, de obicei, ntr-un sistem de coordonate diferit de acela n care sunt raportate pe suprafaa de afiare. Sistemul n care sunt descrise desenele se numete sistem de coordonate (SC) logice sau sistem de coordonate utilizator sau sistem de coordonate universale sau sistem de coordonate al lumii reale (WCS World Coordinate System). Sistemul de coordonate din spaiul de afiare se numete sistem de coordonate dispozitiv sau sistem de coordonate fizice. Transformarea din sistemul de coordonate logice 2D, n care este descris obiectul, n sistemul de coordonate fizice (din spaiul de afiare) se numete transformare de vizualizare 2D. Mulimea punctelor adresabile ale suprafeei de afiare este finit, n timp ce mulimea punctelor spaiului 2D n care este construit desenul este infinit. Pentru a fi posibil formularea matematic a transformrii de vizualizare 2D, este necesar s se limiteze mulimea punctelor spaiului logic care se pun n coresponden cu punctele suprafeei de afiare. Considerm un dreptunghi cu laturile paralele cu axele sistemului de coordonate logice, numit fereastr. Fiecrui punct din fereastr i se pune n coresponden prin transformarea de vizualizare 2D un punct al suprafeei de afiare. Zona dreptunghiular din spaiul de afiare, corespunztoare ferestrei din sistemul de coordonate logice, se numete poart de afiare sau pe scurt poart (fig. 2.1). Din aceast cauz, transformarea de vizualizare se mai numete i transformare fereastr-poart.

SC logice 1

SC dispozitiv
(400,400)

-1 Fereastr (n WCS)

(100,100)

Poarta de afiare (n spaiul de afiare)

Fig. 2.1

Considerm mai nti aceeai orientare a axelor celor dou SC. Fie F ( x f , y f ) un punct din
fereastr i P( x p , y p ) punctul corespunztor din poart. Transformarea fereastr-poart este

Lucrarea 2 definit astfel nct poziia relativ a punctului P n poart s fie aceeai cu poziia relativ a punctului F n fereastr (fig. 2.2).

SC - WCS
yp x fM , y fM F(x f , y f ) x fm , y fm
O

SC - fizice
x pM , y pM P( x p , y p ) x pm , y pm

xp

Fig. 2.2 Transformarea fereastr-poart

Matematic, aceast condiie se formuleaz astfel: x p x pm x pM x pm = x f x fm x fM x fm , , (2.1) (2.2)

y p y pm y pM y pm

y f y fm y fM y fm

unde: ( x fm , y fm ) , ( x fM , y fM ) - reprezint colurile stnga-jos (minim), respectiv dreapta-sus (maxim) ale ferestrei, iar ( x pm , y pm ) , ( x pM , y pM ) colurile corespunztore ale porii. Notm cu: x p x pM x pm , (2.3) sx = = x fM x fm x f

sy =

y p y f

y pM y pm y fM y fm

(2.4)

Atunci relaiile (2.1) i (2.2) devin:


x p = x f s x + x pm x fm s x y p = y f s y + y pm y fm s y

(2.5)

Notnd cu:

t x = x pm x fm s x t y = y pm y fm s y

(2.6)

putem scrie:
x p = x f sx + tx yp = y f sy + ty

(2.7)

Relaiile (2.5) i (2.7) reprezint formulele de transformare fereastr-poart cnd sistemele de coordonate au aceeai orientare a axelor. Exprimm formulele de transformare fereastr-poart, matricial, n coordonate omogene. Putem scrie:
P = T * S * F = Mv * F

(2.8)

x p 1 0 t x s x 0 0 x f y = 0 1 t * 0 s y y 0 * y f p 0 0 1 0 0 1 1 1 14 24 3 142 4 43 4
T S

(2.9)

i deci matricea transformrii de vizualizare 2D este:

s x Mv = 0 0

0 sy 0

tx ty . 1

(2.10)

Observaie: nti se realizeaz scalarea i apoi translaia T * S S * T .


Cazuri particulare

a) Cazul n care nu exist translaie, t x = t y = 0 ( x fm = 0 , y fm = 0 , x pm = 0 , y pm = 0 ) (fig. 2.3).


y y

F
O

P
x
O

Fereastr

Poart (vizor)

b) Cazul t x = x pm , t y = y pm ( x fm

Fig. 2.3 = 0 , y fm = 0 ) (fig. 2.4)

Lucrarea 2

P F

x pm , y pm
O

Fereastr

x
Fig. 2.4

Poart (vizor)

c) Cazul n care sistemul de coordonate al ecranului are originea n colul stnga-sus (axa y este n jos). n acest caz aplicnd formulele (2.7) desenul definit n fereastr va fi rsturnat n poart (fig. 2.5).
y O

x
P

y pm
F

y pM
O

x Fig. 2.5

Pentru ca desenul s nu fie rsturnat n poart trebuie s avem situaia din fig. 2.6.
y O

x
P

y pm
F

y pM
O

x Fig. 2.6

Prin urmare, coordonata y p trebuie s se modifice astfel:


y p = y pM + y pm ( y f s y + t y ) = y pM + y pm y f s y y pm + y fm s y .

n concluzie, pentru ecran vom avea:


x p = x f sx + t x y p = y pM y f s y + y fm s y

(2.11)

Observaie: Cnd fereastra i poarta nu sunt asemenea are loc o deformare a obiectelor afiate n poart. n unele aplicaii se dorete deformarea, n altele nu. Dac nu se dorete deformarea se calculeaz s x i s y i se alege valoarea minim, astfel nct scalarea s fie uniform. s = min( s x , s y ) .
(2.12)

n acest caz zona definit de fereastr ocup zona din stnga a porii (fig. 2.7b) sau zona de jos a porii (fig. 2.7c).
s y < sx s y > sx

P F P

x
a)

x
b)

x
c)

Fig. 2.7

Dac dorim ca imaginea s apar centrat n poart, putem avea cazurile (considernd aceeai orientare a axelor) din fig. 2.8 sau fig. 2.9:
y x fM , y fM y

( x fM x fm ) s x

x pM , y pM
P

x fm , y fm
O

x pm , y pm

x
Fereastr

x
Poart

Fig. 2.8

Lucrarea 2

y y x fM , y fM

x pM , y pM ( y fM y fm ) s y

F x fm , y fm
O

x pm , y pm

Fereastr

x
Fig. 2.9

x
Poart

n aceste cazuri relaiile de transformare fereastr-poart devin:


x p = x f sx + tx + y p = y f sy + ty + x pM x pm ( x fM x fm ) s x y pM 2 y pm ( y fM y fm ) s y 2 (2.13)

n cazul ecranului, axa y fiind n jos (fig.2.10), rezult:


y O x fM , y fM

x x pm , y pm P
x pM , y pM

F x fm , y fm
O

x
Fig. 2.10 x p = x f sx + t x

y p = y pM + y pm y f s y + t y unde

(2.14)

t x = x pm x fm s x + t y = y pm y fm s y +

x pM x pm ( x fM x fm ) s x y pM 2 y pm ( y fM y fm ) s y 2 (2.15) .

Observaii: 1) Dac se folosete funcia setviewport(xpmin, ypmin, xpmax, ypmax, decup), originea sistemului de coordonate al ecranului este considerat a fi punctul (xpmin, ypmin). n consecin, din formulele (2.14) se va scdea xpmin din prima i ypmin din a doua. 2) n cazul ecranului se pot folosi formulele (2.5) i (2.13), care sunt determinate pentru aceeai orientare a axelor, i apoi se efectueaz o rotaie cu pentru a nu obine imaginea rsturnat.

2. Aplicaii
Exemplul 1

S se creeze un pachet de funcii pentru transformarea fereastr-poart i s se exemplifice prin trasarea graficului a patru funcii oarecare, de exemplu: tan x , sin(10 x) , x sin(10 x ) , ( x 2 2)( x + 3) . Graficul unei funcii se va aproxima printr-o polilinie. y = f ( x) .
Indicaii. Secvena de program prin care se afieaz graficul unei funcii y = f ( x ) aproximndu-l printr-o polilinie cuprinde paii urmtori: (1) - se stabilesc coordonatele porii de afiare x pm , y pm , x pM , y pM ;

(2) - se stabilesc capetele intervalului x fm , x fM n care se dorete afiarea graficului i numrul de puncte de pe grafic, np , care urmeaz s fie calculate; (3) se calculeaz lungimea subintervalelor n care va fi divizat intervalul
pas = x fM x fm np ;

(x fm , x fM ) :

(4) - se calculeaz valoarea minim i maxim a funciei n intervalul x fm , x fM ; (5) se calculeaz scalarea i translaia necesare pentru transformarea fereastr-poart: (6) se traseaz graficul, efectund transformarea fereastr-poart asupra fiecrei coordonate transmise funciei DrawLine. Se vor defini cteva funcii utilizabile n orice program scris n CPP pentru efectuarea transformrii fereastr-poart. tiptran prin care programatorul va specifica dac dorete ca transformarea s nu produc deformarea desenului definit n fereastr; Xdisp i Ydisp care efectueaz transformarea fereastr-poart asupra punctelor desenului. calctran calculeaz factorii de scalare i cantitile t x i t y
cadru_poarta traseaz marginea porii cadru_fereastra traseaz marginea ferestrei grafic realizeaz trasarea graficului funciei.

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. Dup completarea programului se va analiza scalarea uniform i neuniform.

Lucrarea 2
float XFm, XFM, YFm, YFM; int XPm, XPM, YPm, YPM; int tip_tran; float sx, sy, tx, ty; public delegate float MyFuncPtrType(float );

void init_grafic() { XPm = 0; YPm = 0; XPM = 0; YPM = 0; XFm = XFM = YFm = YFM = 0; // 0 scalare neuniforma; 1 - scalare uniforma tip_tran = 0; sx = sy = tx = ty = 0; } void calctran() { if(XFM > XFm && YFM > YFm) { sx = .... sy = .... if(tip_tran) sx = sy = (sx < sy)? sx:sy; tx = .... ty = .... } else sx = sy = tx = ty = 0; } void tiptran(int tip) { tip_tran=tip; calctran(); } int Xdisp(float xf) { .... } int Ydisp(float yf) { .... } void cadru_fereastra(Graphics ^g) { // traseaza marginea ferestrei Pen ^p = gcnew Pen(Color::Green); g->DrawRectangle(....); } void cadru_poarta(Graphics ^g) { // traseaza marginea portii

//scalare uniforma

.... } float f1(float x) { return (float)Math::Tan(x); } float f2(float x) { .... } float f3(float x) { ....} float f4(float x) { ....} void grafic(Graphics ^g, float xmin, float xmax, float pas, MyFuncPtrType ^f) { float x,y; //se determina incadrarea graficului .... //se calculeaza valoarea minima/maxima a functiei //pentru determinarea ferestrei (XFm, YFm, XFM, YFM) .... //se traseaza axele de coordonate daca (0,0) apartine ferestrei Pen ^p = gcnew Pen(Color::Blue, 1); if((XFm<0)&&(0<XFM)&&(YFm<0)&&(0<YFM)) { //se traseaza axele //axa x .... //axa y .... } //se traseaza graficul functiei f p->Color = Color::Red; for(x = xmin; x < xmax - pas; x += pas) .... } void text(Graphics ^g, String ^s) { g->DrawString(s, gcnew Drawing::Font("Arial", 12), Brushes::Black, XPm, YPM+8); } private: System::Void On_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) { int xmaxe, ymaxe, stg=50, drt=50; float pas=0.1; init_grafic();

Lucrarea 2
Rectangle rect = this->ClientRectangle; xmaxe = rect.X + rect.Width; ymaxe = rect.Y + rect.Height; Graphics ^g = e->Graphics; //tiptran(1); //poarta XPm=2*stg; YPm=stg; XPM=xmaxe/2-drt/2;

YPM=ymaxe/2-drt/2;

MyFuncPtrType ^delFunc = gcnew MyFuncPtrType(this, &Form1::f1); grafic(g, -5, 5, pas, delFunc); text(g, "tan(x)"); //functia f2 .... //functia f3 .... //functia f4 .... } };

Rularea programul anterior, are ca rezultat imaginea din figura 2.11.

10

Fig. 2.11 Graficele a patru funcii reprezentate n patru pori diferite

Problem propus

1. S se nlocuiasc aproximarea graficului unei funciei printr-o polilinie, aproximare realizat n problema 1, cu trasarea pixel cu pixel a graficului. Pasul va fi ajustat astfel nct graficul s fie continuu i nu prin puncte (cazul funciilor cu pant forte mare pe anumite poriuni). Indicaie. Pentru a trasa graficul pixel cu pixel se va utiliza un obiect de tip Bitmap. n acest caz trebuie avut n vedere c originea sistemului de coordonate este n colul stnga sus al imaginii Bitmap.

11