Documente Academic
Documente Profesional
Documente Cultură
GpC_C01
Evaluare:
- proiect BorlandC (echip de maxim 2 studeni) = 30% din nota final
- proiect OpenGL (echip de maxim 2 studeni) = 40% din nota final
- evaluare teoretic individual scris
= 30% din nota final
GpC_C01
Borland C++ ofer o bibliotec separat de peste 70 de functii grafice. Funciile din acest
pachet grafic permit realizarea cu uurin a unor imagini pe ecran, de la diagrame i grafice de
funcii, pn la desene complexe. Linii, poligoane, cercuri, elipse, desenate cu diverse stiluri de linie
i colorate sau haurate n diverse modele, mpreun cu texte de caractere de tipuri i marimi
diferite pot fi transpuse pe ecran prin simple apeluri de funcii. Prezentarea care urmeaz este o
iniiere n utilizarea modului grafic n BGI, insistnd asupra celor mai uzuale operatii, cu
explicaiile necesare nelegerii modului de funcionare a sistemului grafic.
n faza de editare a legturilor este necesar prelucrarea funciilor grafice din biblioteca
grafic. Fiind separat de biblioteca standard, ea nu este inclus n setul de module obiect care sunt
legate implicit.
2
GpC_C01
Nume
Valoare numeric
0
DETECT
1
CGA
2
MCGA
3
EGA
4
EGA64
5
EGAMONO
6
IBM8514
7
HERCMONO
8
ATT400
9
VGA
10
PC3270
Fiecare adaptor admite un numr de moduri de lucru care difer prin rezoluie (numrul de puncte
afisarile pe ecran). Parametrul gmode trebuie sa specifice unul din modurile adaptorului indicat de
gdriver . n acest sens se pot folosi din nou macrodefiniii. De exemplu, pentru adaptorul VGA
exist urmtoarele moduri de lucru:
Driver
Mod
Valoare numeric
Rezoluie
VGALO
0
640 200
VGAMED
1
640 350
VGA
VGAHI
2
640 480
Pentru alte adaptoare:
Driver
Mod
Valoare numeric Rezoluie
CGAC0
0
320 200 (i 4 culori)
CGA
CGAC1
1
320 200 (i 4 culori)
3
GpC_C01
CGAC2
2
320 200 (i 4 culori)
CGAC3
3
320 200 (i 4 culori)
CGAHI
4
640 200 (i 2 culori)
MCGAC0
0
320 200 (i 4 culori)
MCGA
MCGAC1
1
320 200 (i 4 culori)
MCGAC2
2
320 200 (i 4 culori)
MCGAC3
3
320 200 (i 4 culori)
MCGAMED
4
640 200 (i 2 culori)
CMGAHI
5
640 480 (i 2 culori)
EGA
EGALO
0
640 200 (i 16 culori)
EGAHI
1
640 350 (i 16 culori)
EGA64
EGA64LO
0
640 200 (i 16 culori)
EGA64HI
1
640 350 (i 16 culori)
EGAMONO EGAMONOHI
3
640 200 (i 2 culori)
ATT400C0
MCGAC0
0
320 200 (i 4 culori)
ATT400C1
1
320 200 (i 4 culori)
ATT400C2
2
320 200 (i 4 culori)
ATT400C3
3
320 200 (i 4 culori)
ATT400MED
4
640 200 (i 2 culori)
ATT400HI
5
640 400 (i 2 culori)
HERC
HERCMONO
0
720 348 (i 2 culori)
PC3270
PC3270HI
0
640 350 (i 2 culori)
IBM8514
IBM8514LO
0
640 80 (i 256 culori)
IBM8514HI
1
1024 768 (i 256 culori)
Forma unui pixel este dreptunghiular, care influenteaz aspectul informaiei afiate pe ecran.
Pentru monitoarele de tip VGA sau SVGA nu mai este nevoie s se corecteze aspectul pixelului,
prin indicarea raportului aspectual, care poate fi considerat egal cu 1.
Parametrul cale este un ir de caractere care precizeaz calea de cutare a fiierului care
conine driverul gdriver. Dac irul specificat este vid, adic , cutarea se face n directoarele
implicite.
De exemplu, putem folosi urmtorul cod pentru iniializarea modului grafic n CodeBlocks:
int gd = DETECT, gm;
char []= "";
initgraph(&gd,&gm,s);
int coderoare;
coderoare = graphresult();
if (coderoare!= grOk) //nu a reusit instalarea modului grafic
{ cout<<"Eroare grafica: "<<
grapherrormsg(coderoare)<<endl;
//se afiseaza si eroarea
cout<<"Apasati o tasta pt a iesi din program: ";
getch(); exit(1);
}
n locul funciei initgraph(), pentru iniializarea modului grafic, se poate folosi funcia
winbgim initwindow care i deschide fereastra grafic ce are anumite proprieti:
void
initwindow(int
inaltime,
int
latime,
const
char
*titlu=Windows
BGI,
int
sus=0,
int
jos=0,
bool
dbflag=false,
closeflag=true);
unde: primii doi parametri reprezint nlimea i limea ferestrei (n pixeli), al treilea parametru
reprezint un ir de caractere care va fi scris pe titlul ferestrei, urmtorii doi parametri reprezint
coodonatele (n pixeli) de la colul stnga-sus al ferestrei grafice relativ la colul stnga-sus al
4
GpC_C01
ecranului, al 6-lea parametru se refer la utilizarea de buffer dublu pentru fereastr (implicit false),
iar ultimul parametru specific dac apsarea butonului de nchidere al ferestrei poate duce la
ncheierea rulrii programului.
Funcia
int graphresult (void);
Constant
grOK
grNoInitGraph
grNotDetected
grFileNotFound
grInvalidDriver
grNoLoadMem
grNoScamMem
grNoFloodMem
grFontNonFound
grNoFontMem
grInvalidMode
grError
grIOError
grInvalidFont
grInvalidFontNum
grInvalidDeviceNum
grInvalidVersion
Mesaj de eroare
Nicio eroare
Driverul grafic BGI neinstalat (folosii initgraph)
Plac grafic negsit
Fiierul pentru driverul grafic negsit
Fiierul invalid pentru driver grafic
Memorie insuficient pentru driver grafic
Memorie insuficient pentru fill
Memorie insuficient pentru floodfill
Fiier de font negsit
Memorie insuficient pentru ncrcare de fonturi
Mod grafic nepermis pentru driverul selectat
Eroare grafic
Eroare grafic de intrare-ieire
Fiier de font invalid
Numr de font invalid
Numr de driver invalid
Numr de versiune invalid
respectiv
int getmaxy();
De exemplu, pentru modul VGAHI, cu rezoluia de 640 pixeli pe orizontal (de la 0 la 639) i
480 pixeli pe vertical (de la 0 la 479), getmaxx() ntoarce valoarea 639, iar getmaxy() ntoarce
valoarea 479. Aceste funcii sunt utile pentru a asigura dimensionarea i alinierea corect a imaginii,
indiferent de modul grafic.
X
Y
(0,0)
(639,0)
X
O
(0,479)
(orientarea axelor pe hrtie)
(639,479)
Y
(orientarea axelor pe ecranul calculatorului)
GpC_C01
afieaz textul sir_caractere la poziia curent a cursorului grafic, utiliznd atributele stabilite
cu funciile settextstyle i settextjustify , care vor fi prezentate mai jos. n plus, dac
GpC_C01
textul este orizontal cu aliniere la stnga, outtext() avanseaz poziia curent a cursorului grafic
la sfritul textului.
Alinierea textului relativ la poziia curent se realizeaza cu funcia
void settextjustify (int orizontal, int vertical);
unde parametrii specific cum este plasat un text fa de poziia curent dup cum este specificat n
tabelul de mai jos.
Descriere
Nume
orizontal LEFT_TEXT
CENTER_TEXT
RIGHT_TEXT
vertical
BOTTOM_TEXT
CENTER_TEXT
TOP_TEXT
Valoare
0
1
2
0
1
2
Aciune
Poziia curent la stnga textului
Poziia curent n centrul textului
Poziia curent la dreapta textului
Poziia curent la baza textului
P.c. curent n centrul (pe vertical) textului
Poziia curent deasupra textului
unde primul parametru ia una din valorile din coloana nti a tabelului de mai jos (sau
corespondentele numerice din a doua coloan).
Nume
Valoare
Descriere
88 bit-mapped font
DEFAULT_FONT
0
stroked triplex font
TRIPLEX_FONT
1
stroked small font
SMALL_FONT
2
stroked sans serif font
SANS_SERIF_FONT
3
stroked gothic font
4
GOTHIC_FONT
Al doilea parametru poate lua una din valorile din tabelul de mai jos. Valoarea implicit este cea
orizontal, de la stnga la dreapta. Direcia vertical corespunde unei rotaii de 90 de grade n sens
trigonometric.
Nume
Valoare
Descriere
HORIZ_DIR
0
stnga-dreapta
VERT_DIR
1
jos-sus
Al treilea parametru este un factor de scal care afecteaz toate tipurile de caractere. Dac mrime
este 1, atunci fiecare caracter se reprezint pe ecran ntr-un dreptunghi 88 pixeli, iar pentru o
valoare 1<N10 reprezentarea se face pe 8N8N pixeli.
De exemplu:
#include <graphics.h>
#include <conio.h>
#include <string.h>
using namespace std;
int main()
{
initwindow(600,400, "Texte");
setbkcolor(LIGHTBLUE);
cleardevice();
setcolor(YELLOW);
settextstyle(TRIPLEX_FONT, HORIZ_DIR, 2);
moveto(100,100);
//muta cursorul grafic la pozitia (100,100)
char s1[ ]="Text 1";
outtext(s1); //acolo scrie "Text 1" si cursorul se muta la final
GpC_C01
strcpy(s1,"Text 2");
outtext(s1);
//in continuare, scrie "Text 2"
settextjustify (CENTER_TEXT, BOTTOM_TEXT);
strcpy(s1,"Centrul ecranului");
outtextxy(getmaxx()/2,getmaxy()/2,s1);
getch();
closegraph();
return 0;
}
pentru nchiderea sistemului grafic, eliberarea memoriei alocate pentru driver i revenirea la modul
text existent nainte de apelul functiei initgraph() .
Culori
Un punct (pixel) de pe ecranul unui monitor color are o anumit culoare. Setul de culori
disponibil este codificat numeric i depinde de tipul adaptorului grafic i de mod. n cazul
adaptoarelor EGA/VGA sunt disponibile 16 de culori, numerotate de la 0 la 15. Valoarea unui pixel
nu reprezint codul unei culori, ci indexul ntr-un tablou de culori numit palet.
Culoare
Traducere
BLACK
BLUE
GREEN
CYAN
RED
MAGENTA
BROWN
LIGHTGRAY
DARKGRAY
LIGHTBLUE
LIGHTGREEN
LIGHTCYAN
LIGHTRED
LIGHTMAGENTA
YELLOW
WHITE
Negru
Albastru
Verde
Azuriu
Rou
Violet
Maron
Gri deschis
Gri nchis
Albastru deschis
Verde deschis
Azuriu deschis
Rou deschis
Violet deschis
Galben
Alb
Valoare
numerica
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Background
Foreground
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
No
No
No
No
No
No
No
No
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
Yes
n WinGBIm, culorile pot fi specificate i n varianta RGB (red-green-blue = rou-verdealbastru) apelnd funcia
COLOR (int rosu, int verde, int albastru)
unde parametrii au valori ntre 0 i 255.
Fixarea culorii curente de desenare se face cu funcia:
void setcolor(int noua_culoare);
De exemplu:
setcolor(14); // sau setcolor(YELLOW);
GpC_C01
Funcia
int getcolor(void);
Citirea valorii unui pixel de la poziia (x, y) se poate face folosind funcia:
unsigned getpixel(int x, int y);
(x, y).
100
De exemplu:
#include <graphics.h>
#include <conio.h>
using namespace std;
int main() {
initwindow(600,400);
setbkcolor(WHITE);
cleardevice();
setcolor(RED);
putpixel(300,200,RED);
line(100,100,250,250);
getch();
closegraph();
return 0;
}
250
300
100
200
250
Funcii de desenare
Vom lucra n fereastra principal care cuprinde ntreg ecranul, ns cu viewport se pot
delimita zone de ecran care sunt ferestre grafice. Coordonatele funciilor de desenare sunt relative la
fereastra curent i sunt date n pixeli.
Exist o poziie curent n fereastr, ale crei coordonate (x,y) pot fi aflate cu funciile:
int getx(void);
int gety(void);
GpC_C01
Celelalte figuri care pot fi desenate sunt: cercuri, arce, elipse, dreptunghiuri i poligoane.
Prototipurile acestora sunt:
void circle(int x, int y, int raza);
void arc(int x, int y, int unghi_inceput,
int unghi_sfarsit, int raza); //arc de cerc
void ellipse(int x, int y, int unghi_inceput,
int unghi_sfarsit, int raza_x, int raza_y);
//arc de elipsa
void rectangle(int x1, int y1, int x2, int y2);
//traseaza un dreptunghi de la coltul(x1,y1) coltul (x2,y2)
void drawpoly(int nr_puncte, int * coord_puncte);
Pentru un cerc se precizeaz coordonatele centrului i raza, iar pentru un arc de cerc se mai
adaug valorile unghiurilor de nceput i sfrit, cu valori de la 0 la 360 grade. Se poate desena un
cerc complet folosid funcia arc cu unghiul de nceput de 0 grade i unghiul de sfrit de 360
grade.
n mod similar, ellipse deseneaz un arc de elipsa ce poate deveni i o elips ntreag.
10
GpC_C01
De exemplu:
#include <graphics.h>
#include <conio.h>
using namespace std;
int main()
{
initwindow(800,600);
setbkcolor(WHITE); cleardevice();
setcolor(RED);
circle(300,250,100);
//cerc de centru (300,250)
//si raza 100
arc(100,100,25,270,50);
//arc de cerc de centru (100,100) de raza 25,
//trasat de la 270 de grade la 50 grade
ellipse(500,400,0,320,100,50);
//parte din elipsa de centru (500,400)
//trasata de la 0 grade la 320 (aproape intreaga)
//si de semiaxe 100, respectiv 50
rectangle(100,400,200,450);
//dreptunghi de colturi (100,400) si (200,450)
rectangle(500,100,520,120);
//dreptunghi de colturi (500,100) si (520,120)
int triunghi[] = {100,100,200,100,150,175,100,100};
//vector de 4 perechi de puncte, ultima=prima pereche
drawpoly(4,triunghi);
//treseaza linie de la 1-a pereche la a 2-a, de la a 2-a la a 3-a
//si de la a 3-a la a 4-a care este prima => inchide triunghiul
int romb[] = {250,210,290,250,250,290,210,250,250,210};
//5 perechi de puncte
drawpoly(5,romb);
getch();
closegraph();
return 0;
}
Toate aceste figuri sunt desenate folosind culoarea curent (implicit 15, adic WHITE),
fontul curent (implicit 0, adic BLACK) i stilul de linie curent (implicit linie continu, de 1 pixel
grosime).
Pentru a modifica stilul liniei, se folosete funcia:
void setlinestyle(int stil_linie, unsigned u_model,
int grosime);
Modelele posibile pentru stilurile de linie sunt precizate n tabelul urmtor i se folosesc doar pentru
desenarea liniilor, dreptunghiurilor i poligoanelor, pentru c arcele, cercurile i elipsele se
deseneaz ntotdeauna cu linie continu.
Nume simbolic
SOLID_LINE
DOTTED_LINE
CENTER_LINE
DASHED_LINE
USERBIT_LINE
Valoare
0
1
2
3
4
Descriere
Linie continu
Linie punctat
Linie ntrerupt de forma
Linie ntrerupt de forma
Stil definit de utilizator
11
GpC_C01
Dac stil_linie variaz de la 0 la 3, atunci valoarea celui de-al doilea parametru u_model este
ignorata i poate lua orice valoare, iar dac stil_linie este 4, atunci u_model este un numr
hexazecimal pe 16 bii care descrie modul de reprezentare a liniei (1 = pixel de culoarea curent,
0 = pixel de culoarea fontului).
Al treilea parametru, grosimea liniei, afecteaz toate figurile.
Nume simbolic
Valoare Descriere
NORM_WIDTH
1
1 pixel lime
THICK_WIDTH
3
3 pixel lime
De exemplu:
#include <graphics.h>
#include <conio.h>
using namespace std;
int main()
{
initwindow(800,600);
setbkcolor(WHITE); cleardevice();
setcolor(RED);
setlinestyle(DOTTED_LINE,1,NORM_WIDTH);
//actioneaza asupra liniilor, dreptunghiului si poligon, nu cerc, etc
circle(300,250,100);
arc(100,100,25,270,50);
ellipse(500,400,0,320,100,50);
rectangle(100,400,200,450);
rectangle(500,100,520,120);
int triunghi[] = {100,100,200,100,150,175,100,100};
drawpoly(4,triunghi);
int romb[] = {250,210,290,250,250,290,210,250,250,210};
setlinestyle(4,0xff18,3);//4=USERBIT_LINE
drawpoly(5,romb);
getch();
closegraph();
return 0;
}
unde primul parametru ia o valoare din prima coloan a tabelului de mai jos sau corespondentul din
a doua coloan.
Nume model
EMPTY_FILL
SOLID_FILL
LINE_FILL
LTSLASH_FILL
SLASH_FILL
BKSLASH_FILL
LTBKSLASH_FILL
HACH_FILL
XHATCH_FILL
INTERLEAVE_FILL
Valoare
0
1
2
3
4
5
6
7
8
9
Descriere
Umple cu culoarea de font
Umple uniform (toi pixelii)
Haur orizontal
Haur ///
Haur /// cu linii groase
Haur \\\ cu linii groase
Haur \\\
Haur n cruce ++
Haur n cruce oblic
Haur cu ntreesere
12
WIDE_DOT_FILL
CLOSE_DOT_FILL
USER_FILL
10
11
12
GpC_C01
unde primul parametru este un ir de 8 caractere (octei), care poate defini o matrice de 88 pixeli,
fiecare bit fiind asociat unui pixel. De exemplu,
setfillpattern(model,LIGHTGREEN);
Colorarea figurilor nchise (de exemplu realizate cu circle, arc, drawpoly) poate realiza cu
funcia
void floodfill (int x, int y, int culoare_contur);
Funcia folosete modelul i culoarea de haurare curente (specificate cu funcia setfillstyle )
pentru a umple suprafaa care conine punctul (x, y) i este mrginit de un contur cu culoarea
indicat ca ultim parametru.
De exemplu, pentru realizarea desenul de mai jos se poate proceda astfel:
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;
int main()
A-B AB
{
initwindow(600,400);
setcolor(YELLOW);
//contur galben
circle(250,250,100);//cercul din stanga (multimea A)
circle(370,250,100); //cercul din dreapta (multimea B)
B-A
13
GpC_C01
Pentru desenarea i colorarea imediat a figurilor exist un set de funcii separat. Se pot
desena i colora dreptunghiuri, elipse, poligoane, sectoare de cerc sau elips i bare tridimensionale
folosind funciile:
void bar (int x1,int y1,int x2,int y2); //dreptunghi doar hasurat, fara contur
void fillellipse (int x, int y, int raza_x, int raza_y);
//elipsa intreaga
void fillpoly (int numar_puncte, int *coord_puncte);
//poligon
void pieslice (int x, int y, int unghi_inceput,
int unghi_sfarsit, int raza); //arc de cerc
void sector (int x, int y, int unghi_inceput,
int unghi_sfarsit int raza_x, int raza_y);//arc de elipsa
void bar3d (int x1, int y1, int x2, int y2, int adancime,
int varf_in_trei_dimensiuni);//paralelipiped
14