Sunteți pe pagina 1din 14

Grafic pe calculator (26.02.

2015) Informatica, anul 1

GpC_C01

GRAFIC PE CALCULATOR - INTRODUCERE


Aplicaiile grafice se realizeaz prin utilizarea urmtoarelor clase de produse software:
editoare grafice, biblioteci grafice, programe grafice specializate, desktop publishing, worksheet
graphics (birotic).
Editoarele grafice sunt destinate prelucrrii grafice n domeniul proiectrii asistate de
calculator dintre produsele care nglobeaz editoare grafice amintim: Auto Cad, Freelanec 2 Plus,
Windows Paint, Corel Draw.
Bibliotecile grafice sunt destinate prelucrrilor prin intermediul limbajelor de programare
de nivel nalt (Pascal, C, Open GL, Visual Basic, Visual C, Delphi). Acestea con in biblioteci cu
rutine (primitive) grafice care realizeaz funcii grafice necesare aplicaii grafice.
Programe grafice specializate sunt destinate rezolvrii problemelor din anumite domenii,
oferind utilizatorului s enune probleme ct mai simplu i n concordan cu limbajul utilizat n
domeniul su. De exemplu: Matlab, Mathematica, Mathcad.
Desktop publishing sunt produse software destinate realizrii de publicaii (ziare, reviste,
reclame, etc.) la birou, parcurgnd toate etapele dintr-o tipografie clasic. De exemplu: Xerox
Ventura Publisher care este compatibil cu mai multe procesoare de text si cu unele editoare grafice,
Pagemaker, Xpress, Super Paint, Publish IT, etc.
Worksheet graphics (birotic) sunt produse software destinate aplicaiilor de eviden din
domeniul financiar-bancar care pot realiza: analiza vnzrilor, tabele de ctiguri i pierderi, salarii,
etc, grafica fiind folosit la prezentarea ieirilor sub form de diagrame, grafice, tabele, etc.
Un exemple de astfel de produse: Lotus i Quattro.

PROGRAMAREA N MODUL GRAFIC BGI (Borland Graphics Interface)


Bibliografie selectiv:
1. M. Vlada, I. Nistor, A. Posea, C. Constantinescu, Grafic pe calculator n limbajele Pascal i C.
Implementare i aplicaii. Vol. I, II. Editura Tehnic, Bucureti, 1992.
2. F.Moldoveanu, Z.Racovi, .Petrescu, G.Hera, M.Zaharia, Grafic pe calculator, Editura
Teora, 1996.
3. Liviu Negrescu, Lavinia Negrescu, Limbaje C i C++ pentru nceptori. Vol IV Probleme de
optimizare i grafic, Editura Albastr, Cluj-Napoca, 2006.
4. Marin Popa, Mariana Popa, Elemente de algoritmi i limbaje de programare, Editura
Universitii din Bucureti, 2005, pg.373-446.
5. E. Petrior. Modelare geometric algoritmic. Editura Tehnic, Bucureti, 2001.
6. D. Dogaru, Grafic pe calculator, Editura Didactic i Pedagogic, Bucureti, 1995.
7. D. Petcu, L. Cucu, Principii ale graficii pe calculator. Editura Excelsior, Timioara 1995
(http://web.info.uvt.ro/~petcu/didactic/graf_eub.pdf)
8. Dick Oliver, Fractali, Editura Teora, 1992.

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

Grafic pe calculator (26.02.2015) Informatica, anul 1

GpC_C01

Grafic BGI folosit CodeBlocks:


Pentru a lucra n modul grafic n CodeBlocks, folosind rutine grafice cunoscute n varianta
Borland, este necesar bilioteca WinBGIm 6.0 (Windows BGI with mouse) http://www.codecutter.net/tools/winbgim. Arhiva conine n dou directoare 3 fisiere (graphics.h,
winbgim.h, libbgi.a). Acestea se vor copia pe calculator n urmtoarele directoare:
- n \MinGW\include (de exemplu, eu am C:\OJI\CodeBlocks\MinGW\include) se copiaz
fiierele: graphics.h i winbgim.h;
- n \MinGW\lib (de exemplu, eu am C:\OJI\CodeBlocks\MinGW\lib) se copiaz fiierul:
libbgi.a.
Atenie! Este o eroare strecurat in fiierul graphics.h (intentionata sau nu) : la linia 302,
variabila right este declarat de dou ori, dar ar fi trebuit ca prima variabil right s fie de fapt top.
Aadar, n locuii numele primei variabile right cu top.
Apoi, n orice proiect de grafic BGI, mai trebuie fcut o setare: la opiunea Proiect din
meniu -> Build Options -> tab-ul Linker Settings -> cmpul Other linker options trebuie
introdus textul: -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32

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

Grafic pe calculator (26.02.2015) Informatica, anul 1

GpC_C01

Utilizarea sistemului grafic presupune i includerea fiierului antet:


