Concepte matematice în grafica pe computer#

Introducere#

Salutare și bine v-am regăsit în noul sezon Poligon! Marcăm chiar acum, prin acest episod, o extindere a subiectelor pe care vi le propunem printr-o discuție despre grafica pe computer. Sub acest titlu generic, vrem să vă vorbim despre cîteva elemente tehnice care stau la baza oricărui produs software utilizat pentru scopuri artistice, industriale, funcționale și nu numai și să vedem împreună cît de importantă este matematica în toate acestea.

În esență, o reprezentare grafică – fie că vorbim despre graficul unei funcții sau reprezentarea schematică a unei clădiri ori un proiect de design al unui produs – are drept scop clarificarea, facilitarea înțelegerii unor structuri prin apelul la memoria vizuală, dar și la imaginație. Dacă ne gîndim încă din cele mai vechi timpuri, picturile rupestre sau alfabetele primitive se bazau pe astfel de reprezentări grafice, al căror scop era în primul rînd comunicarea.

_images/hiero1.jpg

Fig. 34 Hieroglife și literele sau grupările de litere corespunzătoare#

Mai ușor, dar mai ales mai sugestiv decît cuvîntul „pasăre“ este un desen al unei păsări, desigur, ceea ce a făcut comunicarea prin imagini mai ușoară decît cea prin cuvinte, lucru care este adevărat chiar și în zilele noastre. „O imagine valorează mai mult decît 1000 de cuvinte“, nu-i așa?

Impreciziile sau simpla imaginație bogată a oamenilor au condus ulterior la imagini care… să spunem așa… manifestau libertăți creative, adică unele în care reprezentarea nu mai era neapărat fidelă realității. Și așa, am putea spune, ajungem la reprezentările grafice, imagistice cu rol artistic.

Dar există și destule situații în care o reprezentare care nu este fidelă realității are un rol ajutător. Este cazul majorității figurilor folosite în matematică, fizică și nu numai. O piesă a unui utilaj poate fi proiectată sau reprezentată destul de fidel printr-o imagine sau diagramă ori desen tehnic, însă în matematică, reprezentarea grafică a unei funcții, de pildă, conține adesea aproximații, convenții și sugestii.

Așa stînd lucrurile în general, trecem acum la utilizarea computerului pentru reprezentări grafice. Subiectul este unul extrem de vast, în primul rînd pentru că un computer a ajuns realmente indispensabil vieților noastre moderne, astfel că el poate fi utilizat cu scopuri educaționale, operaționale, artistice și nu numai. Cîteva exemple de aplicații includ:

  • reprezentări grafice ale unor funcții sau obiecte matematice studiate în școală; practic, educație asistată de computer, în special pentru partea vizuală;

_images/function-graph.png

Fig. 35 Grafice de funcții#

  • reprezentări grafice de maximă precizie pentru proiectare folosind software de tip CAD – în domeniul arhitectural și ingineresc, de obicei;

_images/architectural-cad-500x500.jpg

Fig. 36 Reprezentare arhitecturală folosind software tip CAD#

  • arta generativă, despre care am mai vorbit într-un episod anterior, care folosește formule matematice sau algoritmi de programare ca să obțină imagini cu scop artistic. Realizarea acestora ar fi de cele mai multe ori imposibilă în lipsa unui computer. Gîndiți-vă, de pildă, la un fractal de o dimensiune arbitrară și toate dificultățile pe care le-ar implica realizarea lui de mînă.

_images/fractal.jpg

Fig. 37 Fractal generat pe computer#

  • automatizarea unui proces artistic, ingineresc sau educațional. Astăzi există numeroase funcții foarte puternice și sofisticate care ne ajută să alcătuim figuri tot mai complicate. De la simplul copy-paste pe care îl putem folosi pentru a repeta un tipar la funcții care oglindesc imaginea, combină culorile automat sau sugerează un paletar, trasează poligoane automat.

  • nu putem omite creațiile grafice realizate de inteligența artificială. De fapt, programe sofisticate procesează miliarde de opere de artă sau fotografii pentru a-și crea un fel de „înțelegere“ și apoi combină frînturi și variații din acestea într-o singură „operă“. Nu puține sînt cazurile cînd astfel de artă este legitimă sau nu și poate ați auzit de cazul recent al unei picturi realizate de Midjourney AI care a cîștigat o competiție împotriva artiștilor umani.

_images/verge-midjourney.png

