Când realizați grafică 2D, vi se oferă un dreptunghi în care doriți să desenați niște primitive grafice. Primitivele sunt specificate folosind un sistem de coordonate pe dreptunghi. Ar trebui să fie posibil să selectați un sistem de coordonate adecvat aplicației. De exemplu, dacă dreptunghiul reprezintă un plan de etaj pentru o cameră de 15 picioare pe 12 picioare, atunci este posibil să doriți să utilizați un sistem de coordonate în care unitatea de măsură este un picior, iar coordonatele variază de la 0 la 15 pe direcția orizontală și de la 0 la 12 pe direcția verticală. Unitatea de măsură în acest caz este picioarele, nu pixelii, iar un picior poate corespunde mai multor pixeli din imagine. Coordonatele unui pixel vor fi, în general, numere reale, nu numere întregi. De fapt, este mai bine să uitați de pixeli și să vă gândiți doar la punctele din imagine. Un punct va avea o pereche de coordonate date de numere reale.
Pentru a specifica sistemul de coordonate pe un dreptunghi, trebuie doar să specificați coordonatele orizontale pentru marginile stânga și dreapta ale dreptunghiului și coordonatele verticale pentru partea superioară și inferioară. Să numim aceste valori stânga, dreapta, sus și jos. Adesea, ele sunt considerate xmin, xmax, ymin și ymax, dar nu există niciun motiv să presupunem că, de exemplu, sus este mai mic decât jos. Am putea dori un sistem de coordonate în care coordonata verticală crește de jos în sus în loc de de sus în jos. În acest caz, sus va corespunde valorii y maxime în loc de valoarea minimă.
Pentru a permite programatorilor să specifice sistemul de coordonate pe care doresc să îl utilizeze, ar fi bine să existe o subrutină precum
setCoordinateSystem(left,right,bottom,top)
Sistemul grafic ar fi apoi responsabil pentru transformarea automată a coordonatelor din sistemul de coordonate specificat în coordonate de pixeli. O astfel de subrutină s-ar putea să nu fie disponibilă, așa că este util să vedem cum se face transformarea manual. Să luăm în considerare cazul general. Având coordonatele pentru un punct dintr-un sistem de coordonate, dorim să găsim coordonatele pentru același punct într-un al doilea sistem de coordonate. (Rețineți că un sistem de coordonate este doar o modalitate de a atribui numere punctelor. Punctele sunt reale!) Să presupunem că limitele orizontale și verticale sunt oldLeft, oldRight, oldTop și oldBottom pentru primul sistem de coordonate și sunt newLeft, newRight, newTop și newBottom pentru al doilea. Să presupunem că un punct are coordonate (oldX, oldY) în primul sistem de coordonate. Vrem să găsim coordonatele (newX, newY) ale punctului în al doilea sistem de coordonate.
Formulele pentru newX și newY sunt apoi date de
newX = newLeft + ((oldX - oldLeft) / (oldRight - oldLeft)) * (newRight - newLeft)) newY = newTop + ((oldY - oldTop) / (oldBottom - oldTop)) * (newBotom - newTop)
Logica aici este că oldX este situat la o anumită fracțiune din distanța de la oldLeft la oldRight. Această fracție este dată de
((oldX - oldLeft) / (oldRight - oldLeft))
Formula pentru newX spune pur și simplu că newX ar trebui să se afle la aceeași fracție a distanței de la newLeft la newRight. De asemenea, puteți verifica formulele testând dacă funcționează atunci când oldX este egal cu oldLeft sau cu oldRight și când oldY este egal cu oldBottom sau cu oldTop.
Ca exemplu, să presupunem că vrem să transformăm un sistem de coordonate cu numere reale cu limite stânga, dreapta, sus și jos în coordonate de pixeli care variază de la 0 la stânga la 800 la dreapta și de la 0 la vârf la 600 la jos. În acest caz, newLeft și newTop sunt zero, iar formulele devin simplu
newX = ((oldX - left) / (right - left)) * 800 newY = ((oldY - top) / (bottom - top)) * 600
Desigur, aceasta dă newX și newY ca numere reale și vor trebui rotunjite sau trunchiate la valori întregi dacă avem nevoie de coordonate întregi pentru pixeli. Transformarea inversă – trecerea de la coordonatele pixelilor la coordonate de numere reale – este, de asemenea, utilă. De exemplu, dacă imaginea este afișată pe ecranul unui computer și doriți să reacționați la clicurile mouse-ului pe imagine, probabil veți obține coordonatele mouse-ului în termeni de coordonate întregi de pixeli, dar veți dori să transformați acele coordonate de pixeli în propriul sistem de coordonate ales.
În practică, însă, de obicei nu va trebui să faceți transformările singuri, deoarece majoritatea API-urilor grafice oferă o modalitate de nivel superior pentru a specifica transformările.
Sursa: David J. Eck, Introduction to Computer Graphics (Eck), LibreTexts, licența CC BY-NC-SA 4.0. Traducere și adaptare Nicolae Sfetcu
Descoperă mai multe la MultiMedia
Abonează-te ca să primești ultimele articole prin email.

Lasă un răspuns