#include <graphics.h> sau #include "graphics.h"
sau
#include <winbgim.h> sau
#include " winbgim.h"
La lansarea n execuie a programului, de obicei adaptorul video lucreaz n mod text i nu
mod grafic. Din acest motiv, pentru utilizarea sistemului grafic se face mai nti ncrcarea de pe
disc i instalarea n memorie a unui driver corespunztor tipului de adaptor cu care este echipat
calculatorul i trecerea adaptorului video ntr-un mod grafic.
Pachetul BGI ofer drivere pentru urmtoarele tipuri de adaptoare grafice:
- Color Graphics Adapter (CGA)
- Multi Color Graphics Adapter (MCGA)
- Enhanced Graphics Adapter (EGA)
- Video Graphics Array (VGA)
- Hercules Graphics Adapter (HERCMONO)
- AT&T 400 line graphics adapter (ATT400)
- 320 PC graphics adapter (PC3270),
- IBM 8514 graphics adapter (IBM8541).
Fiecare adaptor grafic poate opera n mai multe moduri, utilizatorul este cel care va specifica
modul de lucru. Driverul i adaptorul grafic trebuie s fie n concordan cu sistemul video existent
pe calculator.
Pentru a determina corect resursa video a calculatorului i pentru a iniializa sistemul grafic
este necesar apelarea funciei
void initgraph(int * gdriver, int * gmode, char * cale);
Parametrul gdriver indic driverul care trebuie instalat. Specificarea lui este simplificat se un set
de macrodefiniii din graphics.h , prezentate tabelul urmtor.

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

Grafic pe calculator (26.02.2015) Informatica, anul 1

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

Grafic pe calculator (26.02.2015) Informatica, anul 1

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);

returneaz o constant ce reprezint codurile de eroare:


Cod eroare
0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15
-18

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

Pentru determinarea rezoluiei (modului grafic curent) pe orizontal i pe vertical, se pot


folosi funciile:
int getmaxx(void);

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)

Grafic pe calculator (26.02.2015) Informatica, anul 1

GpC_C01

Aplicaie: Afiarea pe ecran a valorilor returnate de getmaxx() i getmaxy().


#include <graphics.h> //sau #include <winbgim.h>
#include <iostream>
#include <stdlib.h> //pt exit
#include <conio.h> //pt getch
using namespace std;
int main() {
//int gd = DETECT, gm,
//char s[]="";
//initgraph(&gd,&gm,s);
initwindow(600,400,"Afisare rezolutie ecran",100,100);
int coderoare = graphresult();
if (coderoare != grOk) {
cout<<"Eroare grafica: "<<grapherrormsg(coderoare)<<endl;
cout<<"Apasati o tasta pt a iesi din program: ";
getch();
exit(1);
}
setbkcolor(WHITE); //setam culoarea fundalului la alb
cleardevice();
//se sterge fereastra grafica (se umple folosind culoarea de fundal)
setcolor(BLACK); //culoare de desenare / scriere
char s1[4],s2[4];
//siruri de 3 caractere maxim (+caracterul sfarsit de fisier)
itoa(getmaxx(),s1,10);
//se converteste valoarea intreaga getmaxx() in sirul de caractere s1,
//lasat in baza 10
itoa(getmaxy(),s2,10);
//se converteste valoarea intreaga getmaxy() in sirul de caractere s2,
//lasat in baza 10
settextstyle(SANS_SERIF_FONT,HORIZ_DIR,1);
outtextxy(10,10,s1);
//se afiseaza la coodonatele (10,10) sirul s1 (adica "599")
outtextxy(140,10,s2);
//se afiseaza la coodonatele (140,10) sirul s2 (adica "399")
getch();
closegraph(); //se inchide sistemul grafic
return 0;
}

Afiarea textului n mod grafic


Funciile de afiare cout i printf nu pot fi folosite n modul grafic. Pentru prezentarea n
mod grafic a textului se folosesc funcii specifice cum sunt urmtoarele.
Funcia
void outtextxy (int x, int y, char * sir_caractere);
afieaz textul sir_caractere trecut ca ultim parametru la coordonatele (x, y), utiliznd
atributele stabilite cu funciile settextstyle i settextjustify , care vor fi prezentate mai jos.

Poziia curorului grafic rmne nemodificat.


Funcia
void outtext (char * sir_caractere);

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

Grafic pe calculator (26.02.2015) Informatica, anul 1

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

Alegerea dimensiunii, a tipului de caractere i a direciei textului (orizontal sau vertical) se


face prin apelul funciei:
void settextstyle (int font, int direcie, int marime);

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

Grafic pe calculator (26.02.2015) Informatica, anul 1

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;
}

La terminarea lucrului n mod grafic este necesar sa se apeleze funcia:


void closegraph(void);

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);

Grafic pe calculator (26.02.2015) Informatica, anul 1

GpC_C01

Funcia
int getcolor(void);

ntoarce valoarea urent de desenare (indexul din palet). De exemplu:


int i;
i = getcolor();
if (i= =15) setcolor(14);
//Se deseneaza cu alb? Atunci schimb in galben.

Pentru culoarea fundalului exist perechea similar de funcii