Fig. 38 Știrea despre succesul Midjourney AI#

  • simulări. Poate nu surprinzător este faptul că încercările de imitare a naturii înconjurătoare sînt unele dintre cele mai dificile sarcini, chiar și pentru un computer. Realismul pe care îl căutăm în reprezentări grafice 3D este foarte greu, dacă nu imposibil de obținut. Detalii de lumină, fizică, proporții și nu numai trebuie mai întîi abstractizate pentru a putea fi implementate și abia apoi „explicate“ computerului.

Mai facem o distincție importantă care adaugă și mai multă complexitate subiectului. Reprezentările grafice pot avea, în general, două forme: statică și în timp real (realtime). O piesă statică este una care nu se modifică atunci cînd este accesată. De exemplu, o imagine procesată cu Adobe Photoshop sau o scenă 3D exportată din Blender este statică. Însă elementele grafice, peisajul, personajele și obiectele dintr-un joc video sînt redate în timp real. Acestea evoluează în funcție de mișcările jucătorului, ale camerei, diversele interacțiuni din jocuri și așa mai departe.

Încă doi termeni tehnici foarte importanți pe care o să îi folosim de multe ori.

Prin rendering (tradus direct prin „randare“) se înțelege trecerea de la prepararea unei scene la finalizarea ei. Este similar momentului cînd, după ce ați scris un document Word îl exportați în PDF sau îl imprimați. Dacă repetițiile pentru o piesă de teatru sau un film ar fi prepararea scenei, atunci filmarea piesei sau a peliculei corespunde randării. Procesul de randare este unul extrem de complex, în funcție de scenă. Aceasta deoarece abia atunci cînd se produce piesa finală se iau în considerare toți factorii precum lumină, umbră, culori, mișcare etc. De la sine înțeles, randarea în timp real este cea mai costisitoare operație grafică, din punctul de vedere al resurselor. Ca fapt divers, filmele de animație de la Pixar se randează în zile sau chiar zeci de zile pentru un singur episod din cauza geometriei și fizicii complexe folosite. Iar studiourile Pixar, de la sine înțeles, folosesc computere mult mai performante decît orice ne-am putea permite aproape oricare dintre noi. În plus, acestea nu se folosesc în timp real, pentru că, odată randate, episoadele vor fi redate direct ca videoclipuri.

Elementele grafice, imaginile pot fi de două tipuri, în special: raster sau vectorial. Tipul raster, pe care îl găsim în formate precum JPEG, PNG, BMP este, într-un fel, similar obiectelor statice. Pozițiile pixelilor sînt fixate într-o anumită ordine care să redea imaginea respectivă, care nu se poate modifica. De aceea, dacă rezoluția, adică numărul total de pixeli nu este suficient de mare, atunci cînd apropiem imaginea cu zoom, ea va deveni neclară și putem chiar să identificăm pixelii individuali.

De cealaltă parte, formatul vectorial este unul care poate evolua. Fișierele din acest format au, de obicei, extensia SVG, care provine de la Scalable Vector Graphics, adică elemente de grafică ce se pot rescala, după nevoie. În astfel de cazuri, nu se memorează concret poziția pixelilor pe ecran, ci doar regulile după care se aranjează, reguli exprimate relativ. Dacă veți avea curiozitatea să deschideți un fișier SVG cu un editor text, veți găsi instrucțiuni precum cele din imagine:

_images/svg.png

Fig. 39 Codul SVG și imaginea generată#

Acestea arată cum se trasează liniile din imagine, însă trasarea propriu-zisă se face direct la deschidere și ori de cîte ori se modifică ecranul sau zoom-ul. Este un fel de imagine în timp real, pentru că, și dacă aplicăm un factor de zoom de 1,000,000%, imaginea va fi la fel de clară, deoarece este trasată pe loc, am putea spune.

În continuare, vă vom vorbi despre cîteva dintre noțiunile utilizate în grafica asistată de computer. Vom pune accentul pe elementele de simulare, arătînd cîteva dintre noțiunile prin care se încearcă redarea cît mai fidelă a realității fizice prin medii virtuale. Astfel de noțiuni sînt des întîlnite, de exemplu, în programarea jocurilor, dar și a filmelor de animație, simulărilor de laborator și nu numai.

Spații euclidiene și spații afine#

