Sunteți pe pagina 1din 10

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei


Calculatoare Informatic si Microelectronic
Catedra Automatica i Tehnologii Informaionale

Raport
LUCRAREA DE LABORATOR 2
la disciplina

Grafica pe calculator

Tema:

Transformri geometrice 2D

A efectuat:

gr. MI-141
Cazacliu Ion

A verificat:

conf. univ.
V. Moraru

Chiinau 2016

Varianta 13
Transformri Geometrice 2D

Scopul lucrrii: Realizarea practic a transformrilor geometrice bidimensionale


Sarcina lucrrii:
1. Elaborat i un program pentru rotire, scalare s i translat ie a obiectelor n plan.
.

a) Desenat i un triunghi de culoarea R s i un patrat de culoarea S. Aleget i dimensiuni s i pozit ii


convenabile pentru vizualizare.

b) Realizat i transformarea tuturor pixelilor de culoarea S n conformitate cu variantele din


tabelul 2. Pixelii transformat i se vor colora n culoarea R. Pentru determinarea culorii
pixelilor folosit i primitiva grafica getpixel iar pentru a efectua transformarile utilizat i
exclusiv primitiva putpixel sau una echivalenta (s i nu o funct ie de biblioteca). Rotirea se va
efectua n jurul unui punct la alegerea studentului care va trebui ment ionat n raport.
Tabelul 2. Variantele de ndeplinire a lucrrii

2. Sa se roteasca un patrat necolorat (construit din linii) n jurul centrului ecranului. Se vor
efectua n rotat ii succesive (n sensul trigonometric) cu pasul 2/n . Aleget i orice valoare n>10.
Exemplu de ndeplinire a rotat iei pentru n=10

3. Se considera originea sistemului de coordonate n centrul ecranului. Sa se deseneze un patrat


(centrul patratului diferit de centrul ecranului) s i apoi sa se realizeze oglindirea lui fat a de
dreapta y = x s i y = x .
4. Se considera un avion descris ntr-un sistem de coordonate propriu prin: A(-30,0), B(-5,30),
C(-5,40), D(0,45), E(5,40), F(5,30), G(30,0), H(5,20), I(5,-30), J(15,-40), K(0,-35), L(-15,-40),
M(-5,-30), N(-5,20). Sa se roteasca avionul n jurul centrului ecranului n sens trigonometric.
Avionul va fi init ial orientat la dreapta s i deplasat fat a de centru cu 150 pixeli n jos. Pentru
afis area avionului ntr-o noua pozit ie, se utilizeaza un timer cu ajutorul caruia la un anumit
interval de timp se actualizeaza suprafat a de desenare. Daca e necesar efectuat i o scalare pentru
o reprezentare convenabila a deplasarii avionului pe ecran. Aleget i pasul deplasarii s i durata
timer-ului (valorile lor maxime) pentru care deplasarea avionului pe ecran devine fluida s i
ment ionat i aces ti parametri n raport.

Listingul Programului:

#include
#include
#include
#include

<stdio.h>
<conio.h>
<graphics.h>
<math.h>

#
#
#
#

PI 3.14159265
ROUND(a) ((int)(a+0.5))
ptx(x) x + 320
pty(y) 240 - y

define
define
define
define

# define tx(x) 320 - x


