Sunteți pe pagina 1din 16

,

Bibloteca graphics.h Setarea modului grafic


Modul grafic se seteaz cu ajutorul funciei initgraph. Aceast funcie poate fi folosit singur sau mpreun cu o alt funcie numit detectgraph care determin parametri adaptorului grafic. Prototipul funciei detectgraph este:
void far detectgraph (int far *gd, int far *gm);

n zona spre care pointeaz gd se pstreaz una din valorile: EGA 3 GA !. n zona sore care pointez gm se pstrez una din valorile: Pentru EGA: EGA"# $ % Are o rezoluie de &'$()$$ puncte *i permite ma+im ,& culori. EGA-. , % Are o rezoluie de &'$(3/$ puncte. Pentru VGA: GA"# $ % Are o rezoluie de &'$()$$ puncte. GAME0 , % Are o rezoluie de &'$(3/$ puncte. GA-. ) % Are o rezoluie de &'$('1$ puncte. alorile spre care pointeaz gd definesc ni*te funcii standard corespunztoare adaptorului grafic. Aceste funcii se numesc drivere. Ele se afl n su2directorul 3G.. Modul grafic se define*te n a*a fel nc4t el s fie cel mai performant pentru adaptorul grafic curent. 5ele mai utilizate adaptoare sunt cele de tip EGA *i GA. 0e aceea6 toate e+erciiile din acest la2orator pot fi rulate la un calculator ec7ipat cu adaptor EGA sau GA. Apelul funciei detectgraph tre2uie s fie urmat de apelul funciei initgraph. Aceasta seteaz modul grafic n conformitate cu parametri sta2ilii de apelul preala2il al funciei detectgraph. Funcia initgraph are prototipul: unde: gd *i gm
cale void far initgraph (int far *gd, int far *gm, int far *cale);

% sunt pointeri care au aceea*i semnificaie ca n cazul funcei detectgraph % este pointerul spre *irul de carctere care define*te calea su2directorului 3G. care conine driverele. 0e e+emplu6 dac 3G. este su2director al directorului 3#8"A9056 atunci vom folosi *irul de carctere: C:\\BORLANDC\\BGI. Exemplu: :entru setarea n mod implicit a modului grafic6 putem utiliza secvena urmtoare:
int driver, mod_grafic; ..... detectgraph(&driver,&mod_grafic); initgraph(&driver,&mod_grafic.C:\\BORL !"C\\B#$);

0up apelul funciei inigraph se pot utiliza celelalte funcii standard de gestiune grafic a ecranului. ;uncia initgraph poate fi apelat folosind secvena de mai jos:
int driver, mod_grafic; ........ driver%"&'&C'; initgraph(&driver,&mod_grafic.C:\\BORL !"C\\B#$);

5onstanta sim2olic DETECT este definit n fi*ierul grap7ics.7 alturi de celelalte constante sim2olice care definesc driverul. Aceasta are valoarea $. :rin apelul de mai sus6 funcia initgraph apeleaz funcia detectgraph pentru a defini parametrii implicii ai adaptorului grafic. <tilizatorul poate defini el nsu*i parametri pentru iniializarea modului grafic. 0e e+emplu:
int driver % (; )* VGA *) int mod_graf % +; )* VGAHI 640 * 480 puncte *) initgraph (&driver, &mod_graf, ,C:\\BORL !"C\\B#$); seteaz modul grafic corespunztor unui adaptor grafic VGA cu rezoluia &'$('1$ puncte.

n afara acestor funcii6 utilizatorul mai poate utiliza *i funcia setgraphmode care selecteaz un mod grafic diferit de cel activat implicit prin initgrap7. Aceast funcie are prototipul:
void far setgraphmode (int mode);

unde: mode are valorile $%, ptr. EGA *i $%) ptr. GA. Ea poate fi utilizat 4mpreun cu funcia restorecrtmode de prototip:
void far restorecrtmode (void);

Aceast funcie permite revenirea la modul precedent6 iar etgraphm!de realizeaz trecerea invers. Alte funcii din acest categorie sunt:
void far graphdefaults (void);

repune parametri grafici la valorile implicite=


int far getgraphmode (void);

returneaz codul modului grafic=

char* far getmodename (int mod); char* far getdrivername (void);

returneaz pointerul spre numele modului grafic definit de codul numeric mod= returneaz pointerul spre numele driverului corespunztor adaptorului curent=
void far getmoderange (int grafdriv, int far *min, int far *max); define*te valorile minimale *i ma+imale ale modului grafic utilizat. Gra"driv are ca valoare

una din valorile ,%,$ indicate de funcia detectgrap76 adic 3 ptr. EGA *i ! ptr. GA. aloarea minim a modului grafic este pstrat n zona spre care pointeaz min6 iar cea ma+im n zona spre care pointeaz ma#. 0in modul grafic se poate ie*i apel4nd funcia cl! egraph de prototip:
void far closegraph(void);

Gestiunea culorilor
Adaptoarele grafice sunt prevzute cu o zon de memorie n care se pstreaz date specifice gestiunii ecranului. Acest zon de memorie poart numele de mem!rie$vide!. n mod grafic6 acranul se consider format din puncte luminoase numite pi#eli. :oziia pe care un pi+el o are pe ecran se define*te printr%un sistem 2inar: %#&'(6 unde: # % define*te coloana n care este afi*at pi+elul ' % define*te linia n care este afi*at pi+elul. n cazul adaptoarelor color6 unui pi+el i corespunde o culoare. 5uloarea pi+elilor se pstreaz pe 2ii n memoria video. Memoria video necesar pentru a pstra starea ecranului setat n mod grafic6 se nume*te pagin) $ vide!. Gestiunea culorilor este dependent de tipul de adaptor grafic e+istent la microprocesor.

