Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  
AstronomieBiofizicaBiologieBotanicaCartiChimieCopii
Educatie civicaFabule ghicitoriFizicaGramaticaJocLiteratura romanaLogica
MatematicaPoeziiPsihologie psihiatrieSociologie


Grafica asistata - Compunerea transformarilor

Matematica



+ Font mai mare | - Font mai mic



daca , se produce simetria in raport cu axa Oy; x' = - x, y' = y;



daca , se produce simetria in raport cu axa Ox; x' = x, y' = - y;

daca , se produce simetria in raport cu ambele axe, adica simetrie centrata in raport cu originea; x' = - x, y' = - y.

Deformarea. Consideram matricea pe care o aplicam unui patrat abcd (fig.1.13a) si luam B=2:

.

Spunem ca s-a efectuat o deformare in y, ceea ce inseamna in directia axei Oy (fig.1.13b). Matricea produce o deformare pe axa Ox, iar , o deformare in ambele directii.


Fig.1.13. Deformarea

Exemplul 1.4. Fie patratul abcd, unitar cu varful a in origine. Daca ii aplicam transformarea se obtine deformarea din fig.1.13.c. Remarcati schimbarea varfurilor b' si d'!

Rotatia. Fie M(x,y) in sistemul de axe xOy (fig. 1.14). Daca: r = OM, a=(Ox,OM), M este afixul lui z=r(cosa + isina din care:

x'=x cosq - ysinq

y'=xsinq + ysinq

sunt formulele care dau rotatia. Daca q , se obtine transformarea identica.

Se observa usor ca inlocuind pe q cu - q se obtine o transformare din aceeasi familie. De asemenea produsul a doua rotatii este o noua rotatie.


Fig.1.14. Rotatia Fig.1.15. Rotatia patratului

In concluzie , rotatiile in jurul unui punct formeaza un grup G1 cu un parametru.

Revenind la matricea T, cautam valorile lui A,B,C,D pentru care transformarea obtinuta da o rotatie. Fie un patrat abcd (fig.1.15) ce sufera o rotatie sub un unghi q

Obtinem imediat:

abcisa lui b'=1.cos q; ordonata lui b'=1.sin q;

abcisa lui d'=-1.sin q; ordonata lui d'=1.cos q;

Anterior s-a vazut ca daca se cunosc coordonatele punctelor b' si d' atunci matricea transformare este cunoscuta. Deci:

.

Exemplul 1.5. Daca dorim ca un patrat unitar sa sufere o rotatie cu unghiul q=30o. Matricea de rotatie va fi:

Care aplicata patratului va da:

Trebuie sa retinem ca:

rotatie se efectueaza intotdeauna in jurul originii O(0,0);

matricea de rotatie este o combinatie de scalari si deformari care lasa neschimbate dimensiunile finale;

o matrice de rotatie are intotdeauna valoarea determinantului, egala cu 1: D=cos2q + sin2q

Fie, din nou, patratul unitar la care se aplica matricea generala T:


Fig.1.16. Transformarea generala

Se obtine astfel un paralelogram a'b'c'd' (fig.1.16) .

Exemplul 1.6. Fie A=4, B=1, C=1, D=3. Vom remarca urmatoarele:

coordonatele lui b' sunt date pe prima linie a matricei;

coordonatele lui d' sunt date pe urmatoarea linie a matricei.

Acest lucru este important deoarece daca se cunosc coordonatele acestor puncte, atunci matricea generala a transformarii este perfect determinata.

Termenii B si C produc deformarea in directiile Oy si Ox, iar termenii A si D actioneaza pe scala.

Vom demonstra ca aria (a'b'c'd')= A.D - B.C. se poate observa ca aria paralelogramului se poate obtine din aria dreptunghiului de baza A+C si inaltime B+D, din care se scad ariile celor doua triunghiuri dreptunghice si a celor doua trapeze dreptunghice:

Aria (a'b'c'd')= (A+C)(B+D)- A.B/2 - (B+B+D)C/2 - (C+A+C)B/2= A.D -B.C

Aceasta relatie ne permite sa calculam aria transformarii unei suprafete oarecare. Consideram o suprafata ce contine S unitati. Aria transformata printr-o matrice 2x2 va avea valoarea S'=S.(A.D - B.C).

Compunerea transformarilor

O expresie care contine coordonatele unuia sau mai multor puncte este un invariant absolut al unui grup de transformari daca nu-si schimba forma cand inlocuim coordonatele punctelor prin coordonatele punctelor transformate.

Daca in aceleasi conditii, expresia se reproduce inmultita cu un factor ce depinde de parametrii transformarii, spunem ca ea este un invariant relativ.

Toate transformarile prezentate mai inainte au fost centrate in originea axelor sau , altfel spus, punctul O(0,0) este un invariant.

Exemplul 1.7. Sa incercam sa gasim matricea transformarilor care intoarce un triunghi abc in jurul unui punct dat (x,y) sub un unghi q

Coordonatele omogene ne vor ajuta sa rezolvam mai usor problema. Transformam toate matricele 2x2 utilizate pana acum , in matrice 3x3 astfel:

.

In general, o rotatie in jurul unui punct arbitrar al unui plan va fi executata efectuand:

translatia centrului de rotatie la originea axelor;

rotatia asteptata;

translatia rezultatului la centrul de rotatie initial.

Deci se efectueaza produsul a trei matrice:



Revenind la problema enuntata (fig.1.17) avem: a(6,4) b(9,4), c(6,6), x=5, y=3, q=60o. Deci:

De fiecare data cand se realizeaza un produs se efectueaza o transformare. Triunghiul abc se deplaseaza mai intai in def, acolo sufera o rotatie de 60o si devine ghi , care se translateaza in final in a'b'c'. Este preferabil sa se efectueze dintr-o data aceste operatii. De aceea se compun cele trei matrice intr-una singura care va fi matricea transformarii globale ce se aplica triunghiului initial.

Fig.1.17. Compunerea transformarilor

Aplicand aceasta matrice triunghiului initial abc se obtine:

care este intocmai rezultatul anterior.

Metoda este destul de laborioasa. De aceea se vor generaliza lucrand in mod literal. Avem de efectuat produsul:

Atunci: (x' y' z')=(x y z)T si deci, avem:

Va fi suficient sa citim coordonatele (a,b) ale centrului de rotatie oarecare si valoarea unghiului de rotatie q, apoi aplicam aceste formule la toate punctele obiectului considerat.

In concluzie matricea 3x3 utilizata cu coordonatele omogene in plan este de forma: Ea se poate partitiona in patru parti, fiecare avand un rol bine definit:

termenii A,B,C,D produc scalarile, rotatiile si deformarile;

a si b produc translatiile;

E produce schimbarea scarii generale.

Intr-adevar:

De unde coordonatele carteziene (x',y') se obtin substituind x'=x/E. y'=y/E. daca E>1 se produce micsorarea, iar E<1cand se produce marirea. Daca AD se va face o schimbare de scala diferita pe cele doua axe, iar daca A=D schimbarea va fi uniforma.

1.3. Bazele matematice ale graficii 3D

1.3.1 Sisteme de coordonate

Pentru reprezentarea unui punct in spatiul 3D se va alege un anumit sistem de coordonate. Iata sistemul direct (fig.1.18): mana dreapta arata cu degetul aratator axa Ox, cu degetul mijlociu axa Oy, iar cu degetul mare axa Oz.

Sistemul indirect (sau al mainii stangi) va avea axa Ox opusa. Cu alte cuvinte daca privim planul xOy al unui sistem direct atunci axa Oz este in directia observatorului. In sistemul indirect axa Oz este in directie opusa (fig.1.19).

Pentru a repera un punct P al spatiului, decidem sa adoptam sistemul direct, in care vom utiliza trei sisteme de coordonate: carteziene, sferice si cilindrice. (fig.1.20).

Pozitia lui P se specifica in coordonate sferice prin precizarea razei R, a unghiului fp (latitudinea) si a unghiului q p (longitudinea), cu precizarea ca:


Fig.1.18. Sistemul mainii

Fig. 1.19 Sistemul observatorului

RI[0,), qI 2p), fI[-p/2,p/2]

Trecerea de la coordonate carteziene la sferice se face astfel:

unde k=0 pentru x > 0,y > 0;k=1 pentru x < 0; k=2 pentru x >0,y< 0;


Fig.1.20 Sisteme de coordonate: a) carteziene; b) sferice: c) cilindrice