void setbkcolor(int culoare_noua_fond);
int getbkcolor(void);

Citirea valorii unui pixel de la poziia (x, y) se poate face folosind funcia:
unsigned getpixel(int x, int y);

Iar inscrierea unei valori cu funcia:


void putpixel(int x, int y, int culoare);
Practic, putpixel() deseneaz pe ecran un punct cu culoarea culoare la coordonatele

(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);

Modificarea poziiei curente la coordonatele absolute x, y n fereastr se poate face explicit


cu funcia:
void moveto(int x, int y);

iar o deplasare relativ a pozitiei curente la (x+x, y+y) cu functia


void moverel(int deltax, int deltay);

Pentru desenarea unei linii exist trei metode de a preciza coordonatele:


void line(int x1, int y1, int x2, int y2);
void linerel(int deltax, int deltay);
void lineto(int x, int y);

Grafic pe calculator (26.02.2015) Informatica, anul 1

GpC_C01

o line traseaz o linie de la punctul de coordonate (x1, y1) la punctul de coordonate


(x2, y2), fr a modifica poziia curent a cursorului grafic;
o linerel traseaz o linie de la poziia curent pe care o notm (x, y) la punctul
(x+x, y+y), care devine noua poziie curent a cursorului grafic;
o lineto deseneaz o linie de la pozitia curent la punctul (x, y), care devine noua poziie
curent a cursorului grafic.
De exemplu:
#include <graphics.h>
#include <conio.h>
using namespace std;
int main()
{
initwindow(600,400);
setbkcolor(WHITE); cleardevice();
setcolor(RED);
line(100,100,300,200);
//linie de la (100,100) la (300,200)
//nu se modifica poz. curenta =>
//cursorul grafic ramane la (0,0)
linerel(10,10);
//traseaza linie din poz curenta (0,0) pana la (0+10,0+10)
//si acesta din urma devine noua pozitie curenta
moveto(500,400); //muta cursorul curent la (500,400)
lineto(200,300);
//traseaza linie din poz curenta (500,400) pana la (200,300)
//si acesta din urma devine noua pozitie curenta
getch();
closegraph();
return 0;
}

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

Grafic pe calculator (26.02.2015) Informatica, anul 1

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

Grafic pe calculator (26.02.2015) Informatica, anul 1

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;
}

Colorarea i haurarea figurilor


Stabilirea modelului i culorii de haurare se face prin apelarea funciei
void setfillstyle (int model, int culoare);

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

Grafic pe calculator (26.02.2015) Informatica, anul 1

WIDE_DOT_FILL
CLOSE_DOT_FILL
USER_FILL

10
11
12

GpC_C01

Umplere cu puncte rare


Umplere cu puncte dese
Model definit de utilizator

Programatorul i poate defini modelele proprii, folosind funcia


void far setfillpattern (int *model, int culoare);

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,

char model[] = {0xff, 0xff, 0xff, 0xff, 0, 0, 0, 0};

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

setfillstyle(SLASH_FILL,RED); //hasura rosie slash


floodfill(250,250,YELLOW);//centrul cercului din stanga
outtextxy(200,250,"A-B");
setfillstyle(BKSLASH_FILL,RED);//hasura rosie backslash
floodfill(370,250,YELLOW); //centrul cercului din dreapta
outtextxy(400,250,"B-A");
setfillstyle(1,RED);//fara hasura, doar culoare rosie
floodfill(310,250,YELLOW);//un punct din AnB
outtextxy(300,250,"AnB");
getch();
closegraph();
return 0;
}

13

Grafic pe calculator (26.02.2015) Informatica, anul 1

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

Colorarea (haurarea) acestora se face cu modelul i culoarea curente (stabilite cu


setfillstyle ). Cu excepia paralelipipedului care nu are contur, pentru toate celelalte figuri
conturul este desenat cu stilul de linie i culoarea de desenare curente (stabilite cu setlinestyle
i setcolor ).
Pentru paralelipiped, ultimul parametru indic prin valoarea 1 faptul c trebuie desenat
partea superioar a barei; dac acesta este 0, vrful paralelipiped nu se mai deseneaz, ceea ce
permite plasarea n stiv a mai multor bare. Referitor la parametrul adncime, n lipsa unui
criteriu se poate alege 25% din lime.
De obicei este mai convenabil s se foloseasca direct aceste variante dect funciile clasice
de desenare i floodfill .
Exemplu:
#include <graphics.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;
int main()
{
initwindow(600,400);
setbkcolor(WHITE);
cleardevice();
setcolor(BLUE);
setfillstyle(BKSLASH_FILL,RED);
setlinestyle(SOLID_LINE,0,3);
bar(100,100,300,200);
fillellipse(400,300,100,50);
int romb[]={250,210,290,250,250,290,210,250,250,210};
fillpoly(5,romb);
//5 perechi de puncte pt romb (prima pereche=ultima)
pieslice(500,100,30,330,50);
sector(100,350,45,360,80,30);
bar3d(400,400,500,450,100,1);
getch();
closegraph();
return 0;
}

14