You are on page 1of 7

Ministerul Educaiei al Republicii Moldova

Facultatea Calculatoare Informatic i Microelectronic





Referat
La disciplina: GAC
Lucrare de Laborator Nr.3



Tema:
TRANSFORMRI GEOMETRICE
2D A IMAGINILOR


A afectuat:

A verificat






Chiinu 2014
Sarcina
Elaborarea programului de rotire, scalare i deplasare a imaginilor n plan i n spaiu
Extragei la ecran un triunghi de culoarea R.
Extragei la ecran un ptrat de culoarea S.
ndeplinii transformarea tuturor punctelor de culoarea S n conformitate cu
variant 3. Punctul ce se deplaseaz se recoloreaz n culoarea R. Pentru
determinarea culorii punctului folosii procedura GetPixel.


var. rotirea scalare deplasarea
3 45 x*1.6 x+20, y+40


Descrierea teoretic

Transformare de vizualizare 2D
Este transformarea care trebuie sa fie aplicata coordonatelor oricrei reprezentri
grafice descrise intr-un sistem de coordonate carteziene diferit de cel ataat
dispozitivului de vizualizare. Pentru exprimarea sa matematica se definesc doua
dreptunghiuri cu laturile paralele cu axele sistemului de coordonate: unul n sistemul de
coordonate n care este descrisa reprezentarea grafica, celalalt n sistemul de coordonate
al dispozitivului de afiare (de exemplu, al ecranului). Cele doua dreptunghiuri sunt
numite "fereastra", respectiv "poarta de vizualizare" sau pe scurt "poarta".
Transformarea de vizualizare 2D, numita i transformarea fereastra-poarta este
definita astfel incit poziia relaiva a unui punct (xf,yf) n fereastra sa fie aceeai cu
poziia relaiva a punctului (xp, yp) n poarta, unde (xp, yp) este punctul obinut prin
transformarea lui (xf,yf).
Din punct de vedere matematic transformarea este definita astfel:
y y f p
x x f p
t *s y y
t *s x x



unde s
x
i s
y
sunt factorii de scalare ai transformrii, care se calculeaz n funcie de
mrimea ferestrei i a porii; t
x
i t
y
este translaia presupusa de transformare,
determinata de poziiile celor doua dreptunghiuri, fereastra i poarta, n sistemele de
coordonate la care sunt raportate.
Formula transformrii se modifica pentru a se tine cont de faptul ca axa OY a
ecranului este orientat n jos. De asemenea, daca pentru asigurarea decuprii la
frontiera porii se folosete funcia setviewport, formula se corecteaz tiind ca toate
coordonatele transmise funciilor de afiare sunt considerate relative la originea porii de
vizualizare.




Programul


#include<stdio.h>
#include<math.h>
#include<graphics.h>
#include<conio.h>
#include<dos.h>
#include <fstream.h>

//declararea constantelor initiale
int maxx, maxy, color, x, y, raza=90, ini1=500, ini2=500;

// functia aranjarii patratului
void patrat ( int i, int ini1, int ini2, float raza )
{
line(ini1+raza*cos(3.1415*i/180),ini2+raza*sin(3.1415*i/180),ini1+raza*cos(3.1415*
(i+90)/180),ini2+raza*sin(3.1415*(i+90)/180));
line(ini1+raza*cos(3.1415*(i+90)/180),ini2+raza*sin(3.1415*(i+90)/180),ini1+raza
*cos(3.1415*(i+180)/180),ini2+raza*sin(3.1415*(i+180)/180));
line(ini1+raza*cos(3.1415*(i+180)/180),ini2+raza*sin(3.1415*(i+180)/180),ini1+raza
*cos(3.1415*(i+270)/180),ini2+raza*sin(3.1415*(i+270)/180));
line(ini1+raza*cos(3.1415*i/180),ini2+raza*sin(3.1415*i/180),ini1+raza*cos(3.1415*
(i-90)/180),ini2+raza*sin(3.1415*(i-90)/180));
}

// functia aranjarii triunghiului
void triungi ( int i, int ini1, int ini2, float raza )
{
line(ini1+raza*cos(3.1415*i/180),ini2+raza*sin(3.1415*i/180),ini1+raza*cos(3.1415*
(i+120)/180),ini2+raza*sin(3.1415*(i+120)/180));
line(ini1+raza*cos(3.1415*(i+120)/180),ini2+raza*sin(3.1415*(i+120)/180),ini1+raza
*cos(3.1415*(i+240)/180),ini2+raza*sin(3.1415*(i+240)/180));
line(ini1+raza*cos(3.1415*(i)/180),ini2+raza*sin(3.1415*(i)/180),ini1+raza*cos(3.1
415*(i-120)/180),ini2+raza*sin(3.1415*(i-120)/180));
}

int main () // functia principala
{
//declarerea driverul GRAPHICS
int gd=DETECT, gm, ini1, ini2, raza, i;

initgraph(&gd,&gm,""); //initializarea driverul GRAPHICS

maxx=getmaxx(); // Aflam valoarea pixelului maxim pe orizontala.
maxy=getmaxy(); // Aflam valoarea pixelului maxim pe verticala.

//aranjare figurilor initiale
outtextxy(220,20,"FIGURILE SOLICITATE");
//functia aranjarii textului

setcolor(BLUE);
patrat(i,maxx/2-100,maxy/2,50);
//chemarea functiei patrat();

setcolor(RED);
triungi(i,maxx/2+50,maxy/2,50);
//chemarea functiei triunghi();

getch();


setcolor(15); cleardevice();



//rotirea figurilor
outtextxy(220,20,"ROTIREA FIGURILOR");

for(i=0;i<45;i++) // Ciclu de rotire a figurelor.
{
setcolor(BLUE);
patrat(i,maxx/2-100,maxy/2,50);
setcolor(RED);
triungi(i,maxx/2+50,maxy/2,50);
delay(10);
setcolor(BLACK);
patrat(i,maxx/2-100,maxy/2,50);
triungi(i,maxx/2+50,maxy/2,50);
}

setcolor(BLUE);
patrat(i,maxx/2-100,maxy/2,50);
setcolor(RED);
triungi(i,maxx/2+50,maxy/2,50);

getch(); setcolor(15); cleardevice();

//scalarea figurilor
outtextxy(220,20,"SCALAREA FIGURILOR");

for(raza=50;raza<50*1.6;raza++) // Ciclu de scalare a figurilor.
{
setcolor(BLUE);
patrat(200,maxx/2-100,maxy/2,raza);
setcolor(RED);
triungi(200,maxx/2+50,maxy/2,raza);
delay(20);
setcolor(BLACK);
patrat(200,maxx/2-100,maxy/2,raza);
triungi(200,maxx/2+50,maxy/2,raza);
}

setcolor(BLUE);
patrat(200,maxx/2-100,maxy/2,raza);
setcolor(RED);
triungi(200,maxx/2+50,maxy/2,raza);

getch(); setcolor(15); cleardevice();

//deplasarea figurilor
outtextxy(220,20,"DEPLASAREA FIGURILOR");

for(x=0,y=0; x<20; x++,y++) // Ciclu de deplasare a figurilor.
{
setcolor(BLUE);
patrat(200,maxx/2-100+x*2,maxy/2+y,raza);
setcolor(RED);
triungi(200,maxx/2+50+x*2,maxy/2+y,raza);
delay(20);
setcolor(BLACK);
patrat(200,maxx/2-100+x*2,maxy/2+y,raza);
triungi(200,maxx/2+50+x*2,maxy/2+y,raza);

if(x==19)
{
setcolor(BLUE);
patrat(200,maxx/2-100+x*2,maxy/2+y,raza);
setcolor(RED);
triungi(200,maxx/2+50+x*2,maxy/2+y,raza);}}
getch();



//recolorarea figurilor
setcolor(15);outtextxy(220,20,"RECOLORAREA FIGURILOR");

for(x=0;x<640;x++) // Ciclu de recolorare a figurilor.
for(y=0;y<480;y++)
{
color=getpixel(x,y);
if(color==RED) putpixel(x,y,BLUE);
if(color==BLUE) putpixel(x,y,RED);
}
getch();

closegraph(); //inchiderea driverul GRAPHICS !!!

return 0;
}
































Rezultate obtinute






Concluzie:

Efectuind lucrarea data am fcut cunotin cu metodele i algoritmii de
reprezentare grafic a figurilor 2D.
In loc de figure 2D am utilizat patrat si triunghi. Am realizat niste actiuni asupra
lor. Adica: rotirea, scalare si deplasarea conform variantul meu 3.
Lucrarea data am facut cu ajutorul functii, pe care le-am chemat din functia
principala: main(). Inca cu ajutorul multor functii primitive: line(x1,y1,x2,y2),
setcolor(c), outtextxy(x,y,) si alte