Formulele de trecere de la coordonate sferice la carteziene sunt:

x = R cos q cos f

y = R sin q cos f

z = R sin f

Coordonatele cilindrice ale unui punct P sunt: cota(z), raza (R) si unghiul (q cu: z IR, RI[0,), qI 2p). Trecerea din coordonate carteziene in cilindrice se realizeaza prin relatiile: R=; z=z; q dupa aceeasi relatie ca la coordonatele sferice, iar trecerea inversa, de la coordonate cilindrice la carteziene, este data prin:

x = R cos q; y =R sin q; z = z.

1.3.2. Transformari 3D

O transformare in spatiul tridimensional este o aplicatie de la R3 la R3 de forma x' = F(x, k) unde x' = (x', y', z') IR , x = (x, y, z) IR si k - o multime de parametri. Prin modificarea parametrilor k in domeniul de valori acceptabile, functia F realizeaza o multime de transformari care formeaza un grup daca sunt indeplinite conditiile:

exista un element identic k=i astfel incat F(x, k) = x;

daca x' = F( x, k) si x' =F (x', L), atunci exista parametrul M= F (k, L) astfel incat x'= F(X, M), pentru orice X;

orice transformare are o inversa, astfel incat F (k, L) = i poate fi rezolvata deducand L in functie de k.

Din cea de-a doua conditie se obtine ca L si k il determina pe M, adica trebuie sa existe o functie F, astfel incat M = F (k, L). Aceasta functie determina tabla multiplicativa pentru un grup unde operatia grupului este functia de compunere. Cele trei conditii stau la baza transformarilor obiectelor in 3D.



Pentru a vizualiza un obiect in diferite pozitii, la diferite distante de un observator si pentru a-l modifica in intregime dupa o anumita lege, se folosesc transformarile globale 3D, cum ar fi: scalarea, rotatia, translatia, simetria etc.

Vom stabili matricele de transformare la fel cum s-a facut pentru 2D.

Toate punctele spatiului cartezian au coordonate de tip (x, y, z) si coordonate omogene (x, y, z, 1) care pot fi scrise sub forma matriciala 1x4. Atunci toate transformarile ce vor fi studiate trebuie sa fie reprezentate prin matrice de tip 4x4.A patra coloana adaugata matricei este necesara pentru a putea calcula inversa matricei.

Scalarea. Analog cu matricea schimburilor din 2D, putem scrie:

Termenii diagonalei principale produc schimbari de scala in raport cu fiecare din cele trei axe. Daca A = B =C, atunci are loc scalarea uniforma.

Exemplul 1.8 un paralelipiped dreptunghic se poate transforma intr-un cub unitar (fig.1.21)

Sau matricial : C . A = C'

Fig.1.21. Schimbari de scala

Exemplul 1.9. Un cub unitar se poate transforma intr-unul triplu ( fig.1.22) prin:

sau matricial : C' . B = C'

Fig.1.22. Scalare cub unitar

Rotatia. Matricea patratica de ordinul trei produce o rotatie in jurul originii cu un unghi q masurat in sens trigonometric (fig. 1.23):


Fig.1.23. Rotatia

Axa Oz este orientata in sus, adica rotatia va fi in jurul axei Oz. Intr-adevar matricea va trebui sa aiba zerouri in linia si coloana a treia, exceptand elementul t33 care este egal cu 1.

Fara a insiste pe demonstratii, cele trei matrice de rotatie in jurul fiecarei axe sunt:

In toate cazurile rotatia se face in sens pozitiv ( sens trigonometric) cand se priveste originea punctului situat pe axa pozitiva. Matricele de rotatie au intotdeauna determinantul egal cu 1.

Rezultatul a doua rotatii succesive depinde de ordinea in care se efectueaza produsul. De exemplu, daca un obiect se roteste in jurul axei Ox sub un unghi q apoi se roteste cu acelasi unghi in jurul axei Oy se va obtine R=Rox . Roy , adica:

Din comparatia celor doua rezultate obtinem R g R', fapt previzibil pentru ca produsul matricial nu este in general comutativ.

Translatia. Pentru precizarea translatiei unui sistem de puncte in 3D se folosesc trei metode:

specificarea deplasarilor pe directia fiecarei axe de coordonate;

specificarea directiei de deplasare si a valorii deplasarii;

specificarea punctului din spatiu in care este transpus un anumit punct din sistem prin translatia data.

Prima metoda este si cea mai uzuala. Daca avem un sistem de puncte Mi, 1 k prin translatie se vor preciza trei valori: m (deplasarea pe axa Ox), n (deplasarea pe axa Oy) si p (deplasarea pe axa Oz). Valorile m, n si p pot fi pozitive sau negative.

Se va obtine astfel:

adica M(x, y, z) devine M'(x', y', z'), cu x' = x + m, y' = y + n, z' =z + p. distanta pe care s-a efectuat deplasarea este:

Simetria. Pentru a gasi simetria unui obiect in raport cu planul xOy, de exemplu, este suficient sa schimbam semnul cotei z al tuturor punctelor obiectului respectiv. Rationamentul este identic pentru simetriile in raport cu xOz si yOz:

Simetria unui punct in raport cu axele Ox, Oy si Oz este data de matricele de transformare:

iar simetria in raport cu originea O(0,0,0) este:

In mod uzual sunt suficiente aceste sapte simetrii. Simetria fata de un plan oarecare se rezolva aplicand sistemului de referinta translatia si rotatia (astfel incat un plan de coordonate sa se suprapuna peste planul dat) si apoi simetria fata de acel plan. Dupa acesta se face rototranslatia inversa. Analog se procedeaza in cazul unei drepte oarecare.

In cazul unui punct este necesara o translatie aplicata sistemului de coordonate astfel ca originea sa ajunga in punctul dat si apoi se realizeaza simetria fata de origine. Dupa calcularea coordonatelor punctului simetric se aplica translatia inversa.

Rotatia in jurul unei axe arbitrare. Se stie ca rezultatul compunerii unei serii de transformari se poate reprezenta printr-o matrice unica. Ne propunem sa cautam matricea de rotatie sub un unghi q in jurul dreptei pq, paralela cu Ox, data de p (a,b,c) q(d,e,c). pasul urmator este identic cu studiul de la rotatia in planul 2D. Amintim ca :

se efectueaza o translatie T, care aduce punctul p in originea sistemului de axe;

se efectueaza rotatia R ceruta de unghiul q

se executa translatia T' opusa primei translatii.

Se obtine produsul matricial M=T .R .T':

Exemplul 1.10. Verificam aceste relatii pe un caz concret: q=90o, p = (5, 6, 2), q =(-3, 6, 2) si atunci matricea de transformare va fi:

Aplicam aceste transformari paralelipipedului dreptunghic descris de punctele a(2,12,0), b(2,17,0), c(-2,17,0), d(-2,12,0), e(2,12,5), f(2,15,5), g(-2,17,5), h(-2,12,5) si se va obtine paralelipipedul descris de punctele: a'(2,8,8), b'(2,8,13), c'(-2,8,13), d'(-2,8,8), e'(2,3,8), f'(2,3,13), g'(-2,3,13), h'(-2,3,8).

In exemplul 1.10 transformarile T si T' au efecte contrare. Matricea T furnizeaza translatia punctului (-5,-6,-2), in timp ce matricea T' furnizeaza translatia punctului (5,6,2). Aceasta inseamna ca se efectueaza T . T'= T' . T=I, unde I este matricea unitate iar T' este inversa lui T (sau invers).

Exemplul 1.11. Fie R matricea de rotatie cu 30o in jurul axei Ox. Matricea sa inversa R-1 furnizand o rotatie cu -30o in jurul aceleeasi axe:

Matricea inversa este usor de gasit:

inversa matricei de translatie se obtine inlocuind m, n, p cu opusul lor - m, - n, - p;

inversa matricei de scalare se obtine inlocuind a, b, c cu inversele lor 1/a, 1/b, 1/c;



inversa matricei de rotatie se poate obtine inlocuind pe q cu -q:

Transformarea unui sistem de axe. Transformarile efectuate pana acum s-au efectuat in raport cu un sistem de axe. Se poate insa efectua transformarea unui sistem de axe in raport cu alt sistem. Mai concret se doreste translatarea originii sistemului actual spre alt loc unde se suporta mai usor o rotatie in raport cu axele sale.

Exemplul 1.12. Consideram o rotatie de unghi q = 40o in jurul axei Oz. Rotatia punctului a este strict echivalenta rotatiei sistemului de axe de unghi - q. deci daca se ia a(8, 3, 0) se gaseste a' calculand produsul:

si deci rezultatul transformarii punctului a este a' (4.2; 7.44; 0).

Pe de alta parte, daca facem rotatia - q sistemului, se va inlocui matricea anterioara cu inversa sa. Aplicam aceasta matrice la doua puncte oarecare p si q ale axei x -ilor si y-ilor si vom gasi noile axe pentru x si y. de exemplu, pentru p(5,0 ,0) si q80, 5, 0) se va obtine:

(5 0 0 1) . R-1= (3.83 -3.83 0 1);

(0 5 0 1) . R-1= (3.21 3.83 0 1);

unde R-1=.

Cunoscand transformarile p' si q' se poate construi usor noul sistem de axe. Punctul a' este confundat cu a, deoarece axele s-au rotit o singura data. Coordonatele lui a si a' in noul sistem sunt (4,2 7.44 0).

1.4. Obiecte grafice

1.4.1. Obiecte elementare

Din punct de vedere informatic, un sistem grafic poate fi definit complet daca se precizeaza obiectele grafice elementare care il compun si operatiile pe care le putem aplica acestora.

Obiectele ce pot face parte dintr-un sistem grafic sunt descrise in continuare prin modalitatea de definire si constructie.

Punctul - obiect elementar ce poate fi definit prin coordonatele sale (xp, yp, zp).

Segmentul - este o multime de puncte situate pe o dreapta cuprinse intre doua puncte numite extremitati. Daca | PQ | este segmentul cu P(xmin, ymin, zmin) si Q (xmax, ymax, zmax) atunci X |PQ | X= (x, y, z) rezulta:

xmin xxmax, yminyymax, zminzzmax.

Cercul in spatiul R3 poate fi definit cu ajutorul a trei puncte: doua care sa fie extremitatile unui diametru al cercului si cel de-al treilea pe circumferinta pentru a defini planul cercului. Centrul cercului, raza si ecuatia planului ce contine cercul pot fi usor calculate numai din coordonatele acestor trei puncte.