n cele ce urmeaz vom avea n vedere adaptoarele grafice de tip EGA> GA. n mod concret6 ne vom referi la facilitile oferite de adaptorul EGA6 deoarece GA6 av4nd performane superioare6 permite utilizarea acestor faciliti. 9umrul ma+im al culorilor care pot fi afi*ate cu ajutorul unui adaptor EGA este de &'. 5ulorile se codific prin numerele ntregi din intervalul ?$6&3@. 5ele &' de culori nu pot fi definite afi*ate simultan pe ecran. n cazul adaptorului EGA se pot afi*a simultan pe ecran cel mult ,& culori. Mulimea culorilor care pot fi afi*ate pe ecran simultan se nume*te palet). 5ulorile din componena unei palete pot fi modificate de utilizator prin intermediul funciilor standard. "a iniializarea modului grafic se seteaz o palet implicit). :aleta se define*te cu ajutorul unui ta2lou de ,& elemente pentru adaptorul EGA. Elementele acestui ta2lou au valori din intervalul ?$6&3@. ;iecare element din acest ta2lou reprezint codul unei culori. 5odurile culorilor din paleta implicit au denumiri sim2olice definite n fi*ierul graphic *h. Ele au prefi+ul EGA+. n ta2ela urmtoare se indic codurile culorilor pentru paleta implicit.
denumire sim2olic
3"A5A 3"<E G8EE9 5CA9 8E0 MA9GE9DA 38#E9 ".G-DG8AC 0A8AG8AC ".G-D3"<E ".G-DG8EE9 ".G-D5CA9 ".G-D8E0 ".G-DMA9GE9DA CE""#E E-.DE

Indice aloare
$ , ) 3 ' / & F 1 ! ,$ ,, ,) ,3 ,' ,/

codul culorilor denumire sim2olic valoare


EGAB3"A5A EGAB3"<E EGABG8EE9 EGAB5CA9 EGAB8E0 EGABMA9GE9DA EGAB38#E9 EGAB".G-DG8AC EGAB0A8AG8AC EGAB".G-D3"<E EGAB".G-DG8EE9 EGAB".G-D5CA9 EGAB".G-D8E0 EGAB".G-DMA9GE9DA EGABCE""#E EGABE-.DE $ , ) 3 ' / )$ F /& /F /1 /! &$ &, &) &3

