Sunteți pe pagina 1din 20

Capitolul 4

Transformari Grafice

4.1 Descrierea generala a transformarilor grafice


O transformare grafica este o functie T:RnRk, unde n{2,3}, kn.
O clasa principala de transformari grafice nD sunt transformarile liniare, functii
T:RnRn, care au proprietatea ca: T(v+w)=T(v)+T(w), pentru R, si v, w
vectori din Rn. Transformarile liniare pastreaza liniile drepte (in general transforma
orice curba de clasa C1 tot intr-o curba de clasa C1), si lasa originea nemodificata (i.e.
T(0)=0).

Transformarile liniare v=T(u) in spatiul Rn pot fi scrise sub forma:


v=M*u (4-1)

unde M este o matrice nxn, u este in vector (reprezentat printr-un vector coloana

in spatiul Rn iar v este un vector in spatiul Rn care rezulta prin transformarea lui u.
Relatia (4-1) descrie o transformare matriceala. In Rn, oricarei transformari liniare T ii
corespunde biunivoc o matrice M a.i. T(u)=M*u=TM(u).

Daca T este o transformare continua, in spatiul nD, care pastreaza liniile drepte, se
poate defini transformarea prin si va rezulta o transformare
care pastreaza liniile drepte si lasa neschimbata originea, o astfel de transformare este
reprezentabila matriceal, folosind o matrice Mnxn.

Compunerea a doua transformari liniare de matrici M respectiv K este transformarea


de matrice M*K
Functia compusa este TMTk : RnRn definita prin x TM(Tk(x)) unde xRn
Descrierea matriceala a functiei compuse este
TM(Tk(x))=M*(K*x)=(M*K)*x=TMK(x), ordinea de inmultire a matricelor care
corespund unei transformari compuse (M*K) corespunde (de la dreapta la stanga)
ordinii de aplicare transformarilor. Aceasta ordine de inmultire se datoreaza faptului
ca inmultirea matricilor de transformare cu vectorii (coloana) se face pe dreapta
(inmultirea de matrici nu este in general comutativa).
De asemeni in cazul unei matrici inversabile M, transformarea TM-1(x) este inversa
transformarii TM(x).

4.2 Transformari grafice in spatiul 2D


4.2.1 Transformari elementare 2D

In spatiul 2D transformarile grafice elementare, prin a caror compunere un obiect 2D


(o) poate fi transformat intr-un alt obiect (o) situat oriunde in plan, cu orice orientare
si cu orice marime sunt:
translatia, care asociaza unui punct P punctul P , este definita prin:

= + , unde este vectorul asociat transformarii de translatie (el


exprima un deplasament).

Rotatia in jurul originii, in planul 2D (planul xOy cu un sistem de coordonate definit


prin origine si o baza ortonormala notata (i,j) sau (e1,e2)), cu un unghi (masurat in
sensul trigonometric pozitiv al rotatiei lui i peste j) este definita prin:

= (4-2)

Figura 4.1

Demonstratie:
Folosind marimile din figura 4.1

x=r*cos(+)=r*cos()*cos() r*sin()*sin() = x*cos() y*sin()


y=r*sin(+)=r*sin()*cos()+r*cos()*sin()=x*sin() + y*cos()

scalarea de factori sx, sy (ce corespund axelor Ox respectiv Oy) asociaza


P P
unde x=sx*x, y=sy*y sau matriceal
=
daca sxsy scalarea se zice neuniforma/anizotropica. Aplicand aceasta transformare
tuturor punctelor unui obiect (o), obiectul transformat (o) va fi deformat fata de (o).
Daca sx=sy (scalare uniforma, transformare izotropa) obiectul rezultat prin
transformare (o) va fi asemenea lui (o).

Observatie: Transformarile de rotatie si scalare sunt transformari liniare (au scriere


matriceala M*x) dar translatia nu este liniara (nu pastreaza neschimbata originea).
Intr-adevar Translatia care e diferita de origine in cazul unui vector de
translatie nenul.
Aceasta observatie arata ca o transformare oarecare, in spatiul 2D, (rezultata prin
compunerea de translatii, rotatii si scalari) nu poate fi scrisa matriceal in spatiul 2D si
nu se poate calcula matricea transformarii compuse, ca produs al matricelor
transformarilor elementare (cum ar fi de dorit pentru comoditatea calculelor)

Pentru a exprima toate transformarile elementare 2D prin transformari liniare, se


recurge la urmatorul artificiu: punctele spatiului 2D sunt reprezentate ca puncte ale
unui plan din spatiul 3D. Aceasta reprezentare se numeste reprezentare omogena a
spatiului 2D. Acest procedeu se poate generaliza la spatiul nD. Astfel daca P este
un punct al spatiului 2D, punctul care il reprezinta omogen pe P este un punct 3D de

coordonate .

In acest fel, toate punctele spatiului 2D vor corespunde punctelor planului w=1 din
spatiul 3D (am considerat un spatiu 3D avand puncte de coordonate (x,y,w)).

Figura 4.2

Unii autori mai spun ca un punct al spatiului euclidian 2D (notat E2) este reprezentat
prin vectorul de pozitie al sau, intr-un spatiu (vectorial) R3 in care E2 este scufundat.

Folosind aceasta reprezentare (omogena) transformarile elementare 2D se pot scrie ca


transformari liniare astfel:

Translatia:

Rotatia:

Scalarea:

Nu toate transformarile liniare in R3 pastreaza punctele din E2 (adica transforma un


punct din E2 in alt punct din E2). Conditia ca sa pastreze punctele din E2 se obtine
astfel:

= *

va trebui ca g*x + h*y + i = 1 pentru x,yR, aceasta inseamna ca: g=0, h=0, i=1.

Deci matricea unei transformari liniare 3D care pastreaza punctele din E2 este

Astfel de transformari, restrictionate la planul w=1 al spatiului 3D de coordonate


(x,y,w) se numesc transformari afine ale planului

Nota: diferente intre vectori (elemente ale unui spatiu vectorial) si puncte (elemente
ale unui spatiu euclidian) (vezi si egcmat)
Un vector v poate fi privit ca diferenta a doua puncte P, Q: v=Q-P (unde P
este originea vectorului iar Q este destinatia lui v).
Suma dintre un punct si un vector este alt punct: P+v=P+(Q-P)=Q.
Suma sau diferenta de vectori este definita ca suma element cu element a

fiecarei componente a vectorilor v + w = + =

Suma a doua puncte nu este definita; se poate defini o combinatie afina a


doua puncte (*P+*Q, cu ,R, +=1) (vezi egcmat) care este tot un
punct.

In cazul punctelor din E2 reprezentate omogen,

un vector din E2 este diferenta a doua puncte: v=Q-P= - =

Deci reprezentarea omogena a unui vector din E2 este o tripleta .

Suma dintre un punct si un vector este

P+v = + = , adica reprezinta un punct

Suma a doua puncte din E2 + = , nu reprezinta un punct din E2

Combinatia afina a doua puncte din E2 (reprezentarile lor in spatiul omogen) este

P+Q = + = , adica tot un punct

Transformarile afine sunt cele mai folosite in grafica pe calculator. Clasa


transformarilor afine 2D include clasa transformarilor liniare 2D.

Alte transformari afine (care sunt si liniare) sunt

Forfecarile 2D (shear):

Forfecarea fata de axa Ox

SHx = , figura

Forfecarea fata de axa Oy

SHy =

Oglindirile/simetriile elementare 2D:


Oglindirea fata de axa Ox OglOx = (transformare n.p.o.r.)

Oglindirea fata de axa Oy OglOy= (transformare n.p.o.r.)

Oglindirea fata de origine OglO=R()= (transformare (p.o.r.)

4.2.2 Determinarea matricei de transformare pentru o transformare


liniara oarecare 2D
O transformare 2D, liniara, oarecare (notata T) transforma un sistem de 2 vectori
liniar independenti (u1,u2) in alt sistem de vectori (v1,v2).
(u1, u2) (v1, v2)
Se considera ca, cei 4 vectori au toti originile lor in originea sistemului de coordonate
sau altfel spus nu exista translatii.
Consideram baza ortonormala a spatiului 2D (e1, e2). Daca stim ca T(e1)=v1 si
T(e2)=v2 cunoastem si matricea transformarii (e1,e2)(v1,v2). Fie transformarea
T(x,y)

T(x,y) = M* = *

T(e1 )= M* = = v1, T(e2) = M* = = v2

Deci daca cunoastem vectorii coloana v1=T(e1) si v2=T(e2) in care o transformare


liniara 2D aduce vectorii baza (e1,e2) ai spatiului 2D, matricea transformarii care
aduce sistemul de vectori (e1,e2) peste sistemul de vectori (v1, v2) este T=(v1T;v2T) (i.e.
matricea 2x2 care are ca si coloane v1 si v2).
Noi dorim sa determinam matricea transformarii liniare care transforma sistemul de
vectori (u1, u2) in (v1,v2)

Figura 4.3

Transformarea care mapeaza (e1,e2) (v1,v2) are matricea K=[v1;v2]


Transformsrea care mapeaza (e1,e2) (u1,u2) are matricea M=[u1;u2]
Prin urmare matricea T care transforma (u1,u2)(v1,v2)
este T=K*M-1. Se aplica mai intai transformarea de matrice M-1 (transformarea
(u1,u2)(e1,e2) si apoi transformarea de matrice K.(care realizeaza (e1,e2)(v1,v2)).

Exemplu:
Vom lucra folosind numai vectori din R2, nu reprezentari omogene.
Sa consideram u1= , u2=
v1 = , v2=

Matricile M, K sunt:

M= , K=

det(M)=(4*(-1))-(5*1)= -9

M-1 se calculeaza conform definitiei prezentate in egcmat: M-1==(-1/9)*

iar matricea transformarii T(u1,u2)(v1,v2) = K*M-1=

4.2.3 Exemple de determinare a transformarilor compuse 2D


O transformare afina 2D (cand nu se folosesc reprezentari omogene) este obtinuta prin
compunerea de rotatii, scalari (si eventual alte transformari liniare ale spatiului 2D)
urmate de o translatie finala.
Matricea unei transformari afine 2D (cand spatiul 2D este reprezentat omogen) se
poate scrie ca o matrice 3x3 de forma:

M3x3=

R2x2 este matricea transformarilor liniare (rotatii, scalari, forfecari) care compun
transformarea afina. Daca R2x2 corespunde numai compunerii de rotatii, ea este o
matrice ortonormala (coloanele sunt vectori unitate, ortogonali) si det(R2x2)=1. O
astfel de transformare liniara, a carei matrice satisface cele doua proprietati enuntate
mai sus se zice transformare a solidului rigid. Ea aliniaza un sistem de vectori
ortonormal, peste un alt sistem de vectori ortonormal, fara sa produca deformarea
obiectului transformat (schimba numai orientarea obiectului). In general, daca R 2x2 are
in componenta ei si forfecari, scalari sau oglindiri, ea nu corespunde unei transformari
a solidului rigid.
T2x1 este vectorul de translatie.
O tranformare afina 2D se poate calcula direct in R2 astfel:
= R2x2 * + T2x1

4.2.3.1 Determinarea transformarii de rotatie 2D cu un unghi dat, in jurul unui


punct oarecare C(xc,yc) (centru de rotatie)
Fie P un punct al obiectului care trebuie transformat. Transformarea ceruta se
obtine prin compunerea urmatoarelor transformari elementare:

translatie de vector de matrice T(-xc,-yc). Aceasta transformare aduce


centrul de rotatie in origine
rotatie de unghi in jurul originii; de matrice R(). Folosind aceasta
transformare vom roti in jurul originii in loc sa rotim in jurul unui punct
oarecare
translatie de vector de matrice T(xc,yc). Aceasta transformare aduce la
locul lui punctul C.

Matricea transformarii compuse (care realizeaza rotatia de unghi a unui punct P in


jurul unui centru de rotatie C) se obtine efectuand produsul matricelor transformarilor
elementare in urmatoarea ordine:
M=T(xc,yc,zc)*R()*T(-xc,-yc,-zc)

4.2.3.2 Transformarea de vizualizare 2D (transformarea fereastra-vizor)

De obicei desenele 2D produse cu mijloacele graficii pe calculator sunt descrise intr-


un sistem de coordonate (numit sistem de coordonate utilizator) diferit fata de
sistemul de coordonate asociat suprafetei de afisare (display-ului) (numit sistem de
coordonate fizice ecran).
De exemplu, intr-o descriere matematica, graficul functiei y=sin(x), x[0,2] va fi
cuprins intr-un domeniu dreptunghiular (x,y)[0,2]x[-1,1] (specificat in spatiul
utilizator). Reprezentarea pe ecranul display-ului a graficului sus mentionat ar putea fi
afisata in orice loc de pe suprafata ecranului, de exemplu intr-o zona dreptunghiulara
(specificata in spatiul ecran, ale carui coordonate sunt intregi si semnifica pozitii de
pixeli) [100, 100]x[200,300].
Transformarea fereastra-vizor mapeaza punctele unui dreptunghi numit fereastra
(avand laturile paralele cu axele sistemului de coordonate) situat in spatiul utilizator,
in punctele unui alt dreptunghi (din spatiul ecran) numit vizor.

Figura 4.4
Notand: , ,

Respectiv: ,

Se obtin coordonatele punctului V in functie de coordonatele punctului F

Transformarile elementare care compun transformarea de vizualizare 2D sunt scalarea


si translatia.

Iata in continuare sursa C a unui modul care implementeaza transformarea fereastra-


vizor asa cum a fost descrisa mai sus

// Fisierul ferviz.h interfata modulului


void setFereastra(double u1, double v1, double u2, double v2);
void setVizor(int x1, int y1, int x2, int y2);
int xDisp(double xF);
int yDisp(double yF);

// Fisierul ferviz.c implementarea modulului


double xFmin=0, yFmin=0, xFmax=1, yFmax=1;
int xVmin, yVmin, xVmax, yVmax;
double sx, sy, tx, ty;

void setFereastra((double u1, double v1, double u2, double v2)


// defineste doua varfuri diametral opuse ale ferestrei
{ xFmin=u1; yFmin=v1; xFmax=u2, yFmax=v2; }
void setVizor(int x1, int y1, int x2, int y2)
// defineste doua varfuri diametral opuse ale vizorului
{ xVmin=x1; yVmin=y1; xVmax=x2; yVnax=y2; }
void calc_param(void)
// calculeaza parametrii transformarilor elementare
// care compun transformarea fereastra-vizor
{ sx=(xVmax-xVmin)/(xFmax-xFmin);
sy=(yVmax-yVmin)/(yFmax-yFmin);
tx=xVmin-sx*xFmin;
ty=yVmin-sy*yFmin;
}
int xDisp(double xF)
// intoarce abscisa (din vizor) ce corespunde abscisei xF
// a unui punct din fereastra
{ return (int)(sx*xF+tx); }
int yDisp(double yF)
// intoarce ordonata (din vizor) ce corespunde ordonatei yF
// a unui punct din fereastra
{ return (int)(sy*yF+ty); }
Iata mai jos implementarea C a unei functii grafic() care traseaza graficul unei functii
f(x), f:RR, unde graficul este trasat pentru domeniul de variatie al parametrului x,
x[a,b]. Se presupune existenta unei functii line(x1, y1, x2, y2) care traseaza pe
suprafata ecranului, un vector (segment de dreapta) de extremitati (x1,y1) si (x2,y2).

#include ferviz.h

void grafic(double (*f)(double), double a, double b)


{ double ymin, ymax, h;
int i, ndiv=50;
ymin=ymax=(*f)(a);
h=(b-a)/ndiv;
// calcul de incadrare,
// se stabileste dreptunghiul minim incadrator
// al graficului functiei (in spatiul utilizator)
for(i=0; i<=ndiv; i++) {
if((*f)(a+i*h) < ymin) ymin=(*f)(a+i*h);
if((*f)(a+i*h) > ymax) ymax=(*f)(a+i*h);
}
// se stabileste fereastra ca
// dreptunghiul minim incadrator al graficului functiei
setFereastra(a,ymin,b,ymax);
// vizorul se stabileste in programul apelant
for(i=0; i<ndiv; i++)
line(xDisp(a+i*h),yDisp(a+i*h),xDisp(a+(i+1)*h),yDisp(a+(i+1)*h));
}

Nota: Iata un alt procedeu, mai matematizat, de determinare a matricei transformarii


fereastra-vizor

O transformare liniara generala in spatiul 2D este complet determinata de rezultatul


aplicarii ei asupra a doi vectori liniar independenti.
O transformare afina generala (care contine si translatii) in spatiul 2D este complet
determinata de rezultatul aplicarii ei asupra unui cadru afin in spatiul 2D (format din 3
puncte necoliniare ale spatiului 2D vezi egcmat). Daca folosim reprezentarea
omogena a punctelor din spatiul 2D, ele vor putea fi reprezentate prin 3-vectori in
spatiul omogen 3D.
Transformarea afina din spatiul 2D care aduce punctele necoliniare (P,Q,R) ale
cadrului afin 2D din spatiul E2 peste punctele necoliniare (T(P),T(Q),T(R)) (puncte ale
unui alt cadru afin al aceluiasi spatiu), corespunde unei transformari de vectori liniar
independenti din spatiul omogen 3D.
Transformarea fereastra vizor in spatiul 2D este o transformare afina care nu este si
liniara (contine si translatie). Matricea acestei transformari poate fi determinata dupa
procedeul prezentat in subcapitolul 4.2.2, aplicat de data aceasta in spatiul omogen
(3D in acest caz).
Dreptunghiul fereastra determina cadrul afin (P=(xF1,yF1), Q=(xF2,yF1), R=(xF2,yF2)) .
Dreptunghiul vizor determina catrul afin (T(P)=(xv1,yv1), T(Q)=(xv2,yv1), T(R)=(xv2,yv2)).
Matricele M, K prezentate la 4.2.2 sunt acum matrice 3x3 (matrice de transformari
liniare in spatiul omogen)

M=

K=
Transformarea fereastra-vizor (vizualizarea 2D) va fi exprimata ca o transformare
liniara, prin:

= KM-1 =

4.3 Transformari grafice in spatiul 3D


Tratarea acestor transformari se face asemanator cu tratarea transformarilor grafice
2D. Cele mai folosite transformari ale spatiului 3D sunt cele care fac parte din clasa
transformarilor afine. Acestea rezulta prin compunerea unui numar arbitrar de
transformari liniare elementare (rotatii, scalari, forfecari, oglindiri), urmate de o
translatie. Orice transformare liniara 3D admite o scriere matriceala y=M*x, unde
x,yR3 si M3x3 este matricea transformarii. O transformare afina a spatiului 3D se
poate scrie sub forma: y=M3x3*x+T3x1, unde x,yR3 sunt reprezentati prin vectori
coloana.
Pentru a descrie transformarile afine ca transformari liniare se adopta urmatoarea
tehnica, spatiul 3D se scufunda intr-un spatiu 4D (numit spatiu omogen). Spatiul
euclidian 3D (de coordonate (x,y,z)) se reprezinta prin hiperplanul w=1 al spatiului

omogen 4D (de coordonate (x,y,z,w)). Un punct P din spatiul 3D (numit si spatiul

euclidian E3) se reprezinta vectorul sau de pozitie din spatiul omogen.

Orice transformare afina a spatiului E3 se reprezinta printr-o transformare liniara a


spatiului omogen 4D, de matrice

M4x4 =

Iata matricile M3x3 corespunzatoare unor transformari liniare elementare ale spatiului
3D, respectiv M4x4 corespunzatoare descrierii acelorasi transformari in spatiul omogen
4D.

Scalarea de factori sx, sy, sz pe cele trei axe: se poate reprezenta direct in spatiul 3D
prin matricea:

S(sx, sy, sz) =


iar in spatiul omogen se poate reprezenta prin matricea:

Translatia de vector t= nu se poate reprezenta printr-o matrice 3x3 care sa opereze

direct in spatiul 3D dar se poate reprezenta printr-o matrice 4x4 ce corespunde unei
transformari liniare a spatiului omogen

T(tx, ty, tz)=

In spatiul omogen se poate scrie:

= T(tx,ty,tz)*

exprimand coordonatele punctului transformat in spatiul 3D se obtine: x=x+tx;


y=y+ty; z=z+tz

Exista trei forfecari elementare, cate una dupa fiecare din planele de coordonate xOy,
yOz, zOx. Forfecarile in spatiul 3D sunt transformari liniare; matricele
corespunzatoare M3x3 sunt cele din colturile din stanga sus ale matricelor omogene
corespunzatoare.

SHxOy(shx,shy) =

SHyOz(shy,shz) =

SHzOx(shz,shx) =

In spatiul 3D exista trei categorii de oglindiri/simetrii elementare. Oglindirea este o


transformare liniara. Matricile 4x4 ce corespund transformarilor elementare de
oglindire in spatiul E3 sunt:

Oglindiri fata de unul din planele de coordonate (transformari n.p.o.r.):


OglxOy=

OglyOz=

OglzOx=

Oglindiri fata de una din axele de coordonate (transformari p.o.r.):

OglOx=Rx()=

OglOy= Ry()=

OglOz= Rz()=

Oglindirea fata de origine (transformare n.p.o.r.):

OglO=

4.3.1 Studiul rotatiilor in spatiul 3D

Rotatiile 3D sunt transformari liniare ale spatiului 3D. Exista 3 transformari


elementare de rotatie (nu numai una (rotatia in jurul originii) ca in cazul 2D). Rotatiile
elementare 3D sunt caracterizate de axa in jurul careia se face rotatia (sau, echivalent
de planul in care se desfasoara rotatia). Rotatia specificata relativ la un plan se poate
generaliza la cazul Rn, rotatia ralativ la o axa (normala la planul de rotatie) se
utilizeaza numai in cazul R3. Produsul vectorial (cross product) axb:R3R3 nu este
generalizabil in cazul Rn (n>3).
Iata cele trei transformari elementare de rotatie:

Transformarea de rotatie in jurul axei Oz (in planul xOy), cu unghi , descrisa in


spatiul omogen este:
Rz()=Rxy()=

Analog se definesc

Ry()=Rzx()=

Rx()=Ryz()=

Matricile (M) corespunzatoare rotatiilor elementare sunt ortogonale si au det(M)=1,


astfel de matrici au proprietatea M-1=MT. Multimea tuturor transformarilor de rotatie
din spatiul 3D (numite transformari generale de rotatie) care pastreaza originea (i.e.
sunt transformari liniare, fara translatii) formeaza un grup in raport cu compunerea
transformarilor. Acest grup este cunoscut in matematica drept grupul SO(3) al
rotatiilor (SO vine de la Special Orthogonal i.e. transformari ortogonale cu
det(M)=1 iar 3 de la 3D).
Se demonstreaza ca multimea SO(3) este tri-dimensionala i.e. exista o corespondenta
biunivoca (numita parametrizare) intre punctele unei regiuni compacte, marginite 3D
si elementele lui SO(3).

4.3.1.1 Parametrizarea lui Euler a unei transformari generale de rotatie

O astfel de corespondenta este numita si parametrizarea unei rotatii generale folosind


unghiurile lui Euler. O rotatie oarecare (de matrice M) poate fi exprimata prin
compunerea a 3 rotatii elementare. Se poate scrie:

M=Ryz()*Rzx()*Rxy()=Rx()*Ry()*Rz()

Exista factorizari si in alte ordini (de exemplu Ry*Rz*Rx) sau factorizari cu numai doi
factori.
Daca consideram un obiect definit relativ la un sistem ortogonal de axe avand
originea in centrul obiectului, unghiurile parametru pot fi explicate astfel: (roll
unghi de rotatie in jurul axei fata-spate) , (yaw unghi de rotatie in jurul axei
verticale) si (pitch unghi de rotatie in jurul axei care traverseaza lateral obiectul).
Aceste trei unghiuri se numesc unghiurile lui Euler.

4.3.1.2 Calculul matricei M3x3 a unei rotatii generale in functie de rotatiile din
parametrizarea lui Euler.

Determinarea matricei M cand se cunosc unghiurile lui Euler.


M= * *

(4-3)

Determinarea unghiurilor lui Euler care corespund unei rotatii generale


reprezentate prin matricea M3x3.

Pentru a determina valorile unghiurilor , , care corespund unei unei transformari


de rotatie generale, specificata de matricea M (intr-un fel sa determinam inversa
corespondentei (,,)M) se porneste de la elementele lui M din relatia (4-3). Se
observa ca:

=arcsin(M13), unghiul intors de functia arcsin():[-1,1][-/2,/2], va avea


cos()0.

daca cos()0 rezulta:


=atan2(-M12,M11) unde tg()=-M12/M11
=atan2(-M23,M33)
functia double atan2(double y, double x); intoarce un unghi in radiani (format
de vectorul (x,y) cu semiaxa Ox pozitiva) egal cu arcul a carui tangenta este y/x,
punand unghiul in cadranul corect. Algoritmul care implementeaza atan2() este
asemanator cu algoritmul functiei unghi_polar() prezentat in egccg.

Daca cos()=0, unghiurile si nu au valori unice (de aceea am pus cuvantul inversa
intre ghilimele), daca alegem =0 (sin()=0) rezulta =atan2(M32,M22)

4.3.1.3 Parametrizarea (axa, unghi) a unei transformari generale de rotatie

O alta descriere a unei transformari generale de rotatie in spatiul 3D este exprimarea


ei ca o rotatie in jurul unei axe oarecare din spatiul 3D avand orientarea data de un
vector unitate (rotatie efectuata intr-un plan perpendicular pe ). Unghiul de rotatie
va fi notat . Aceasta descriere a unei rotatii generale este folosita in functia rotate() a
bibliotecii glm sau in glRotate3d() folosita in OpenGl 1.1.
Calculul matricei M a unei transformari de rotatie specificata prin si se face
astfel:
Se determina matricea

J = (4-4)

care corespunde transformarii liniare f:R3R3 care asociaza v


x v

M=I3x3 + sin()J + (1-cos())J2 (4-5)

Formula (4-5) este cunoscuta in literatura ca formula lui Jacobi.

Transformarea liniara reprezentata de M3x3 este, (in cazul aplicarii pe un vector v


perpendicular pe ):

x v + cos()v
M*v=sin()

Efectuand calculele din membrul drept al relatiei (4-5), obtinem mai intai:

J2 =

iar apoi valoarea lui M

vectorul este un vector unitate i.e. x2+y2+z2=1

Calculand urma matricei M (suma elementelor de pe diagonala principala a matricei


M, notata tr(M)) se obtine:

tr(M)=1+2cos() de unde rezulta cos()=(tr(M)-1)/2

daca =0, se poate lua arbitrar.


daca = rezulta (cos()= -1, sin()=0) si M=

in acest ultim caz, aplicarea de doua ori a transformarii M corespunde unei rotatii cu
unghiul 2 adica transformarii identitate M2=I. In acest caz se poate lua ca vector
(axa de rotatie) orice coloana nenula a matricei M.

daca sin()0 se calculeaza M-MT=I3x3 + sin()J + (1-cos())J2 (I3x3T+ sin()JT +


(1-cos())(J2)T)=2sin()J
adica J=(M-MT)/(2sin())
din relatia (4-4) se pot deduce valorile lui x, y si z.

4.3.1.4 Reprezentarea rotatiilor generale folosind quaternioni

Quaternionii au fost descoperiti in 1843 de sir William Hamilton, (ca o extensie a


numerelor complexe) si introdusi in 1985 de Ken Shoemake in domeniul graficii pe
calculator. Quaternionii sunt o metoda eficienta pentru a specifica transformari
geometrice, in special rotatii.
Pe parcursul acestui subcapitol, vom nota ca de obicei scalarii cu caractere normale,
vectorii cu caractere ingrosate (bold), dar unitatile imaginare cu caractere inclinate
(italic).

Un quaternion este un vector cu 4 componente.


=(qv, qw) = (qx, qy, qz, qw) = iqx+jqy+kqz+qw, unde qv=iqx+jqy+kqz=(qx,qy,qz) este
partea imaginara a quaternionului iar qw este partea reala a quaternionului. i,j,k sunt
unitati imaginare (asemanatoare lui i din corpul numerelor complexe) care satisfac
urmatoarele reguli de calcul: i2=j2=k2= -1; jk= -kj=i; ki=-ik=j; ij= -ji=k. In cazul lui qv
se pot utiliza operatiile normale cu vectori din R3: adunarea, inmultirea cu un scalar,
produsul scalar (dot product), produsul vectorial (cross product).

Inmultirea a doi quaternioni produce urmatorul rezultat:


= (iqx+jqy+kqz+qw)(irx+jry+krz+rw)= i(qyrz- qzry + rwqx + qwrx)+j(qzrx-
qxrz+rwqy+qwry) + k(qxry-qyrx+rwqz+qwrz) + qwrw qxrx qyry qzrz = (qv x rv + rwqv +
qwrv, qwrw-qvrv)

Adunarea a doi quaternioni


=(qv, qw)+(rv, rw)=(qv+rv, qw+rw)

Conjugatul unui quaternion:


=(qv, qw)*=(-qv, qw)

Norma unui quaternion:


|| ||=n( )= = =

quaternionul identitate
quaternionul invers
==>

Un quaternion unitate =(qv, qw) are proprietatea ca || ||=1. El poate fi scris ca


(sin()uq, cos()) = sin()uq + cos(), unde uq este un vector tridimensional cu
||uq|| = 1.

Se mai scrie:

Quaternionii si rotatiile

Fie clasa quaternionilor unitate, ei pot reprezenta orice rotatie 3D astfel:

Sa consideram ca cele 4 componente in coordonate omogene ale unui punct p

sunt componentele unui quaternion si sa consideram deasemeni ca avem un


quaternion unitate =(sin()uq, cos()), atunci produsul roteste quaternionul
(si implicit punctul p) in jurul axei uq cu un unghi 2. Deoarece este un quaternion
unitate,
.

Fiind dati doi quaternioni unitate si quaternionul este quaternionul unitate


ce reprezinta compunerea (concatenarea) rotatiilor reprezentate de respectiv .
Quaternionii pot fi interpretati ca puncte ale unui spatiu omogen 4D care reprezinta
orientari in acest spatiu.
Quaternionii pot codifica mai eficient decat matricele, transformarile de rotatie 3D. In
general fiind data o matrice M a unei transformari generale de rotatie (din SO(3)) se
poate determina un quaternion unitate (din S3, multimea tuturor punctelor omogene
(x,y,z,w) a caror distanta fata de origine este 1, i.e. punctele din spatiul omogen 4D
situate pe sfera unitate centrata in origine) care reprezinta aceeasi transformare de
rotatie ca si M. si invers. Aceste mapari S3SO(3) (notata (K)), respectiv SO(3)S3
(notata (R)) sunt calculate in [Hug 14], [Ebe 01], [GAKHP 94-98].
Folosind aceste mapari, de la punctele unei sfere unitate la transformari de rotatie
generale, se pot interpola transformarile de rotatie printr-un procedeu numit
interpolare liniara sferica. (slerp) (datorat lui Ken Shoemake). Fiind date doua puncte
p,qS3 se calculeaza coordonatele punctului generic (t)S3 al curbei de lungime
minima de la p la q, care face parte dintr-un cerc centrat in origine care trece prin p si
q (cerc mare al sferei unitate determinat de p, q). Lui p, q si lui (t) le corespund
quaternioni. Pornind de la quaternionul (t) se poate determina o matrice de
transformare generala de rotatie (rotatia interpolata) folosind maparea (K).

Nota: Quaternionii formeaza un spatiu care este izomorf cu spatiul multivectorilor pari
(bivectori) ai algebrei geometrice (geometric algebra, Clifford algebra) G3. Prin
urmare, calculul bazat pe quaternioni are toata puterea de calcul a unei algebre (vezi
egcmat).
4.4 Transformari 3D aplicate normalelor
Normalele la suprafata unui obiect, se comporta diferit (la aplicarea unei transformari
afine), fata de punctele suprafetei corespunzatoare.
Dandu-se o transformare afina 3D care este reprezentata in spatiul omogen printr-o

matrice M4x4, aplicarea matricei M4x4 unui vector (reprezentat ca ) din spatiul

euclidian E3 (reprezentat in R4 prin [x,y,z,0]T) se poate face prin inmultirea: *

unde este matricea din coltul stanga sus a matricei M4x4.


Notam cu n normala la o suprafata (S), intr-un punct P al lui (S). ((S)E3, PE3). In
urma aplicarii transformarii afine de matrice M4x4 punctelor suprafetei (S) aceste
puncte vor fi transformate prin P4x1M4x4*P4x1
iar vectorii normala vor fi transformati prin:

n3x1 (4-6)

Vom prezenta o demonstratie a relatiei (4-6) pentru cazul cand (S) este o suprafata
plana.

Fie planul () reprezentat implicit prin ecuatia Ax+By+Cz+D=0 ((x,y,z) sunt

coordonatele carteziene ale unui punct (P ) oarecare al planului () iar (A,B,C) sunt

coeficientii normalei la plan).

Notam N= vectorul coeficientilor ecuatiei planului (). Aceasta se mai poate scrie

NT* =0 sau NT*P=0 (* = produs matrici) (4-7)

Sa presupunem ca transformam toate punctele planului () printr-o transformare de


matrice M, va rezulta tot un plan (transf). Sa presupunem ca, coeficientii ecuatiei
planului rezultat prin aplicarea transformarii M se obtin din coeficientii planului
initial printr-o transformare liniara i.e.

Ntransf= = Q4x4*N4x1

Ecuatia planului (transf) este:

Ntransf*Ptransf=(Q*N)T(M*P)=0 ==> (NT*QT)*(M*P)=0 sau NT*(QT*M)*P=0


Tinand seama ca (4-7) este adevarata, deducem:

QT*M=I ==> Q=(M-1)T

Deci vectorul coloana al coeficientilor planului transformat de M4x4 este dat de

Ntransf=(M-1)T*N

Deoarece primele trei componente ale lui N respectiv Ntransf sunt componentele
normalei la planele () respectiv (transf) iar M este matricea unei transformari afine
3D, rezulta ca relatia (4-6) este adevarata in cazul unei suprafete (S) plane.

4.5 Exemple de determinare a transformarilor 3D compuse

In continuare vom prezenta calculul matricei M a unei transformari 3D de rotatie a


unui punct P in jurul unei axe specificate prin doua puncte A si B. Se va determina M
ca produsul matricelor asociate unor transformari elementare. Deoarece axa de rotatie
e specificata prin doua puncte (nu printr-un vector), transformarea TM va avea o
componenta de translatie deci nu va fi o transformare liniara a spatiului 3D. Ideea este
sa aliniem axa AB cu una din axele sistemului de coordonate (in cazul concret Oy) si
sa rotim in jurul lui Oy.

Figura 4.5

Transformarea cautata rezulta prin compunerea urmatoarelor transformari:


1. Translatie care aduee punctul A in origine: T1=T(-xA,-yA,-zA)
2. Rotatie T2=Ry() in jurul lui Oy, cu unghiul avand
sin()= , cos()=
aceasta transformare va aduce axa de rotatie in planul xOy
3. Rotatia T3=Rz() in jurul axei Oz cu un unghi dat de:
cos()= , sin()=

in acest fel, axa de rotatie a fost aliniata cu axa Oy (una din axele sistemului de
coordonate)
4. se efectueaza rotatia Ry()
5. se aplica transformarile inverse ale transformarilor T3, T2, T1, pentru a aduce la loc
axa Oy peste axa AB

In concluzie matricea transformarii cautate este:


M=T1-1*T2-1*T3-1*Ry()*T3*T2*T1

O clasa importanta de transformari liniare 2D/3D sunt simetriile (numite si oglindiri)


generale:
In 2D exista simetria in raport cu originea (oglindirea/simetria fata de origine) care
are acelasi efect cu transformarea R() (transformare p.o.r.) si simetria in raport cu o
axa oarecare a (cazuri particulare sunt oglindirile elementare in raport cu axele Ox
si Oy) a carei matrice de transformare rezulta prin compunerea unei translatii, rotatii
(care aduce axa de simetrie a de-a lungul unei axe a sistemului de coordonate de
exemplu Ox) cu o oglindire elementara si cu transformarea compusa care aduce axa
Ox inapoi peste a (transformare n.p.o.r.).
In 3D exista simetria fata de un punct oarecare (caz elementar simetria fata de origine)
(transformare n.p.o.r.), simetria fata de o linie oarecare (care corespunde unei rotatii
de unghi in jurul liniei) (transformare p.o.r.) si respectiv simetria fata de un plan
oarecare dat prin normala la plan n3x1. Aceasta ultima transformare are matricea:
I3x3-2*(n3x1*(nT)1x3)
(operatorul * semnifica inmultirea de matrice rezultatul operatiei v3x1 * w1x3 este o
matrice 3x3) (este o transformare p.o.r.).
Simetria fata de un plan oarecare are si o descriere vectoriala. Daca rP este vectorul de
pozitie al punctului P din spatiul 3D, () este un plan oarecare care trece prin origine
si are normala la plan n, Sim()(rP) este vectorul simetric al lui rP fata de planul (),
atunci:
Sim()(rP)=rP-2(rPn)n (operatorul  semnifica produsul scalar a doi vectori).

O transformare generala de simetrie are asociata o matrice ortonormala (ca si o


transformare generala de rotatie) dar poate sau nu sa pastreze orientarea sistemului de
vectori liniar independenti ce specifica (alaturi de origine) referentialul. Din punct de
vedere al orientarii sale, un referential poate fi drept sau stang. O transformare liniara
poate pastra orientarea referentialului sau o poate schimba. Daca se considera o
transformare in spatiul 3D, cu matricea transformarii M3x3, transformarea va pastra
orientarea referentialului daca si numai daca det(M3x3)>0. Dupa cum am aratat, o
rotatie generala are det(M3x3)=1 ceea ce inseamna ca aceasta transformare pastreaza
orientarea referentialului. O reflexie generala poate avea det(M3x3)=1, deci poate
pastra sau schimba (in functie de transformarea concreta) orientarea referentialului. In
descrierea fiecarui tip de transformare de simetrie am mentionat daca pastreaza
orientarea referentialului (orientation preserving - p.o.r) sau nu o pastreaza
(orientation reversing - n.p.o.r.).
In capitolul 2 s-a prezentat o metoda bazata pe calcul vectorial, prin care se poate
determina daca un sistem de n vectori liniar independenti din Rn este un sistem drept
sau stang (vezi calculul ariei orientate a unui triunghi din spatiul 3D).

Autor: conf. dr. ing. Marius Zaharia


Draft curs Elemente de grafica pe calculator,
tinut la Facultatea Automatica si Calculatoare,
directia Calculatoare, seria iiiCC, anul universitar 2015-2016.

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