Elipsa. Un mod de a defini o elipsa prin puncte in 3D este bazat pe metoda distantei constante fata de cele doua puncte denumite focare. O elipsa poate fi definita si prin trei puncte care pot fi: doua puncte care reprezinta focarele elipsei iar al treilea punct se gaseste oriunde pe circumferinta, dar ales astfel ca cele trei puncte sa nu fie coliniare. Cele trei puncte definesc planul elipsei, lungimea focala si curba eliptica.

Polilinii. Poliliniile in 3D sunt o generalizare a celor din 2D. Ele pot fi definite cu ajutorul a n varfuri (xi , yi, zi) i =1,..,n. segmentele ce compun polilinia nu trebuie sa fie situate in acelasi plan.

Spline. Curbele spline 3D sunt curbe in 3D ce aproximeaza o polininie, deci este suficient sa dam cele n puncte(xi , yi, zi) i =1,..,n, iar formula din 2D se generalizeaza pentru 3D.

Triunghi si suprafete poligonale. Suprafata poligonala este aria cuprinsa intre muchiile unui poligon ( muchii situate in acelasi plan). Singurul poligon la care muchiile sunt situate totdeauna in acelasi plan este triunghiul. De aceea suprafetele poligonale se reprezinta ca fiind o alaturare de suprafete triunghiulare din acelasi plan.