Într-un episod anterior, cînd am discutat despre dimensiune, am văzut că aceasta se asociază unor spații vectoriale. Am arătat acolo cum noțiunea intuitivă de dimensiune, cel puțin în ce privește figurile plane – bidimensionale – și cele spațiale – tridimensionale, dimensiunea, în sens riguros matematic, coincide, bineînțeles, cu dimensiunea în sens intuitiv. Am văzut și ce înseamnă un spațiu de dimensiune 7, 100, 1000 sau chiar infinită.

Ei bine, în ce privește grafica asistată de computer, avantajul este că se lucrează cu spații de dimensiune cel mult 3 și, pentru unele artificii algebrice, de dimensiune 4.

Însă structura de spațiu vectorial, cu proprietățile pe care le-am prezentat și noi și care se inspiră din cazurile vectorilor în plan și în spațiu, este un ingredient esențial. O bună parte a proprietăților geometrice ale spațiilor vectoriale sînt folosite pentru a trasa figuri tridimensionale într-o manieră cît mai credibilă. Proprietăți precum perspectiva liniară, operații precum proiecțiile și combinațiile liniare apar în mod esențial în foarte multe situații.

În plus, o componentă importantă a unui spațiu vectorial este așa-numita structură de spațiu euclidian, care se definește prin intermediul unei operații între vectori numită produs scalar. Aceasta este o operație care ne permite să transformăm 2 vectori într-un scalar (număr) printr-o operație care are aplicații în geometria euclidiană. Cum îi arată numele și cum cu siguranță intuiți, geometria euclidiană este una foarte apropiată de studiile grecului Euclid și pe care o putem rezuma prin interesul pentru lungimi și măsuri de unghiuri. Simplificat masiv, dacă într-un spațiu de figuri geometrice știm să măsurăm lungimi (formal, avem o funcție care asociază oricărei figuri un număr mai mare sau egal cu 0, cu anumite proprietăți pe care nu le detaliem) și măsuri de unghiuri – asocierea fiind, de data aceasta, cu numere între 0 și 2 pi, spunem că putem studia geometrie euclidiană, iar spațiul respectiv al figurilor geometrice se numește spațiu euclidian.

În liceu ați studiat aceste noțiuni la capitolul despre vectori în plan: dați 2 vectori, descompuși sub forma \(v = ai + bj\) și \(w = ci + dj\), se poate defini produsul lor scalar ca fiind \(ac + bd\) sau, într-o formă echivalentă, \(v \cdot w \cdot \cos(v,w)\), iar cu această ocazie vedem și cum apar unghiurile și măsurile lor. Lungimea vectorului \(v\) se calculează, în acest context, prin \(\sqrt{a^2 + b^2}\).


Geometria afină, de cealaltă parte, este una care nu urmărește să măsoare numeric (lungimi și unghiuri), ci este mai degrabă interesată de proprietăți situaționale, cum sînt pozițiile relative. Însuși numele acestei discipline, dat de Leonhard Euler în secolul al XVIII-lea, provine de la latinescul affinis (de unde avem în română cuvîntul „afinitate“), care înseamnă relație. Studiul geometriei afine pune accent pe puncte și drepte, precum și pe relațiile dintre acestea: un punct se găsește pe o dreaptă, două drepte sînt paralele sau concurente, două triunghiuri sînt asemenea sau congruente.

Geometria afină, împreună cu geometria proiectivă, sînt de mare ajutor atunci cînd se studiază probleme precum perspectiva liniară sau triangulări.

_images/perspectiveGrid-01.png

Fig. 40 Perspectivă liniară#

_images/triangulationgraphic.png

Fig. 41 Triangularea unui dreptunghi#

Nu vom insista pe detalii tehnice privitoare la aceste noțiuni, însă trebuie să adăugăm că o componentă fundamentală a studiului geometriei euclidiene, dar și afine o constituie calculul matriceal. Se poate demonstra că aproape toate operațiile importante dintre vectori se pot scrie cu ajutorul unor matrice, iar aceasta este noțiunea cu care continuăm.

Transformări geometrice#

Dată o figură geometrică, ea se poate transforma în mai multe moduri, dintre care cele mai utilizate sînt:

  • translația, prin care figura pur și simplu se mută în spațiu, fără a i se modifica aspectul;

  • rotația în jurul unui centru de rotație;

  • rescalarea uniformă sau neuniformă, prin care figura se mărește sau micșorează după caz. Într-o rescalare uniformă, toate proporțiile figurii se modifică în același fel, în timp ce într-o rescalare neuniformă, figura se poate modifica diferit după mai multe direcții;

  • forfecarea (numită în engleză shearing), care păstrează o anumită direcție fixă și modifică o alta.