;unciile de gestiune a culorilor pot avea ca parametri nu numai codurile culorilor6 ci *i indec*i n ta2loul care define*te culorile unei palete. 0e aceea6 indicii din intervalul ?$6,/@ pot fi referii prin constante sim2olice definite n fi*ierul graphic *h. Aceste denumiri sugereaz culoarea din compunerea paletei. 5uloarea fondului (backgroundG este ntotdeauna cea corespunztoare indicelui $. 5uloarea pentru desenare (foreground) este cea corespunztoare indicelui ,/. 5uloarea de fond poate fi modificat cu ajutorul funciei setbkcolor. Aceasta are prototipul:
void far setbkcolor(int culoare); unde: c,l!are este inde+ n ta2loul care define*te paleta. 0e e+emplu6 dac se utilizeaz apelul: et-.c!l!r%BL/E(= atunci culoarea de fond devine al2astr. :entru a cunoa*te culoarea de fond curent se poate apela funcia getbkcolor de

prototip:

int far getbkcolor(void);

Ea returneaz inde+ul n ta2loul care define*te paleta pentru culoarea de fond. 5uloarea pentru desenare poate fi modificat folosind funcia setcolor de prototip:
void far setcolor(int culoare); unde: c,l!are este inde+ n ta2loul care define*te paleta. 0e e+emplu6 dac se utilizeaz apelul: etc!l!r%0ELLO1(2 atunci culoarea pentru desenare este gal2en. 5uloarea pentru desenare se poate determina apel4nd funcia getcolor de prototip: int far getcolor(void);

'

Ea returneaz inde+ul n ta2loul care define*te paleta relativ la culoarea pentru desenare. :aleta curent poate fi modificat folosind funciile setpalette *i setallpalette. :rima se folose*te pentru a modifica o culoare din paleta curent. Ea are prototipul:
void far setpalette(int index, int cod);

unde: % este un ntreg din intervalul ?$6,/@ *i reprezint inde+ul n ta2loul care define*te paleta pentru culoarea care se modific. c!d$ % este un ntreg din intervalul ?$6&3@ *i reprezint codul culorii care o nlocuie*te n palet pe cea vec7e. 0e e+emplu6 apelul: etpalette%DAR3GRA0&45(2 modific culoarea corespunztoare indicelui DAR3GRA0 Hadic6 1G6 prin culoarea de cod '/.
inde#

5ealalt funcie permite modificarea simultan a mai multor culori din compunrerea paletei. Ea are prototipul:
void far setallpalette(struct palettetype far *paleta);

unde:
palettet'pe % este un tip definit n fi*ierul grap7ics.7 ca mai jos: struct palettetype{ unsigned char size; signed char colors[MAXCOLORS+1 ; !;

unde: % este dimensiunea paletei % este un ta2lou ale crui elemente au ca valori codurile culorilor componente ale paletei care se define*te. Modificarea paletei curente cu ajutorul funciilor etpalette sau etallpalette conduce la sc7im2area corespunztoare a culorilor afo*ate pe ecran n momentul apelului funciilor respective.
i6e c!l!r

:entru a determina codurile culorilor componenete ale paletei curente vom folosi funcia
getpalette de prototip: void far getpalette(struct palettetype far *paleta);

Exemplu:

struct palettetype pal; """""""" getpalette#$pal%; """""""" 0up apelul funciei getpalette se atri2uie componentelor structurii datele

corespunztoare din paleta curent. :aleta implicit poate fi determinat folosind funia getdefaultpalette de prototip:
struct palettetype *far getdefaultpalette(void);

9umrul culorilor dintr%o palet poate fi o2inut apel4nd funcia getmaxcolor de prototip:
int far getmaxcolor(void);

;uncia returneaz numrul ma+im de culori diminuat cu ,. 0eci6 n cazul adaptorului EGA funcia returneaz valoarea ,/. # alt funcie care detrmin dimensiunea paletei este funcia gatpaletesize. Ea are prototipul:
int far getpalettesize(void);

;uncia returneaz numrul culorilor componente ale paletei. n cazul adaptorului EGA funcia returneaz valoarea ,&.

/ $

Starea ecranului
3i2lioteca grafic a sistemului conine ' funcii care permit utilizatorului s o2in urmtoarele informaii relativ la ecran: % coordonata ma+im pe orizontal= % coordonata ma+im pe vertical= % poziia curent Hpi+el curentG. :rototipurile acestor funcii sunt:
int far getmaxx(void); int far getmaxy(void);

funcia returneaz coordonata ma+im pe orizontal Ha2scisa ma+imG= funcia returneaz coordonata ma+im pe vertical Hordonata ma+imG=
int far getx(void); int far gety(void);

funcia returneaz poziia orizontal Ha2scisaG a pi+elului curent= funcia returneaz poziia vertical HordonataG a pi+elului curent.

Gestiunea textelor
Afi*area te+telor presupune definirea unor parametri care pot fi gestionai prin funciile descrise n continuare. n mod grafic dispunem de mai multe seturi de caractere. Ietul de caractere se alege prin intermediul parametrului numit "!nt. :entru acest parametru se pot utiliza urmtoarele valori:
Constant simbolic 0E;A<"DB;#9D D8.:"EJB;#9D IMA""B;#9D IA9IBIE8.;B;#9D G#D-.5B;#9D Valoare $ , ) 3 '

% % %

Ali parametri utilizai n definirea caracterelor sunt: nlimea *i limea caracterelor= direcia de scriere a caracterelor: % de la st4nga la dreapta: -#8.KB0.8= % de jos n sus: E8DB0.8= cadrajul caracterelor fa de poziia curent: % pe orizontal L poziia curent se afl: n st4nga: "E;DBDEJD= n centru: 5E9DE8BDEJD= n dreapta: 8.G-DBDEJD= % pe vertical L poziia curent se afl n: marginea inferioar: 3#DD#MBDEJD= centru: 5E9DE8BDEJD= marginea superioar: D#:BDEJD.
settextstyle

Ace*ti parametri se seteaz cu ajutorul a dou funcii settextjustify. :rima are prototipul: unde:
"!nt % define*te setul de caractere= directi!n % define*te direcia de scriere a te+tului= char i6e % define*te dimensiunea caracterului n pi+eli.

*i

void far settextstyle(int font, int direction, int charsize);

&

0imensiunea caracterului se define*te astfel:


Valoarea paremetrului , ) 3 .... ,$ Matricea folosit pentru afi area carecterului !"n pi#eli$ 1(1 ,&(,& )'()' .... 1$(1$

0imensiunea poate fi sta2ilit de utilizator folosind funcia setusercharsize. n acest caz6 parametrul char i6e are valoarea zero. 5ea dea doua funcie define*te cadrajul te+tului. Ea are prototipul:
void far settextjustify (int oriz, int vert);

unde:
!ri6 vert

% define*te cadrajul pe orizontal= % define*te cadrajul pe vertical. alorile acestor parametri pot fi determinate cu ajutorul funciei gettextsettings de

prototip:
void far gettextsettings(struct textsettingstyle far*textinfo); Dipul te#t etting t'le este definit n fi*ierul graphic *h astfel: struct te&tsettingstyle { int 'ont; int direction; int charsize; int horiz; int (ert; !; ;uncia gette#t etting atri2uie componentelor structurii de tip te#t etting t'pe valorile curente. alorile numerice ale constantelor sim2olice indicate mai

sus sunt:
Constant simbolic "E;DBDEJD 5E9DE8BDEJD 8.G-DBDEJD 3#DD#MBDEJD D#:BDEJD -#8.KB0.8 E8DB0.8 Valoare $ , ) $ ) $ ,

0up setarea parametrilor de mai sus se pot afi*a te+te folosind funciile outte+t *i outte+t+M. :rima afi*eaz te+tul ncep4nd cu poziia curent de pe ecran. 5ea de%a doua funcie permite afi*area te+tului ncep4nd cu un punct al crui coordonate sunt definite orin primii doi parametri afectivi ai funciei. ;unciile afi*eaz caractere colorate folosind culoarea de desenare curent. ;uncia outtext are prototipul:
void far outtext (char far *sir);

unde: % este un pointer spre o zon de memorie n care se pstreaz caracterele de afi*at. Ie afi*eaz caracterele respective p4n la nt4lnirea caracterului N/LL. ;uncia outtextxy are prototipul:
ir$

void far outtextxy (int x, int y, char far *sir);

unde:
%#&'( ir$

% define*te poziia punctului de pe ecran ncep4nd cu cea de afi*area te+tului= % are aceea*i semnificaie ca n cazul funciei !,tte#t. 0imensiunile n pi+eli a unei *ir de caractere se pot determina folosind funciile

textheight *i textwidth. Acestea au prototipurile: int far textheight (char far *sir);

funcia returneaz nlimea n pi+eli a *irului pstrat n zona spre care pointez ir=
int far textwidth (char far *sir);

funcia returneaz limea n pi+eli a *irului aflat n zona spre care pointeaz ir. <tilizatorul poate defini dimensiunea caracterelor apel4nd funcia setusercharsize. Ea are prototipul:
void far setusercharsize(int mltx,int divx,int multy,int divy); 0imensiunea caracterelor se define*te prin nmulirea limii lor cu m,lt#7div# *i a nlimii cu m,lt'7div'.

Modificarea dimensiunii caarcterelor n acest mod este posi2il pentru fonturile diferite de fontul DE8A/LT+8ONT. %bser&a'ie: ;uncia print" poate fi folosit pentru a afi*a caractere n mod o2i*nuit. Ea ignor parametri indicai mai sus.

Gestiunea imaginilor
n paragrafele precedente s%a artat c ecranul n mod grafic se compune din n(m puncte luminoase numite pi#eli. <n pi+el are o poziie definit prin coordonatele sale *i este colorat n cazul adaptoarelor color. "a adaptzoarele monocrom are o nuan de gri. <tilizatorul poate afi*a pe ecran un pi+el cu ajutorul funciei putpixel. Aceasta are prototipul :
void far putpixel(int x, int y, int culoare);

unde: % define*te poziia punctului= % define*te culoarea punctului *i este un ntreg din intervalul ?$6,/@ reprezent4nd indicele culorii n ta2ela care define*te paleta curent.
%#&'( c,l!are$

;uncia getpixel permite sta2ilirea culorii unui pi+el afi*at pe ecran. Ea are prototipul:
unsigned far getpixel (int x, int y);

unde: % define*te poziia punctului. ;uncia returneaz un ntreg din intervalul ?$6,/@. Acesta define*te culoarea pi+elului de coordonate %#&'(6 fiind inde+ n ta2loul care define*te paleta curent.
%#&'(

Ecranul poate fi partajat n mai multe pri care pot fi gestionate independent. Aceste pri le vom numi "ere tre$gra"ice. n continuare6 prin fereastr vom nelege o fereastr grafic. # fereastr se define*te cu ajutorul funciei setvie port de prototip:
void far setviewport (int st,int sus,int dr,int jos,int d);

unde:
% t&$ , ( % sunt coordonatele colului st4nga sus al ferestrei= %dr&$9! ( % sunt coordonatele colului dreapta jos al ferestrei= d$ % indicator cu privire la decuparea desenului Hvezi mai josG.

# fereastr activ se poate *terge cu ajutorul funciei clearviewport. Ea are prototipul: void far clearvie port(vie )! 0up apelul funciei clearvie:p!rt6 toi pi+elii ferestrei active au aceea*i culoare *i anume culoarea de fond curent. :oziia curent dup apelul funciei clearvieNport este pi+elul de coordonate relative H$6$G6 adic c7iar colul din st4nga sus al ferestrei. # alt funcie utilizat pentru a *terge tot ecranul este funcia cleardevice. Ea are prototipul:
void far cleardevice(void); 0up apelul funciei cleardevice se *terge tot ecranul *i pi+elul curent devine cel din colul

st4nga sus al ecranului. :aremetri ferestrei active se pot determina apel4nd funcia getviewsettings. Acesta are prototipul:
void far getviewsettings (struct viewporttype far *fereastra);

unde:
vie:p!rtt'pe

% este un tip definit n fi*ierul grap7ics.7 astfel:

tr,ct$vie:p!rtt'pe$; int$le"t2 int$t!p2 int$right2 int$-!tt!m2 int$clip2 $$$$$$$$$$$$$$$$$$<2 0up apelul funciei getvie: etting 6 la componentele structurii de tip vie:p!rtt'pe li se

atri2uie valorile corespunztoare ale ferestrei active. :arametrul clip are dou valori: CLI=+ON Hvaloarea ,G6 CLI=+O88 Hvaloarea $G. 0ac clip are valoarea ,6 atunci funciile de afi*are a te+telor *i de desenare nu pot scrie sau desena n afara limitelor ferestrei active. 0eci te+tele *i figurile care nu ncap n fereastra activ se trunc7iaz dac: clip$>$CLI=+ON. .maginea ecranului se pstreaz n memoria video a adaptorului grafic *i formeaz o pagin. n cazul adaptoarelor de tip EGA> GA6 adaptorul dispune de o memorie video capa2il s memoreze 1 pagini. Acestea se numeroteaz de la $ la F. ;unciile de desenare *i scriere de te+te acioneaz asupra unei singure pagini. Aceasta se nume*te pagina activ. <tilizatorul poate activa o pagin folosind funcia setactivepage de prototip:
void setactivepage (int nrpag);

unde:
nrpag

% este numrul paginii care se activeaz.

0e o2icei6 pagina activ este vizualizat pe ecran. 5u toate acestea6 programatorul are posi2ilitatea s vizualizeze o alt pagin dec4t cea activ. Aceasta se realizeaz utiliz4nd funcia setvisualpage de prototip:
void far setvisualpage (int nrpag);

unde: % este numrul paginii care se vizualizeaz. Aceast funcie poate fi util pentru animaie.
nrpag

.maginea unei zone dreptung7iulare de pe ecran poate fi salvat n memorie folosind funcia getimage. Ea are prototipul:
void far getimage(int st,int sus,int dr,int jos,voifd far* zt);

unde:

% t&$ , ( % define*te coordonatele colului st4nga sus a zonei de pe ecran care se salveaz= %dr&$9! ( % define*te coordonatele colului dreapta jos a zonei de pe ecran care se salveaz= 6t % pointer spre zona de memorie n care se salveaz imaginea pe ecran.

0imensiunea zonei de memorie spre care pointez 6t tre2uie s fie suficient de mare pentru a putea salva datele care definesc imaginea de pe ecran6 care se salveaz. Aceast dimensiune se poate determina folosind funcia imagesize de prototip:
unsigned far imagesize (int st, int sus, int dr, int jos);

unde:
% t&$ , (

% define*te coordonatele colului din st4nga sus a zonei dreptung7iulare de pe % define*te coordonatele colului din dreapta jos a zonei dreptung7ilare de pe

ecran=
%dr&$9! (

ecran. ;uncia image i6e se apeleaz nainte de a apela funcia getimage pentru a sta2ili dimensiunea zonei de memorie necesar pentru a salva o imagine dreptung7iular de pe ecran. Kona de memorie respectiv se poate rezerva n memoria heap in4nd seama de valoarea returnat de funcia image i6e. .maginea de pe ecran salvat cu ajutorul funciei getimage6 poate fi afi*at pe ecran n orice parte a ecstuia6 cu ajutorul funciei putimage. 5u aceast ocazie se pot face anumite operaii asupra datelor care definesc imaginea. ;uncia are prototipul:
void far putimage (int st, int sus, void far*zt, int op);

unde:
% t&$ , ( % define*te coordonatele colului st4nga sus a zonei de pe ecran n care se afi*eaz

imaginea= % pointer spre zona n care se pstreaz datele care formeaz imaginea de afi*at. Aceste date au fost pstrate n zona respectiv prin intermediul funciei getimage= !p$ % define*te operaia ntre datele aflate n zona spre care pointez 6t *i *i cele e+istente pe ecran n zona dreptung7iular definit de parametri t6 , Hcolul din st4nga susG= cel din dreapta jos rezult4nd din datele e+istente n zona spre care pointeaz 6t. :arametru !p se define*te ca mai jos:
6t$ $ Constant simbolic 5#:CB:<D J#8B:<D #8B:<D A90B:<D 9#DB:<D Valoare $ , ) 3 ' Ac'iune 5opiaz imaginea din memorie pe ecran. OIau e+cusivP ntre datele de pe ecran *i cele din memorie. OIauP ntre datele de pe ecran *i cele din memorie. OQiP ntre datele de pe ecran *i cele din memorie. 5opiaz imaginea din memorie pe ecran complement4nd datele aflate n memorie.

:entru a defini pi+elul curent se utilizeaz funcia moveto. Aceasta are prototipul:
void far moveto (int x, int y);

0up apelul funciei m!vet!6 pi+elul curent devine cel de coordonate %#&'(. # funcie nrudit cu acesta este funcia moverel. Aceasta are prototipul:
void far moverel (int dx, int dy); 0ac notm cu %#&'( coordonatele pi+elului curent6 atunci dup apelul funciei m!verel6 pi+elul curent are coordonatele: %#?d#&$'?d'(.

%bser&a'ie: Majoritatea funciilor care eu ca parametri coordonate de pi+el6 interpreteaz aceste coordonate ca fiind relative fa de fereastra activ al crei col st4nga sus are coordonatele H$6$G. A*a de e+emplu funciile: !,tte#t#'6 p,tpi#el6 getpi#el6 m!vet! au ca parametri coordonate relative la pi+elul din colul st4nga sus al ferestrei active.

,$

n sc7im2 funciile getma## *i getma#' returneaz totdeauna a2scisa6 respectiv ordonata6 ma+im pentru tot ecranul n conformitate cu modul grafic. 0e asemenea6 funciile setvieNport *i getvieNsettings gestioneaz coordonate care sunt relative fa de colul st4nga sus al ecranului *i nu fa de fereastra activ. Astfel de coordonate le vom numi a- !l,te.

"ratarea erorilor
Erorile survenite n gestiunea n mod grafic a ecranului pot fi puse n eviden cu ajutorul funciei graphresult. Ea are prototipul:
int far graphresult (void);

;uncia returneaz codul ultimei erori care a aprut naintea apelului funciei graphre ,lt sau valoarea constantei sim2olice grO. dac nu au fost erori. 5onstanta grO. este definit n fi*ierul graphic *h. Mesajul de eroare poate fi decodificat cu ajutorul funciei grapherrormsg. Aceasta are prototipul:
char far *far grapferrormsg (int coderoare);

unde:
c!der!are

% este valoarea returnat de funcia graphre ,lt. ;uncia grapherr!rm g returneaz un pointer spre te+tul de eroare. 5onstanta grO. are valoarea $. 5odurile de eroare au valori negative.

#esenare $i colorare
3i2lioteca standard a sistemului pune la dispoziia utilizatorului o serie de funcii care permit desenarea *i colorarea unor figuri geometrice. Amintim c un punct colorat Hpi+elG se afi*eaz cu ajutorul funciei putpi+el de prototip:
v!id$"ar$p,tpi#el%int$#&$int$'&$int$c,l!are(2

unde: % define*te poziia punctului= % define*te culoarea punctului *i este un ntreg din intervalul ?$6,/@ reprezent4nd indicele culorii n ta2ela care define*te paleta curent6 adic este inde+ n ta2loul care define*te paleta curent. Acest inde+ define*te codul culorii pentru desenarea *i colorarea figurilor.
%#&'( c,l!are$

:entru trasarea liniilor se pot folosi trei funcii: line6 linet!6 linerel. ;uncia line are prototipul:

void far line (int xstart,int ystart,int xfin,int yfin);

;uncia traseaz un segment de dreapt ale crui capete sunt punctele de coordonate: %# tart&' tart( *i %#"in&'"in(. ;uncia lineto are prototipul:
void far lineto (int x, int y);

Ea traseaz un segment de dreapt care are ca origine poziia curent6 iar ca *i punct final cel de coordonate %#&'(. :unctul final devine poziia curent. Amintim c funcia m!vet! permite definirea poziiei curente.
void far linerel (int x, int y); 0ac notm cu #crt *i 'crt coordonatele poziiei curente6 atunci funcia linerel traseaz un segment de dreapt ale crui capete sunt punctele de coordonate: %#crt&'crt( *i %#crt?#&'crt?'(.

;uncia linerel are prototipul:

,,

Alte funcii care permit trasri de figuri geometrice utilizate frecvent sunt:
void far arc (int xcentru, int ycentru, int unghistart, int unghifin, int raza);

traseaz un arc de cerc= ung7iurile sunt e+primate n grade se+agesimale.


far circle (int xcentru, int ycentru, int raza); traseaz un cerc6 %#centr,&'centr,( fiind coordonatele centrului arcului de cerc *i respectiv cercului trasat de aceste funcii= parametrul ra6a define*te mrimea razei cur2elor respective. void far ellipse (int xcentru, int ycentru, int unghistart, int unghifin, int semiaxamare, int semiaxamica); void

traseaz un arc de elips cu centrul n punctul de coordonate H+centru6McentruG av4nd semia+a mic definit de parametrul emia#amica6 iar semia+a mare de parametrul emia#amare.
void rectangle (int st, int sus, int dr, int jos);

traseaz un dreptung7i definit de colurile sale opuse: % t& , ( L colul din st4nga sus *i %dr&9! ( L colul din dreapta jos.
void far drawpoly (int nr, int far *tabpct);

traseaz o linie poligonal6 unde: nr % numrul laturilor= ta-pct % este un pointer spre ntregi care definesc coordonatele liniei poligonale. Acestea sunt pstrate su2 forma: a- ci a+i6 !rd!nata+i unde i are velorile @&A&***nr?@. "inia poligonal este nc7is dac primul punct coincide cu ultimul Hau acelea*i coordonateG. 5oordonatele utilizate ca parametri la apelul acestor funcii sunt relative la fereastra activ. 5uloarea de trasare este cea curent. "a trasarea liniilor cu ajutorul funciilor: line6 linet! *i linerel se poate defini un stil de trasare folosind funcia setlinestyle. Aceast funcie are prototipul:
void far setlinestyle (int stil, unsigned sablon, int grosime);

unde:
til % este ntreg din intervalul ?$6'@ care define*te stilul liniei conform ta2elei de mai jos: Constant simbolic I#".0B".9E 0#DDE0B".9E 5E9DE8B".9E 0AI-E0B".9E <IE83.DB".9E a-l!n Valoare $ , ) 3 ' (til "inie continu "inie punctat "inie ntrerupt format din liniue de dou dimensiuni "inie ntrerupt format din liniue de aceea*i dimensiune Itil definit de utilizator prin *a2lon

% define*te stilul liniei. Are sens numai c4nd primul parametru L til L are valoarea '. n rest este neglijat *i de aceea poate avea valoarea zero. gr! ime % define*te limea liniei n pi+eli. :ot fi dou limi: NORB+1IDTC Hvaloarea , pi+elG *i TCIC3+1IDTC Hvaloarea 3 pi+eliG. Itilul curent poate fi determinat apel4nd funcia getlinesettings de prototip:
void far getlinesettings (struct linesettingstype far *linieinfo);

:entru mai multe detalii referitoare la acest funcie consult -E":%ul programului 3orland 5R R.

,)

Alte funcii din 2i2lioteca standard a sistemului permit trasarea de figuri geometrice cu colorarea interiorului acestora. <nele dintre cele mai importante astfel de funcii sunt:
void far bar (int st, int sus, int dr, int jos);

unde: t6 , 6 dr *i 9! % au acelea*i semnificaii ca n cazul funciei rectangle. ;uncia deseneaz un domeniu dreptung7iular colorat Hfr a avea o frontier scoas n evidenG.
void far bar d (int st, int sus, int dr, int jos, int profunzime, int ind);

;uncia deseneaz o prism dreptung7ilar colorat pentru ind diferit de $. :entru indS$6 nu se traseaz partea de sus a prismei.
void far pieslice (int xcentru, int ycentru, int unghistart, int unghifin, int raza);

;uncia deseneaz un sector de cerc colorat.


void far fillpoly (int nr, int far *tabpct);

unde: nr$ *i ta-pct % au acelea*i semnificaii ca n cazul funciei dra:p!l'. ;uncia deseneaz un poligon colorat.
void far fillellipse (int xcentru, int ycentru, int semiaxamare, int semiaxamica);

;uncia deseneaz o elips colorat. ;igurile desenate cu funciile de mai sus se coloreaz folosind o culoare definit n prela2il cu ajutorul funciei et"ill t'le. 0e asemenea6 o figur poate fi colorat n mai multe feluri: % folosind culorea de fond= % colorare uniform Htoi pi+elii din interiorul figurii au aceea*i culoareG folosind culoarea definit prin funcia et"ile t'le= % colorare prin 7a*ur. -a*ura poate fi standard sau definit de utilizator. Modul de colorare al unei figuri se define*te tot cu ajutorul funciei setfillstyle. Ea are prototipul:
void far setfillstyle (int hasura, int culoarea);

unde:
ha ,ra % define*te modul de colorare conform ta2elului de mai jos= c,l!area % define*te culoarea pentru colorarea figurilor. :arametrul ha ,ra are urmtoarele valori: Constant simbolic Valoare EM:DCB;."" $ I#".0B;."" , ".9EB;."" ) "DI"AI-B;."" 3 I"AI-B;."" ' 3AI"AI-B;."" / "D3AI"AI-B;."" & -AD5-B;."" F J-AD5-B;."" 1 .9DE8"EA EB;."" ! E.0EB0#DB;."" ,$

,3

5"#IEB0#DB;."" <IE8B;.""

,, ,)

aloarea EM:DCB;."" coloreaz figura folosind culoarea de fond. aloarea I#".0BEM:DC realizeaz colorarea uniform a figurii Htoi pi+elii din interiorul figurii au aceea*i culoareG. alorile de la ".9EB;."" H)G6 p4n la 5"#IEB0#DB;."" H,,G definesc diferite 7a*uri standard. aloarea <IE8B;."" se utilizeaz c4nd 7a*ura se define*te de ctre utilizator. :entru a defini o 7a*ur nestandard se utilizeaz funcia setfillpatern. Aceasta are prototipul:
void far setfillpatern (char far* h!utilizator, int culoare);

unde:
h+,tili6at!r % este un pointer spre o zon de memorie n care se define*te6 pe 1 octei6

7a*ura=
c,l!are
$ $

% define*te culoarea de 7a*urare.

%x.&: I se scrie un program care traseaz linii orizontale folosind cele ' stiluri standard *i am2ele grosimi.
Dincl,deEgraphic *hF Dincl,deEc!ni!*hF $ v!id$main%( ; $char$G tilHI>;JKOLID+LINE>LJ&JDOTTED+LINE>@J& $$$$$$$JCENTER+LINE>AJ&JDAKCED+LINE>MJ<2 $char$Ggr! imeHI>;JNORB+1IDTC>@J&JTCIC3+1ODTC>MJ<2 $ $int$gd>DETECT&gm2 $int$i&92 $int$#&'2 $ $initgraph%Ngd&Ngm&Jc:\\-!rlandc\\-giJ(2 $#>getma##%(742 $'>getma#'%(7O2 $ $ ette#t t'le%DE8A/LT+8ONT&CORIP+DIR&@(2 $ ette#t9, ti"'%LE8T+TEQT&CENTER+TEQT(2 $ $"!r%i>KOLID+LINE2iE>DAKCED+LINE2i??( $$$$$$"!r%9>L29EA29??( $; $$!,tte#t#'%#&'& tilHiI(2 $$!,tte#t#'%#?te#t:idth% tilHiI(?4&'&gr! imeH9I(2 $$'?>te#theight%gr! imeH9I?4(2 $$i"%9( $$$$$$ etline t'le%i&L&M(2 $$el e $$$$$$ etline t'le%i&L&@(2 $$line%#&'&MG#&'(2 $$'?>AL2 $< $ $getch%(2 $cl! egraph%(2 $ <

%x.': I se scrie un program care traseaz urmtoarele figuri: % cerc=

,'

% elips= % dreptung7i= % patrulater. Dipul figurii se sta2ile*te aleator. ;igurile sunt trasate folosind n mod aleatoriu culoarea de desenare.
Dincl,deEgraphic *hF Dincl,deEc!ni!*hF Dincl,deE tdli-*hF $ 77trasea)a fi*uri *eometrice in mod aleator v!id$main%( $; $$int$gd>DETECT&gm2 $$int$i2 $$int$#ma#&'ma#&#&'2 $$int$p!lig!nH@LI2 $ $$initgraph%Ngd&Ngm&Jc:\\-!rlandc\\-giJ(2 $ $$!,tte#t#'%L&L&J=entr,$a$termina$dati$ta ta$6er!J(2 $$ etvie:p!rt%L&O&getma##%(&getma#'%(&@(2 $ $$ rand%@LL(27G$setea)a *eneratorul de numere aleatoare +00$G7 $$7G$altfel, randomi)e!$- . ptr/ setarea in mod aleator a a *eneratorului de numere aleatoare $$G7 $ $$#ma#>getma##%(2 $$'ma#>getma#'%(2 $ $$"!r%22( $$$$$; $$$$$$ etc!l!r%rand!m%@5(?@(2$7G$random!+0$ returnea)a o &aloare aleatoare intre 0 si +4$G7 $ $$$$$$ :itch%rand!m%4(($; $ $ca e$L:$7GcercG7 $$$$$#>rand!m%#ma#7A(?#ma#742 $$$$$'>rand!m%'ma#7A(?'ma#742 $$$$$circle%#&'&rand!m%OL(?@(2 $$$$$-rea.2 $ $ca e$@:$7GelipsaG7 $$$$$#>rand!m%#ma#7A(?#ma#7O2 $$$$$'>rand!m%'ma#7A(?'ma#7O2 $$$$$ellip e%#&'&L&M5R&rand!m%OL(?@&rand!m%SL(?@(2 $$$$$-rea.2 $ $ca e$A:$7Gdreptun*1iG7 $$$$$#>rand!m%#ma#7A(?#ma#7@L2 $$$$$'>rand!m%'ma#7A(?'ma#7@L2 $$$$$rectangle%#&'&#?rand!m%#ma#74(?@&'?rand!m%'ma#74(?@(2 $$$$$-rea.2 $ $ca e$M:$7GpatrulaterG7 $$$$$"!r%i>L2iEO2i?>A( $$$$$$$; p!lig!nHiI>rand!m%#ma#(2 p!lig!nHi?@I>rand!m%'ma#(2 $$$$$$$< $$$$$77se inc1id formele patrulatere $$$$$p!lig!nHOI>p!lig!nHLI2

,/ $$$$$p!lig!nHRI>p!lig!nH@I2 $$$$$dra:p!l'%5&p!lig!n(2 $$$$$-rea.2

$ $$$$$$<2$77sfarsit de s2itc1 $ $$$$$$i"$%getch%(>>TLT( $-rea.2 $ $$$$$< $$cl! egraph%(2 $< $

%x.(: I se scrie un program care coloreaz fugurile geometrice trasate n programul precedent.
Dincl,deEgraphic *hF Dincl,deEc!ni!*hF Dincl,deE tdli-*hF $ 77trasea)a fi*uri *eometrice in mod aleator v!id$main%( $; $$int$gd>DETECT&gm2 $$int$i2 $$int$#ma#&'ma#&#&'2 $$int$p!lig!nH@LI2 $ $$initgraph%Ngd&Ngm&Jc:\\-!rlandc\\-giJ(2 $ $$!,tte#t#'%L&L&J=entr,$a$termina$dati$ta ta$6er!J(2 $$ etvie:p!rt%L&O&getma##%(&getma#'%(&@(2 $ $$ rand%@LL(27G$setea)a *eneratorul de numere aleatoare +00$G7 $$7G$altfel, randomi)e!$- . ptr/ setarea in mod aleator a a *eneratorului de numere aleatoare $$G7 $ $$#ma#>getma##%(2 $$'ma#>getma#'%(2 $ $$ etc!l!r%getma#c!l!r%((2 $$"!r%22( $$$$$; $$$$$$ et"ill t'le%KOLID+8ILL&rand!m%@5(?@(2 $$$$$$ :itch%rand!m%4(($; $ $ca e$L:$7GcercG7 $$$$$#>rand!m%#ma#7A(?#ma#742 $$$$$'>rand!m%'ma#7A(?'ma#742 $$$$$pie lice%#&'&L&MSL&rand!m%OL(?@(2$7G$ e$p,ne$?@$ptr*$a$ e$evita$ a"i area$,nei$"ig,ri$de$c,l!are$neagra$G7 $$$$$-rea.2 $ $ca e$@:$7GelipsaG7 $$$$$#>rand!m%#ma#7A(?#ma#7O2 $$$$$'>rand!m%'ma#7A(?'ma#7O2 $$$$$"illellip e%#&'&rand!m%OL(?@&rand!m%SL(?@(2 $$$$$-rea.2 $ $ca e$A:$7Gdreptun*1iG7 $$$$$#>rand!m%#ma#7A(?#ma#7@L2 $$$$$'>rand!m%'ma#7A(?'ma#7@L2 $$$$$-ar%#&'&#?rand!m%#ma#74(?@&'?rand!m%'ma#74(?@(2

,& $ $$$$$-rea.2 $ca e$M:$7GpatrulaterG7 $$$$$"!r%i>L2iEO2i?>A( $$$$$$$; p!lig!nHiI>rand!m%#ma#(2 p!lig!nHi?@I>rand!m%'ma#(2 $$$$$$$< $$$$$p!lig!nHOI>p!lig!nHLI2 $$$$$p!lig!nHRI>p!lig!nH@I2 $$$$$"illp!l'%5&p!lig!n(2 $$$$$-rea.2 $ $$$$$$<2$77sfarsit de s2itc1 $ $$$$$$i"$%getch%(>>TLT( $-rea.2 $ $$$$$< $$cl! egraph%(2 $< $

S-ar putea să vă placă și