Sfera. O sectiune dintr-o sfera este un cerc, oricare ar fi planul de sectiune. De aceea sfera se va trasa cu ajutorul cercului. Sfera poate fi definita in 3D prin doua puncte: unul este centrul sferei iar celalalt este un punct oarecare de pe suprafata sferei; sau de doua puncte, extremitatile diametrului sectiunii maximale.

Elipsoid, sferoid si suprafete cuadrice. Un elipsoid este o suprafata data de ecuatia:

unde C(xc, yc, zc) este centrul elipsoidului, iar a, b, c sunt parametrii reprezentand dimensiunile elipsoidului pe semiaxele Ox, Oy, Oz. Daca doi dintre parametrii a, b, sau c sunt egali, atunci elipsoidul se numeste sferoid, iar daca toti cei trei parametri sunt egali atunci se obtine sfera. Pamantul este de exemplu aproximat cu un sferoid. Suprafetele cuadrice sunt generalizari ale sferelor si elipsoizilor. Ele au ecuatia:

Suprafete generate. Ecuatiile suprafetelor generate in 3D sunt:

x = f(u, v)

y = g(u, v)

z = h(u, v)

unde u, v sunt parametrii suprafetei curbilinii.

Parametrii u, v pot fi alesi ca sistem de coordonate, iar curbele obtinute pentru u constant sau v constant pot fi trasate pe suprafata. Familia de curbe pentru u constant poate fi trasata ( ca si cea pentru v constant) drept curbe spline, iar suprafata poate fi numita suprafata spline si trasata cu ajutorul curbelor spline.