Toate aceste transformări se pot face cu ajutorul calculului matriceal. De exemplu, dacă vrem să aplicăm o rotație în plan, considerăm o matrice cu o formă specifică, numită matrice de rotație. Aceasta se aplică figurii punct cu punct. De exemplu, dacă avem un triunghi pe care vrem să-l rotim, considerăm fiecare punct al său ca un vector-coloană cu 2 componente (x,y), pe care îl înmulțim cu matricea de rotație. Punctul rezultat este unul rotit față de un anumit centru cu un unghi fixat.

Exemplu: Transformările unui triunghi în plan#

Pornim cu un triunghi în plan, \( \Delta ABC \), cu vîrfurile \( A(1,1), B(7,1) \) și \( C(4,6) \), din figura de mai jos. Am ales triunghiul astfel încît să aibă latura \( AB \) paralelă cu axa \( OX \), pentru a o urmări ușor și în cazul în care își schimbă înclinarea.

_images/triunghi-2d.png

Fig. 42 \( \Delta ABC \) căruia îi vom aplica transformări geometrice în plan#


Începem cu ceea ce vom constata că este o rotație. Alegem un unghi \( \theta = \dfrac{\pi}{6} \) și definim matricea:

\[\begin{split}R = \begin{pmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{pmatrix} = % \begin{pmatrix} \sqrt{3}/2 & -1/2 \\ 1/2 & \sqrt{3}/2 \end{pmatrix}\end{split}\]

Apoi definim transformarea plană care să aibă matricea \( R \) drept matrice în bazele canonice. De aceea, o putem defini direct matriceal:

\[\begin{split}T_1 : \mathbb{R}^2 \to \mathbb{R}^2, \quad % T_1 \begin{pmatrix} x \\ y \end{pmatrix} = R \begin{pmatrix} x \\ y \end{pmatrix}\end{split}\]

Acum să aplicăm această transformare vîrfurilor triunghiului \( \Delta ABC \):

\[\begin{split}\begin{align*} A &\mapsto R \cdot \begin{pmatrix} 1 \\ 1 \end{pmatrix} = \begin{pmatrix} \dfrac{\sqrt{3} - 1}{2} \\ \dfrac{\sqrt{3} + 1}{2} \end{pmatrix} \\ B &\mapsto R \cdot \begin{pmatrix} 7 \\ 1 \end{pmatrix} = \begin{pmatrix} \dfrac{7\sqrt{3} - 1}{2} \\ \dfrac{7 + \sqrt{3}}{2} \end{pmatrix} \\ C &\mapsto R \cdot \begin{pmatrix} 4 \\ 6 \end{pmatrix} = \begin{pmatrix} \dfrac{4\sqrt{3} - 6}{2} \\ \dfrac{4 + 6\sqrt{3}}{2} \end{pmatrix} = % \begin{pmatrix} 2\sqrt{3} - 3 \\ 2 + 3\sqrt{3} \end{pmatrix} \end{align*}.\end{split}\]

Triunghiul care are noile vîrfuri obținute mai sus este reprezentat în figura următoare.

_images/triunghi-rotit.png

Fig. 43 Triunghiul \( \Delta ABC \) a fost rotit cu \( \dfrac{\pi}{6} \) în jurul originii și s-a obținut \( \Delta A_R B_R C_R \)#


Considerăm acum o transformare \( T_2 \) dată de matricea \( S = \begin{pmatrix} 3 & 0 \\ 0 & 2 \end{pmatrix} \):

\[\begin{split}T_2 : \mathbb{R}^2 \to \mathbb{R}^2, T_2 \begin{pmatrix} x \\ y \end{pmatrix} = S \begin{pmatrix} x \\ y \end{pmatrix}.\end{split}\]

Aplicăm transformarea vîrfurilor triunghiului:

\[\begin{split}\begin{align*} A &\mapsto S \cdot \begin{pmatrix} 1 \\ 1 \end{pmatrix} = \begin{pmatrix} 3 \\ 2 \end{pmatrix} \\ B &\mapsto S \cdot \begin{pmatrix} 7 \\ 1 \end{pmatrix} = \begin{pmatrix} 21 \\ 2 \end{pmatrix} \\ C &\mapsto S \cdot \begin{pmatrix} 4 \\ 6 \end{pmatrix} = \begin{pmatrix} 12 \\ 12 \end{pmatrix} \end{align*}\end{split}\]

Ceea ce se obține este triunghiul din figura de mai jos.

_images/triunghi-rescalat.png

Fig. 44 Triunghiul \( \Delta ABC \) a fost rescalat neuniform cu un raport \( \dfrac{3}{2} \) și s-a obținut \( \Delta A_S B_S C_S \)#

Se observă că triunghiul nu a fost rotit, însă coordonatele tuturor punctelor au fost rescalate neuniform. Din cauza elementelor de pe diagonala matricei \( S \), abscisele punctelor s-au triplat, iar ordonatele, s-au dublat. De aceea, triunghiul s-a „lățit“ mai mult decît s-a „alungit“, cu un raport de \( \dfrac{3}{2} \) între transformări, de fapt.


Fie acum transformarea \( T_3 \) dată de matricea \( F = \begin{pmatrix} 1 & 2 \\ 0 & 1 \end{pmatrix} \):

\[\begin{split}T_3 : \mathbb{R}^2 \to \mathbb{R}^2, T_3 \begin{pmatrix} x \\ y \end{pmatrix} = F \begin{pmatrix} x \\ y \end{pmatrix}.\end{split}\]

Pe vîrfurile \( \Delta ABC \):

\[\begin{split}\begin{align*} A &\mapsto F \cdot \begin{pmatrix} 1 \\ 1 \end{pmatrix} = \begin{pmatrix} 3 \\ 1 \end{pmatrix} \\ B &\mapsto F \cdot \begin{pmatrix} 7 \\ 1 \end{pmatrix} = \begin{pmatrix} 9 \\ 1 \end{pmatrix} \\ C &\mapsto F \cdot \begin{pmatrix} 4 \\ 6 \end{pmatrix} = \begin{pmatrix} 16 \\ 6 \end{pmatrix} \end{align*}\end{split}\]

Se obține triunghiul de mai jos.

_images/triunghi-forfecat.png

Fig. 45 Triunghiul \( \Delta ABC \) a fost forfecat în raport cu axa \( OY \) și s-a obținut \( \Delta A_F B_F C_F \)#

Transformarea păstrează înălțimea triunghiului și îi mută (neuniform) coordonatele vîrfurilor pe orizontală, adică paralel cu axa \( OX \). O astfel de transformare se numește forfecare (eng. shearing).


Considerăm acum o matrice oarecare \( G = \begin{pmatrix} 1 & -1 \\ 2 & 3 \end{pmatrix} \) și transformarea \( T_4 \) definită de ea:

\[\begin{split}T_4 : \mathbb{R}^2 \to \mathbb{R}^2, T_4 \begin{pmatrix} x \\ y \end{pmatrix} = G \begin{pmatrix} x \\ y \end{pmatrix}.\end{split}\]

Vîrfurile triunghiului devin:

\[\begin{split}\begin{align*} A &\mapsto G \cdot \begin{pmatrix} 1 \\ 1 \end{pmatrix} = \begin{pmatrix} 0 \\ 5 \end{pmatrix} \\ B &\mapsto G \cdot \begin{pmatrix} 7 \\ 1 \end{pmatrix} = \begin{pmatrix} 6 \\ 17 \end{pmatrix} \\ C &\mapsto G \cdot \begin{pmatrix} 4 \\ 6 \end{pmatrix} = \begin{pmatrix} -2 \\ -10 \end{pmatrix} \end{align*}\end{split}\]

Se obține:

_images/triunghi-transf-general.png

Fig. 46 Triunghiul \( \Delta ABC \) a suferit o transformare generală și a ajuns \( \Delta A_G B_G C_G \)#

O astfel de situație este greu de descris, întrucît triunghiul s-a transformat prin rotație, rescalare neuniformă și translație (cel puțin), iar cazul se numește transformare generală.


În fine, considerăm matricea \( D = \begin{pmatrix} 1 & -1 \\ 2 & -2 \end{pmatrix} \) și transformarea:

\[\begin{split}T_5 : \mathbb{R}^2 \to \mathbb{R}^2, T_5 \begin{pmatrix} x \\ y \end{pmatrix} = D \begin{pmatrix} x \\ y \end{pmatrix}.\end{split}\]

Vîrfurile triunghiului devin:

\[\begin{split}\begin{align*} A &\mapsto D \cdot \begin{pmatrix} 1 \\ 1 \end{pmatrix} = \begin{pmatrix} 0 \\ 0 \end{pmatrix} \\ B &\mapsto D \cdot \begin{pmatrix} 7 \\ 1 \end{pmatrix} = \begin{pmatrix} 6 \\ 12 \end{pmatrix} \\ C &\mapsto D \cdot \begin{pmatrix} 4 \\ 6 \end{pmatrix} = \begin{pmatrix} -2 \\ -4 \end{pmatrix} \end{align*}\end{split}\]

Ajungem la:

_images/triunghi-degenerat.png

Fig. 47 Triunghiul \( \Delta ABC \) a fost transformat cu o matrice singulară și a ajuns degenerat: segmentul \( E-D-F \)#

În acest caz, matricea care caracterizează transformarea este singulară: se poate vedea că liniile sale sînt proporționale, ceea ce o face neinversabilă: \( \det D = 0 \). De aceea, transformarea pe care o induce se numește degenerată sau singulară și vedem că, într-adevăr, produce o schimbare a formei triunghiului și se ajunge la un segment (vîrfurile triunghiului devin 3 puncte coliniare).


Veți fi constatat că dintre toate transformările, lipsește chiar cea mai simplă: translația. Aceasta deoarece tratamentul ei matriceal este surprinzător de sofisticat și îl detaliem mai jos.

Translația unui vector din plan \( (a, b) \) cu vectorul \( (t_x, t_y) \) înseamnă vectorul \( (a + t_x, b + t_y) \). Însă acesta nu se poate obține lucrînd cu matrice \( 2 \times 2 \). De aceea, trebuie să aplicăm un artificiu de calcul și să lucrăm cu matrice \( 3 \times 3 \). Astfel, vectorul din plan devine \( (a, b, 1)^t \), iar matricea de translație devine:

\[\begin{split}\begin{pmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{pmatrix} \Rightarrow \begin{pmatrix} a \\ b \\ 1 \end{pmatrix} \cdot \begin{pmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{pmatrix} = \begin{pmatrix} a + t_x \\ b + t_y \\ 1 \end{pmatrix}\end{split}\]

din care extragem primele două componente și obținem punctul (vectorul) translatat.

Rezultă de aici:

Important

Dacă vrem să facem o translație în spațiul tridimensional, avem nevoie de o matrice cu 4 linii și 4 coloane.

Exemplu: Numere complexe#

De fapt, haideți să detaliem un pic un exemplu, mai ales că folosește noțiuni cu care sînteți obișnuiți din clasa a 10a. Pentru aceasta, trebuie să amintim cîteva lucruri elementare privitoare la numere complexe.

Așa cum știți, dacă rezolvăm o ecuație de gradul al doilea, precum x^2 + x + 1 = 0, care are discriminantul negativ, nu putem găsi soluțiile folosind noțiunile cunoscute despre numere reale. Pentru astfel de situații, trebuie să extindem mulțimea numerelor reale cu cea a numerelor complexe. Prin definiție, un număr complex este un număr de forma \(z = a + bi\), unde \(a,b\) sînt două numere reale, iar \(i\) se numește unitate imaginară și are proprietatea surprinzătoare că \(i^2 = -1\).

Detaliul care ne interesează aici este că forma algebrică menționată, \(z = a + bi\), poate fi folosită pentru a reprezenta un punct din plan. Mai precis, se definește afixul unui punct din plan ca fiind numărul complex care îl reprezintă, motiv pentru care mulțimea numerelor complexe se mai numește planul complex. Un punct în plan de coordonate \(A(2,3)\) se află la „lățimea“ 2 pe axa orizontală și „înălțimea“ 3 pe axa verticală. Acestui punct îi corespunde numărul complex, adică afixul, \(z = 2 + 3i\). Să reprezentăm acest punct și să-i trasăm și așa-numitul vector de poziție, adică vectorul care unește originea sistemului de axe cu punctul.

Iată legătura cu geometria: dacă înmulțim afixul punctului \(A\) cu \(i\), obținem afixul \(iz = -3 + 2i\) (amintiți-vă, \(i^2 = -1\)). Plasăm și acest punct în plan și îi trasăm vectorul de poziție. Ce constatați? Înmulțirea cu \(i\) produce o rotație cu 90 grade în jurul originii, în sens invers acelor de ceasornic.

_images/rotatie-complex-complet.png

Fig. 48 Înmulțirea cu \( i \) produce o rotație cu 90 grade#

Înmulțind încă o dată obținem \(-z = -2 - 3i\), care rotește cu încă 90 grade punctul, respectiv vectorul, iar înmulțind încă o dată obținem \(-iz = 3 - 2i\), care mai aplică o rotație. Sîntem la 270 grade față de punctul de pornire, deci dacă mai aplicăm încă o rotație, ajungem la punctul inițial.

Vedem, deci, că o operație algebrică poate avea o însemnătate geometrică atunci cînd lucrăm într-un context potrivit.

O legătură și mai profundă cu transformările despre care am vorbit se poate face dacă interpretăm numerele complexe sub formă de matrice, dar aici ar trebui să intrăm în alte detalii tehnice pe care le omitem, momentan.

Puncte de vedere#

Vă veți întreba, poate, de ce e nevoie de atît de multe calcule matematice pentru transformări pe care, cum bine știți, le puteți face cu mouse-ul. Cum puteți muta o iconiță a unei aplicații pe Desktop, la fel puteți translata un triunghi în plan. Cum puteți roti printr-o apăsare de buton o poză făcută strîmb puteți să rotiți și un elipsoid în spațiul tridimensional.

Aceste observații sînt adevărate și justificate. Dar de ce nu se aplică ele? În special, din două motive. Primul și cel mai evident este că transformări precum rotațiile, translațiile, forfecările etc. se petrec fie în timp real, fie într-o manieră algoritmică. De pildă, dacă într-o scenă o minge a fost lovită, ea trebuie să se translateze uniform, ținînd cont și de legile frecării, pe parcursul unui număr de scene care urmează. Sau dacă o mașină pornește într-o scenă, roțile sale se rotesc pentru un număr de scene controlat de intențiile șoferului și, din nou, de legile fizicii. Chiar dacă astfel de scene sînt pregătite dinainte, deci nu se randează în timp real, evoluția are loc tot algoritmic, sub forma unor instrucțiuni de tipul: dacă jucătorul lovește mingea și dacă forța de frecare = -2N și dacă rata de refresh a monitorului este 60 Hz, atunci mingea se translatează cu viteza de 3 cadre pe secundă timp de 2 secunde. Or astfel de instrucțiuni evident că trebuie programate; nu sîntem la un teatru de păpuși unde cineva să mînuiască toate părțile obiectelor și personajelor din scenă pentru a le muta cadru cu cadru, secundă cu secundă. Nu mai vorbim de impedimentele tehnice: nu știu cîți dintre noi pot face orice fel de mișcare cu o frecvență de 60 Hz, adică de 60 ori pe secundă, cum au monitoarele de generație anterioară, ca să nu zicem de cele moderne, cu rate de refresh de pînă la 240 Hz. De fapt, chiar și cei 24 sau 25 Hz ai cinematografelor pot fi prea mult.

Al doilea motiv, ceva mai important din punct de vedere științific este acela datorat punctelor de vedere. În grafica pe computer, se folosesc, în special, 3 puncte de vedere:

  • al camerei;

  • al obiectului;

  • al monitorului sau ecranului.

Acestea sînt exact ce le spune numele: moduri diferite în care apare o scenă în funcție de punctul de vedere ales. Să presupunem că jucați un meci de fotbal în parc și un prieten vă filmează cu telefonul. Punctul de vedere al camerei este ceea ce se înregistrează pe ecranul telefonului, iar punctul de vedere al obiectului este ceea ce vedeți voi înșivă atunci cînd jucați. Cînd ajungeți acasă, realizați că telefonul a filmat cu un aspect de 16:9, însă monitorul pe care vreți să vedeți înregistrarea are un aspect de 4:3. Așa că sînteți nevoiți să aplicați o transformare de tip crop filmării și astfel obțineți un alt punct de vedere, acela al monitorului sau ecranului.

_images/worldToCameraSpace.png

Fig. 49 Cele 3 sisteme de referință folosite de obicei în grafica 3D pe computer#

Acum, dacă toate cele 3 puncte de vedere – camera, obiectul, monitorul – se concentrează asupra aceluiași obiect – să zicem, mingea de fotbal – o vor vedea diferit. Ecranul, care face crop, o va vedea mai mare și, poate, ușor distorsionată, adică devenită ușor ovală, telefonul, care a filmat-o, poate, cu o distanță focală mică, o va vedea mică, iar jucătorul, adică voi, o veți fi văzut-o la dimensiunile reale.

În grafica pe computer nu vreți să folosiți 3 mingi diferite, de dimensiuni și proporții diferite. Veți folosi aceeași minge, același obiect 3D creat de un grafician sau artist, căruia îi aplicați transformări diferite în funcție de scena curentă: dacă folosiți punctul de vedere al ecranului, o veți turti (forfeca) și mări (rescala) ușor, dacă folosiți punctul de vedere al camerei, îi veți aplica o rescalare subunitară, pentru micșorare și așa mai departe.

Acest argument, împreună cu anteriorul, conform căruia aceste transformări se fac programatic, adică prin cod, algoritmi și formule, ne arată de ce trebuie să putem lucra cu transformări ale planului și spațiului într-un sens cît mai general, apropiat de cel matematic.

În plus, în afară de aspectul mingii sau al obiectelor din scenă, mai intră în discuție și elemente de fizică, cum sînt cele de mecanică relativistă. Știți bine că viteza unui obiect este diferită atunci cînd se raportează la sisteme de referință diferite. Mingea pe care o șutați are o anumită viteză față de voi, o altă viteză față de camera care, să presupunem, este una care se deplasează pe marginea terenului și altă viteză față de monitor, unde, de fapt, șutul se vizualizează printr-o combinație între o translație și o micșorare sau mărire.

Iar privitor la relațiile între cele 3 puncte de vedere sau sisteme de referință, mai amintim că există așa-numitele vizualizări la persoana întîi și cele la persoana a treia. În primul caz, camera se confundă cu obiectul, iar în al doilea, sînt diferite. Oricum, indiferent de sistemul ales de autorii scenelor, cele 3 perspective trebuie analizate separat, pentru că, de exemplu, și într-o scenă la persoana întîi trebuie să se țină cont de eventualele legături între celelalte personaje sau obiecte din afara jucătorului sau a celui care vede la persoana întîi. Într-un joc de aventură la persoana întîi, de exemplu, personajul poate întîlni anumiți inamici sau obiecte cu care poate interacționa (la persoana întîi), dar și obiectele respective pot interacționa între ele. Cînd personajul-jucător privește o astfel de interacțiune – să zicem, un dialog între două personaje secundare – perspectiva este la persoana întîi. Însă interacțiunea dintre cele două personaje secundare se face la persoana a treia, camera fiind chiar personajul-jucător.

Încheiere#

Subiectele pe care le-am deschis putem spune că ating abia cea mai mică parte a introducerii în domeniu. De exemplu, spațiile vectoriale utilizate pot fi uneori surprinzătoare, precum spațiul real de dimensiune 4 al cuaternionilor. Prezentarea matriceală a transformărilor geometrice invită la studii specifice și conține rezultate fundamentale de teoria matricelor. Totodată, problema punctelor de vedere – sau a sistemelor de referință, altfel spus – este una care se tratează din punct de vedere matematic folosind transformările numite schimbare de bază. Și nu am menționat aproape deloc elemente de fizică: mecanică pentru toată dinamica scenei, optică, pentru iluminare corectă și multe altele.

Un detaliu extraordinar care scapă de multe ori din atenție este acesta: atunci cînd creăm o scenă pe computer, sîntem responsabili de a fabrica absolut tot. Dacă desenăm sau modelăm o minge, oricît de realist ar reprezenta-o un artist, computerul nu „știe“ automat să-i atribuie elasticitate, frecare, greutate ș.a.m.d. Un desen al unui soare deasupra unui peisaj montan, indiferent de realismul și de uneltele implicate, nu va fi iluminat ca în realitate fără ca artistul și, ulterior, programatorul, să îi atribuie, să îi definească, dacă vreți, lumina corectă din punct de vedere realist, de la 0.

Din aceste puncte de vedere, grafica pe computer, utilizată în cinematografie, jocuri, simulări sau laborator este, în primul rînd un proces de creație.

Vom mai reveni în episoade viitoare la teme din cadrul acestui subiect și, de asemenea, fiți pe fază, pentru că avem și anunțuri importante privitoare la cursuri și materiale detaliate și avansate, care conțin chiar și elemente de programare pe care vrem să le împărtășim cu voi.

_images/LINALG.png

Fig. 50 SPOILER ALERT!!!#

Pînă data viitoare, cu siguranță nu ați uitat: fiți curioși, puneți întrebări și exersați-vă mintea!