# define ty(y) 240 - y
int width = 600;
int height = 600;
void avion(int xf, int yf, int fi, int S) {
int newTable[width][height];
int x, y;
int newx, newy;
for (x = 120; x < 480; x++)
for (y = 120; y < 480; y++)
newTable[x][y] = getpixel(x, y);
cleardevice();
for (x = 120; x < 480; x++)
for (y = 120; y < 480; y++)
if ( newTable[x][y] == S ) {
newx = (int)round((x*cos(fi* PI / 180.0)) - (y*sin(fi* PI /
180.0)) + xf - (xf*cos(fi* PI / 180.0)) + (yf*sin(fi* PI / 180.0)));
newy = (int)round((x*sin(fi* PI / 180.0)) + (y*cos(fi* PI /
180.0)) + yf - (xf*sin(fi* PI / 180.0)) - (yf*cos(fi* PI / 180.0)));
putpixel(newx, newy, S);
newTable[x][y] = BLACK;
}
}
void DrawCordinates()
{
setlinestyle(1, 0, 1);
line(320,0,320,640);
line(0,240,640,240);
setlinestyle(0, 0, 1);
}
int main()
{
int gd=DETECT,gm;
int ang,c,k=0,x1,y1,sh,shx,shy,c1,lung, lat, n = 10, newx, newy, xf =
300, yf = 300;
float sx, sy;
int patrat[20],triunghi[10],choice,i,tdx,tdy,shchoice;
int x,y;
initgraph(&gd,&gm,"C:\\TC\\BGI");
DrawCordinates();
//Patrat
patrat[0] = ptx(20);
patrat[1] = pty(20);
patrat[2] = ptx(70);
patrat[3] = pty(20);
patrat[4] = ptx(70);
patrat[5] = pty(70);
patrat[6] = ptx(20);
patrat[7] = pty(70);
patrat[8] = patrat[0];
patrat[9] = patrat[1];
setfillstyle(1, 2);
fillpoly(5,patrat);
//Triunghi

triunghi[0] = tx(20);
triunghi[1] = ty(20);
triunghi[2] = tx(70);
triunghi[3] = ty(20);
triunghi[4] = tx(70);
triunghi[5] = ty(70);
triunghi[6] = triunghi[0];
triunghi[7] = triunghi[1];
setfillstyle(1, 1);
fillpoly(4, triunghi);
//Avion
printf("Aceste 2 figuri se vor folosi pentru transformari 2D\nTastati
pentru a continua...");
getch();
closegraph();
do
{
printf("\n****************MENU***************\n");
printf("\n1.Translare\n2.Rotire\n3.Scalare\n4.Oglindire\n5.Avion\n\n6.Iesire"
);
printf("\nAlegerea este ? : ");
scanf("%d",&choice);
switch(choice)
{
case 1:
initgraph(&gd,&gm,"c:\\turboc3\\bgi");
DrawCordinates();
drawpoly(5,patrat);
printf("\nIntroduceti vectorul de translare (tx,ty):
");
scanf("%d%d",&tdx,&tdy);
for(i=0;i<8;i=i+2)
{
patrat[i]=patrat[i]+tdx;
patrat[i+1]-=tdy;
}
patrat[8]=patrat[0];
patrat[9]=patrat[1];
setfillstyle(1, 1);
fillpoly(5,patrat);
getch();
closegraph();
break;
case 2:
{
double fi;
char c='q';
initwindow(width, height);
do {
//patrat
x = 250;
y = 200;
lung = 100;
lat = 100;
setcolor(LIGHTRED);
line(x, y, x, y-lat);
line(x, y-lat, x + lung, y-lat);
line(x + lung, y-lat, x + lung, y);
line(x, y, x+lung, y);

c=getch();
} while (c!='\r');
lung = 100;
lat = 100;
n = 15;
fi = 360.0/n;
i = 0;
while (i <= n) {
y = 200;
for (x = 250; x <= 350; x++)
for (y = 200; y >= 100; y--)
if ( getpixel(x, y) != BLACK ) {
newx = (int)round((x*cos(fi* PI /
180.0)) - (y*sin(fi* PI / 180.0)) + xf - (xf*cos(fi* PI / 180.0)) +
(yf*sin(fi* PI / 180.0)));
newy = (int)round((x*sin(fi* PI /
180.0)) + (y*cos(fi* PI / 180.0)) + yf - (xf*sin(fi* PI / 180.0)) (yf*cos(fi* PI / 180.0)));
// std::cout << newx << " " << newy <<
" " << x << " " << y << std::endl;
putpixel(newx, newy, LIGHTRED);
}
i++;
fi += 360.0/n;
}
}
break;
case 3:
initgraph(&gd,&gm,"c:\\turboc3\\bgi");
DrawCordinates();
drawpoly(5,patrat);
printf("\nIntroduceti vectorul de scalare (tx,ty):
");
scanf("%f%f",&sx,&sy);
for(i=2;i<8;i=i+2)
{
patrat[i]=patrat[i]*sx+patrat[0]*(1-sx);
patrat[i+1]=patrat[i+1]*sy+patrat[1]*(1-sy);
}
patrat[8]=patrat[0];
patrat[9]=patrat[1];
setfillstyle(1, 1);
fillpoly(5,patrat);
getch();
closegraph();
break;
case 4:
initgraph(&gd,&gm,"c:\\turboc3\\bgi");
DrawCordinates();
drawpoly(5,patrat);
printf("\n1.Axa - Y\n2.Axa - X\n\n3.Iesire\n");
scanf("%d",&c1);
switch(c1)
{
case 1:
for(k=0;k<8;k=k+2)
{
x1=patrat[k];
y1=patrat[k+1];
patrat[k]=320-(x1-320);
patrat[k+1]=y1;
}

patrat[8]=patrat[0];
patrat[9]=patrat[1];
setfillstyle(1, 1);
fillpoly(5,patrat);
getch();
break;
case 2:
for(k=0;k<8;k=k+2)
{
x1=patrat[k];
y1=patrat[k+1];
patrat[k]=x1;
patrat[k+1]=240-(y1-240);
}
patrat[8]=patrat[0];
patrat[9]=patrat[1];
setfillstyle(1, 1);
fillpoly(5,patrat);
getch();
break;
case 3:
break;
}
closegraph();
break;
case 5:
{
char c='q';
initwindow(width, height);
do {
setcolor(YELLOW);
line(265, 460, 270, 455);
line(270, 455, 300, 455);
line(300, 455, 290, 475);
line(290, 475, 310, 455);
line(310, 455, 330, 455);
line(330, 455, 340, 450);
line(340, 450, 330, 445);
line(330, 445, 310, 445);
line(310, 445, 290, 425);
line(290, 425, 300, 445);
line(300, 445, 270, 445);
line(270, 445, 265, 440);
line(265, 440, 270, 450);
line(270, 450, 265, 460);
int n = 36;
int i = 1;
int fi;
while (i < 40) {
avion(300, 300, 330, YELLOW);
}
c=getch();
} while (c!='\r');
}
break;
case 6:
exit(0);
}
}while(choice!=6);
}

Anex :
1.

2.

3.

4.

5.

6.

7.

Concluzie:
n urma efecturii lucrrii de laborator nr2. cu tema Transformri grafice 2D.
am obinut cunotinele despre diverse tipuri de transformari grafice 2D care se folosesc n
procesul de formare a imaginilor, i permit desenarea la o scar dorit, detaliere, deplasare ,
rotaie etc. n prima parte am implimentat transformrile grafice ca Scalarea, Translaia,
Rotaia a unei figure geometrice faa de un punct fix. La punctul 2 am rotit un ptrat
de n rotaii successive cu pasul 2*pi/n. n partea a 3-a a lucrrii am efectuat oglindirea unui
ptrat fa de exele y = x i y = -x iar n ultima parte a lucrrii de laborator am rotit un avion n
sensul trigonometric n jurul centrului ecranului.