1.4.2. Parabole spline

O problema frecventa in grafica asistata apare in procesul trasarii interactive a curbelor. Viteza de prelucrare a punctelor descrise de mana umana cu un mouse pe ecran este mica, astfel incat curba apare discontinua, inregistrand si ezitarile in trasare. Produsele de grafica, ofera instrumente care corecteaza aceste deficiente, instrumente bazate pe folosirea unui set de puncte de control. Curba trasata interactiv va trece prin aceste puncte sau printr-o vecinatate controlata, asigurand si proprietatea de netezime.

Parabola spline este o reuniune de arce parabolice obtinute cu ajutorul punctelor de control P1, P2,..,Pn: primul arc trece prin P1, P2, P3, urmatorul prin P2, P3, P4, iar ultimul trece prin punctele Pn-2, Pn-1, Pn,

Pentru a gasi formula unui arc parabolic consideram ecuatia y = ax2+ bx+ c si inlocuim in aceasta coordonatele punctelor din plan prin care trece parabola: P1 = (x1,y1), P2 = (x2,y2), P3 = (x3,y3). Obtinem o multime de ecuatii liniare pentru a,b,c:

,

unde V este matricea Vandermonde: .

Prin inversarea acestei matrice obtinem solutia pentru a,b,c:

Din P2, P3 si P4 obtinem parametrii celui de-al doilea arc parabolic a',b',c' . Trasand arcul din prima parabola de la P1 la P2 si arcul din cea de-a doua parabola de la P2 la P3 s.a.m.d. obtinem curba cautata. In P2 tangenta la primul arc are panta: m=2ax2+ b, iarla al doilea are panta: m'=2a'x2+b', insa acestea nu sunt in mod necesar egale. Trasarea curbei in aceasta maniera produce o curba neneteda (daca prima derivata nu este continua). O mai buna aproximare este de a determina a, b, c si apoi de a trasa arcul de la P1 la P2 iar apoi de a pastra panta m in P2. Urmatorul arc este determinat de panta m in P2 ; arcele urmatoare se determina in mod similar. Ecuatiile de rezolvat in acest caz sunt:

Si in acest caz sistemul poate fi rezolvat algebric.

O alta problema care apare in legatura cu parabolele spline este cea a reflectarii arcului. Aceasta problema este prezentata in fig. 1.24, in care ultimul arc
indeplineste conditia de panta in P3 , dar poate fi orientat spre interior sau spre exterior.

Se observa ca si arcul reflectat indeplineste conditiile cerute: trece prin P3, P4, iar panta tangentei este aceeasi (m). Pentru a 'reflecta' un arc putem descrie formulele astfel. Sa presupunem ca reflectam arcul de la P3 la P4. Fiecare punct va fi transferat intr-o noua pozitie, punctul (x, y) va fi mutat in punctul (xrefl, yrefl ) unde:

In aceste ecuatii M este panta dreptei ce uneste P2 cu P3 :

Cand trebuie reflectat un arc parabolic?

Determinam daca un punct urmator consecutiv se gaseste pe arcul precedent si daca nu reflectam arcul. Exemple de parabole spline sunt date in fig.1.25:





Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1674
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved