Sunteți pe pagina 1din 13

MODUL GRAFIC

Modul grafic presupune c ecranul este format din puncte luminoase numite pixeli. Numrul acestora depinde de adaptorul grafic i se numete rezoluie. Pentru gestionarea ecranului n mod grafic se pot utiliza peste 60 de funcii standard aflate n biblioteca sistemului. Aceste funcii au prototipul n fiierul graphics.h 1.1 Setarea modului grafic Modul grafic se seteaz cu ajutorul funciei initgraph care poate fi folosit singur sau mpreun cu funcia detectgraph care determin parametrii adaptorului grafic. void detectgraph (int *gd, int *gm); Apelul funciei detectgraph trebuie urmat de apelul funciei initgraph. void initgraph (int *gd, int *gm, int *cale); unde: gd i gm -sunt pointeri spre valorile driverului grafic respectiv modului grafic cale - pointer spre irul de caractere care definete calea subdirectorului BGI Exemplu: int driver, mod_driver; ... detectgraph (&driver, &mod_grafic); initgraph (&driver, &mod_grafic, c:\\BorlandC\\BGI); 1.2 Funcii de desenare n mod grafic, ecranul se consider format din n*m puncte luminoase numite pixeli. Poziia pe ecran a unui pixel se definete printr-un sistem binar de numere ntregi numite coordonatele pixelului: (x,y) unde: x definete coloana n care este afiat pixelul y definete linia n care este afiat pixelul Pixelul din colul stnga sus are coordonatele (0,0). Coloanele se numeroteaz de la stnga spre dreapta, iar liniile de sus n jos. Biblioteca grafic a sistemului conine 4 funcii care permit utilizatorului s obin urmtoarele informaii relativ la ecran:

Cordonata maxim pe orizontal Cordonata maxim pe vertical Poziia curent (pixel curent) Prototipurile acestor funcii sunt: int getmaxx (void); - Funcia returneaz coordonata maxim pe orizontal (abscisa maxim) int getmaxy (void); - Funcia returneaz coordonata maxim pe vertical (ordonata maxim) int getx (void); - Funcia returneaz poziia pe orizontal (abscisa) a pixelului curent int gety (void); - Funcia returneaz poziia pe vertical (ordonata) a pixelului curent Desenarea (afiarea) unui punct se realizeaz cu ajutorul funciei: void putpixel (int x, int y, int culoare); unde: (x,y) coordonatele punctului care se afieaz relative la fereastra activ culoare index care definete culoarea din paleta curent Pentru a deplasa pixelul curent se utilizeaz funcia moveto. void moveto (int x, int y); - Dup apelul funciei, pixelul curent devine cel de coordonate (x,y). void moverel (int dx, int dy); - Funcia deplaseaz poziia pixelului curent (x,y) n punctul de coordonate (x+dx, y+dy). Pentru trasarea liniilor se pot folosi trei funcii: line, lineto i linerel. void line (int xstart, int ystart, int xfinal, int yfinal); - Funcia traseaz un segment de dreapt ale crui capete sunt punctele de coordonate (xstart, ystart) i (xfinal, yfinal). void lineto (int x, int y); - Funcia traseaz un segment de dreapt care are ca origine poziia curent, iar ca i punct final cel de coordonate (x,y). Punctul final devine poziia curent. void linerel (int x, int y); - Funcia traseaz un segment de dreapt ale crui capete sunt punctele de coordonate (xcrt, ycrt) i (xcrt+x, ycrt+y). Alte funcii permit trasri de figuri geometrice: dreptunghi, cerc, arc de cerc, elips, poligon) Desenarea unui dreptunghi se realizeaz cu funcia: void rectangle(int xsus, int ysus, int xjos, int yjos); unde: (xsus, ysus) - coordonatele colului stnga sus (xjos, yjos) - coordonatele colului dreapta jos Desenarea unui cerc se realizeaz cu funcia: void circle(int xcentru, int ycentru, int raza); unde: (xcentru, ycentru) - coordonatele centrului cercului raza - raza cercului

Desenarea unui arc de cerc se realizeaz cu funcia: void arc (int xcentru, int ycentru, int unghistart, int unghifinal, int raza); unde: (xcentru, ycentru) - coordonatele centrului arcului de cerc unghistart, unghifinal - mrimea unghiurilor exprimate n radiani fa de origine, n sens trigonometric Desenarea unei elipse se realizeaz cu funcia: void ellipse(int xcentru, int ycentru, int unghistart, int unghifinal, int semiaxamare, int semiaxamic); unde: (xcentru, ycentru) - coordonatele centrului arcului de cerc unghistart, unghifinal - mrimea unghiurilor exprimate n radiani fa de origine, n sens trigonometric semiaxamare - semiaxa mare a elipsei semiaxamic - semiaxa mic a elipsei Desenarea unui poligon cu n laturi (linie poligonal) se realizeaz cu funcia: void drawpoly(int nr, int *tabpct); unde: nr - numrul laturilor tabpct - este un pointer spre ntregi care definesc coordonatele vrfurilor liniei poligonale Linia poligonal este nchis dac primul punct coincide cu ultimul (au aceleai coordonate). Coordonatele utilizate ca parametri la apelul acestor funcii sunt relative la ferreastra activ. Culoarea de trasare este cea curent.

1.3 Gestiunea culorilor

n cazul adaptoarelor color, unui pixel i corespunde o culoare. Culoarea pixelilor se pstreaz pe bii n memoria video. Memoria video necesar pentru a pstra starea ecranului setat n mod grafic, se numete pagin video. Adaptoarele pot conine mai multe pagini video. Gestiunea culorilor este dependent de tipul de adaptor grafic existent. Culorile care pot fi afiate formeaz o palet de culori. Ele au denumiri simbolice i le sunt ataate coduri. Paleta de culori implicit are 64 de culori codificate astfel.

Tabela paletei implicite codul culorilor Denumire simbolic BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED LIGHTMAGENTA YELLOW WHITE Valoare 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Culoarea fondului (background) implicit este totdeauna cea corespunztoare indicelui zero (negru). Culoarea pentru desenare (foreground) implicit este cea corespunztoare indicelui 15 (alb). Pentru a afla culoarea de fond curent se folosete funcia getbkcolor: void getbkcolor (void); - Funcia returneaz indexul din tabloul care definete paleta pentru culoarea de fond. Culoarea de fond poate fi modificat cu ajutorul funciei setbkcolor. void setbkcolor (int culoare); - Funcia poate fi apelat fie cu parametru numeric (indexul culorii) fie folosind constanta simbolic (numele culorii). De exemplu: Setbkcolor(1); Este echivalent cu: Setbkcolor(blue); Pentru a cunoate culoarea pentru desenare curent se poate apela funcia getcolor: void getcolor(void); - Funcia returneaz indexul n tabloul care defunete paleta relativ la culoarea pentru desenare. Culoarea pentru desenare poate fi modificat folosind funcia setcolor: void setcolor(int culoare); La fel ca i n cazul precedent se poate folosi ca parametru n apelul funciei att indexul culorii ct i denumirea ei.

1.4 Tipuri de linie Tipul de linie se poate defini cu funcia setlinestyle. void setlinestyle (int stil, unsigned sablon, int grosime); unde: stil - este un ntreg din intervalul [0,4] care definete stilul liniei conform tabelului: Constant simbolic SOLID_LINE DOTTED_LINE CENTER_LINE DASHED_LINE USERBIT_LINE ablon grosime Valoare 0 1 2 3 4 Stil Linie continu Linie punctat Linie ntrerupt format din liniue de dou dimensiuni Linie ntrerupt format din liniue de aceeai dimensiune Stil definit de utilizator prin ablon

- definete stilul liniei atunci cnd primul parametru (stil) are valoaraea 4. n rest este neglijat i de aceea poate avea valoarea 0. - definete limea liniei n pixeli. Pot fi dou limi: NORM_WIDTH - valoarea 1 pixel THICK_WIDTH - valoarea 0 pixel

1.5 Tipuri de hauri Figurile desenate cu ajutorul funciilor de mai sus pot fi colorate, respectiv haurate n prealabil cu ajutorul funciei stefillstyle. O figur poate fi colorat n mai multe feluri: Folosind culoarea de fond Colorare uniform (tii pixelii din interiorul figurii au aceeai culoare) folosind culoare definit prin funcia setfillstyle Colorare prin haur Haura poate fi standard sau definit de utilizator. void setfillstyle (int haura, int culoarea); unde: haura - definete tipul de haur conform tabelului de mai jos culoarea - definete culoarea pentru colorarea figurilor Constanta simbolic EMPTY_FILL SOLID_FILL LINE_FILL LTSLASH_FILL SLASH_FILL BKSLASH_FILL Valoare Semnificaie 0 Coloreaz cu culoarea de fond 1 Coloreaz cu aceeai culoare uniform 2 ||||||||||| 3 ////////// 4 ////// 5 \\\\\\

LTBKSLASH_FILL HATCH_FILL XHATCH_FILL INTERLEAVE_FILL WIDE_DOT_FILL CLOSE_DOT_FILL USER_FILL

6 7 8 9 10 11 12

\\\\\\\\\\\\ -----------|-|-|-|-|-| XXXXXX Haur punctat rar Haur punctat deas Haur definit de utilizator

Pentru a defini o haur nestandard se utilizeaz funcia setfillpattern: void setfillpattern (char *h_utilizator, int culoare); unde: h_utilizator - este un pointer spre o zon de memorie n care se definete, pe 8 octei, haura culoare - definete culoarea de haurare ablonul se definete printr-un ir de 8 octei. Fiecare octet definete 8 pixeli, deci un ablon definete 64 pixeli. Modul curent utilizat la colorare se poate determina cu ajutorul funciei getfillsettings: void getfillsettings (struct fillsettingstype *stilcolorare); unde: fillsettingsstyle - este definit n fiierul graphics.h astfel: struct fillsettingsstyle { int pattern; int color; } unde: pattern - este componenta care definete modul de colorare utilizat la colorare (ntreg din intervalul [0,12] color - definete culoarea utilizat la colorare Alte funcii din biblioteca stsndard a sistemului permit trasarea de figuri geometrice mpreun cu colorarea interiorului acestora. Desenarea unui domeniu dreptunghiular colorat (fr a avea o frontier scoas n eviden) se realizeaz cu funcia: void bar (int st, int sus, int dr, int jos); unde: st, sus, dr, jos - au aceleai semnificaii ca i n cazul funciei rectangle Desenarea unei prisme dreptunghiular colorate pentru ind diferit de zero., se realizeaz cu funcia de mai jos. Pentru ind=0, nu se traseaz partea de sus a prismei. void bar3d (int st, int sus, int dr, int jos, int profunzime, int ind); Desenarea unui poligon colorat: void fillpoly (int nr, int *tabpct); unde: nr i tabpct - au aceleai semnificaii ca i n cazul funciei drawpoly.

Desenarea unui sector de cerc colorat: void pieslice (int xcentru, int ycentru, int unghistart, int unghifinal, int raza); Desenarea unei elipse colorate: void fillellipse (int xcentru, int ycentru, int semiaxamare, int semiaxamica); Utilizatorul poate desena i alte figuri dect cele pentru care au fost prevzute funcii standard de felul celor indicate mai sus. n acest scop se pot folosi funciile putpixel, line, lineto, linerel, arc, etc., pantru atrasa elementele componente ale figurii de trasat. Pentru a colora un domeniu nchis obinut n acest fel, se folosete funcia floodfill: void floodfill (int x, int y, int culoare_frontier); unde: (x,y) - coordonatele unui punct interior figurii care se coloreaz culoare_frontier - defineta culoarea utilizat la trasarea conturului figurii Interiorul figurii se coloreaz n coformitate cu parametrii curent setai prin apelul funciei setfillstyle. La trasarea figurilor trebuie s se in seama de faptul c pixelii nu sunt puncte ideale. Ei au forme dreptunghiulare. Din aceast cauz, figurile afiate pe ecran vor avea un aspect deformat fa de forma lor ideal. Pentru a evita acest lucru se utilizeaz nite factori de corecie numii coeficieni de aspect. Acetia sunt: unul relativ la abscis i unul relativ la ordonat. Valorile lor se pot seta cu ajutorul funciei setaspectratio: void setaspectratio (int xaspect, int yaspect); Valorile acestor coeficieni depind de adaptorul grafic. Raportul xaspect/yaspect se folosete adesea la trasarea curbelor definite analitic. Valorile curente ale acestor coeficieni pot fi gsite apelnd funcia getaspectratio de prototip: void getaspectratio (int *xaspect, int *yaspect); Dup apelul funciei, cei doi coeficieni de aspect cureni se afl memorai n zonele spre care pointeaz parametrii xaspect i yaspect.

1.6 Gestiunea textelor Afiarea textelor presupune definirea unor parametri care pot fi gestionai prin funciile descrise n continuare. n mod grafic dispunem de mai multe seturi de caractere. Setul de caractere se alege prin intermediul parametrului numit font. Pentru acest parametru se pot utiliza urmtoarele valori: Constant simbolic DEFAULT_FONT TRIPLEX_FONT SMALL_FONT SANS_SERIF_FONT GOTHIC_FONT Valoare 0 1 2 3 4

Ali parametri utilizai n definirea caracterelor sunt: nlimea i limea caracterelor Direcia de scriere a caracterelor o De la stnga la dreapta: HORIZ_DIR o De jos n sus: VERT_DIR Cadrajul caracterelor fa de poziia curent o Pe orizontal poziia curent se afl: n stnga: LEFT_TEXT n centru: CENTER_TEXT n dreapta: RIGHT_TEXT o Pe vertical poziia curent se afl n: Marginea inferioar: BOTTOM_TEXT Centru: CENTER_TEXT Marginea superioar: TOP_TEXT Aceti parametri se seteaz cu ajutorul a dou funcii settextstyle i settextjustify. void settextstyle (int font, int direction, int charsize); unde: font - definete setul de caractere direction - definete direcia de scriere a textului chsrsize - definete dimensiunea caracterului n pixeli Dimensiunea se definete astfel: Valoarea parametrului 1 2 3 ... 10 Matricea folosit pentru afiarea caracterului (n pixeli) 8*8 16*16 24*24 ... 80*80

Dimensiunea poate fi stabilit de utilizator folosind funcia setusercharsize. n acest caz, parametrul charsize are valoarea 0. Pentru definirea cadrajului textului se folosete funcia: void settextjustify (int oriz, int vert); unde: oriz - definete cadrajul pe orizontal vert - definete cadrajul pe vertical Valorile acestor parametri pot fi determinate cu ajutorul funciei gettextsettings: void gettextsettings (struct textsettingstype *textinfo); Tipul textsettingstype este definit n fiierul graphics.h astfel: Struct textsettingstype { int font; int direction; int charsize; int horiz; int vert; }; Funcia gettextsettings atribuie componentelor structurii de tip textsettingstype valorile curente. Valorile numerice ale constantelor simbolice indicate mai sus sunt: Constant simbolic LEFT_TEXT CENTER_TEXT RIGHT_TEXT BOTTOM_TEXT TOP_TEXT HORIZ_DIR VERT_DIR Valoare 0 1 2 0 2 0 1

Dup setarea parametrilor de mai sus se pot afia texte folosind funciile outtext i outtextxy. Funcia outtext afieaz textul ncepnd din poziia curent de pe ecran, folosind culoarea de desenare curent. void outtext (char *sir); unde: sir - este pointer spre o zon de memorie n care se pstreaz caracterele de afiat Funcia afieaz caracterele irului pn la ntlnirea caracterului NUL. Funcia outtextxy afieaz textul ncepnd cu un punct ale crui coordonate sunt definite prin primii doi parametri efectivi ai funciei, folosind culoarea de desenare curent. void outtextxy (int x, int y, char *sir); unde:

(x,y) sir

- definete poziia punctului de pe ecran ncepnd cu care se afieaz textul - are aceeai semnificaie ca i n cazul funciei outtext

Dimensiunile n pixeli a unui ir de caractere se pot determina folosind funciile textheight i textwidth cu urmtoarele prototipuri: void textheight (char *sir); - funcia returneaz nlimea n pixeli a irului pstrat n zona spre care pointeaz sir. void textwidth (char *sir); - funcia returneaz limea n pixeli a irului aflat n zona spre care pointeaz sir. Utilizatorul poate defini dimensiunea caracterelor apelnd funcia setusercharsize cu prototipul: void setusercharsize (int multx, int divx, int multy, int divy); Dimensiunea caracterelor se definete prin nmulirea limii lor cu multx/divx i a nlimii cu multy/divy. Modificarea dimensiunii caracterelor n acest mod este posibil pentru fonturile diferite de fontul DEFAULT_FONT.

1.7 Gestiunea imaginilor n paragrafele anterioare s-a artat c ecranul n mod grafic se compune din n*m puncte luminoase numite pixeli. Un pixel are o poziie definit prin coordonatele sale i este colorat n cazul adaptoarelor color. La adptoarele monocrom pixelul are o nuan de gri. Utilizatorul poate afia pe ecran un pixel cu ajutorul funciei putpixel cu urmtorul prototip: void putpixel (int x, int y, int culoare); unde: (x,y) coordonatele punctului care se afieaz relative la fereastra activ culoare index care definete culoarea din paleta curent Funcia getpixel permite stabilirea culorii unui pixel afiat pe ecran i are urmtorul prototip: void getpixel (int x, int y); unde: (x,y) - definete poziia punctului Funcia returneaz un ntreg din intervalul [0,15]. Acesta definete culoarea pixelului de coordonate (x,y) fiind index n tabloul care definete paleta curent. Ecranul poate fi partajat n mai multe pri care pot fi gestionate independent. Aceste pri le vom numi ferestre grafice. O fereastr se definete cu ajutorul funciei setviewport de prototip: void setviewport (int st, int sus, int dr, int jos, int d); unde: (st, sus) - sunt coordonatele colului stnga sus al ferestrei (dr, jos) - sunt coordonatele colului dreapta jos al ferestrei d - indicator cu privire la decuparea desenului Fereastra definit n urma apelului funciei setviewport devine fereastra activ. Iniial(la setarea modului grafic), fereastra activ este tot ecranul. O fereastr activ se poate terge cu ajutorul funciei: void clearviewport (void); Dup apelul funciei, toi pixelii ferestrei active au aceeai culoare i anume culoarea de fond curent. Poziia curent dup apelul este pixelul de coordonate relative (0,0), adic chiar colul din stnga sus al ferestrei. O alt funcie utilizat pentru a terge tot ecranul este : void cleardevice (void); Dup apelul funciei se terge tot ecranul i pixelul curent devine cel din colul stnga sus al ecranului. Parametrii ferestrei active se pot determina apelnd funcia: void getviewsettings (struct viewporttype *fereastra); unde: viewporttype - este un tip definit n fiierul graphics.h astfel: struct viewporttype {

int left; int top; int right; int bottom; int clip; }; Dup apelul funciei, la componentele structurii de tip viewporttype de la apel li se atribuie valorile corespunztoare ale ferestrei active. Parametrul clip are dou valori: CLIP_ON (valoarea 1) CLIP_OFF (valoarea 0) Dac clip are valoarea 1, atunci funciile de afiare a textelor i de desenare nu pot scrie sau desena n afara limitelor ferestrei active. n caz contrar, se pot depi limitele ferestrei active. Deci textele i figurile care nu ncap n fereastra activ se trunchiaz dac: Clip = CLIP_ON. Imaginea ecranului se pstreaz n memoria video a adaptorului grafic i formeaz o pagin. Funciile de desenare i scriere de texte acioneaz asupra unei singure pagini. Aceasta se numete pagina activ. Utilizatorul poate activa o pagin folosind funcia: void setactivepage (int nrpag); unde: nrpag - este numrul paginii care se activeaz De obicei, pagina activ este vizualizat pe ecran. Cu toate acestea, programatorul are posibilitatea s vizualizeze o alt pagin dect cea activ. Aceasta se realizeaz utiliznd funcia: void setvisualpage (int nrpag); unde: nrpag - este numrul paginii care se vizualizeaz Aceast funcie poate fi util pentru animaie. Imaginea unei zone dreptunghiulare de pe ecran poate fi salvat n memorie folosind funcia: void getimage (int st, int sus, int dr, int jos, void *zt); unde: (st, sus) - definete coordonatele colului stnga sus a zonei de pe ecran care se salveaz (dr, jos) - definete coordonatele colului dreapta jos a zonei de pe ecran care se salveaz zt - pointer spre zona de memorie n care se salveaz imaginea de pe ecran Dimensiunea zonei de memorie spre care pointeaz yt trebuie s fie suficient de mare pentru a putea salva datele care definesc imaginea de pe ecran, care se salveaz. Aceast dimensiune se poate determina folosind funcia: unsigned imagesize (int st, int sus, int dr, int jos); unde:

(st, sus) (dr, jos)

- definete coordonatele colului stnga sus a zonei dreptunghiulare de pe ecran - definete coordonatele colului dreapta jos a zonei dreptunghiulare de pe ecran

Funcia imagesize se apeleaz nainte de a apela funcia getimage pentru a stabili dimensiunea zonei de memorie necesar pentru a salva o imagine dreptunghiular de pe ecran. Zona de memorie respectiv se poate rezerva n memoria heap innd seama de valoarea returnat de funcia imagesize. Imaginea de pe ecran salvat cu ajutorul funciei getimage, poate fi afiat pe ecran n orice parte a acestuia, cu ajutorul funciei putimage. Cu aceast ocazie se pot face anumite operaii asupra datelor care definesc imaginea. Funcia are prototipul: void putimage (int st, int sus, void *yt, int op); unde: (st, sus) - definete coordonatele colului stnga sus a zonei de pe ecran n care se afieaz imaginea zt - pointer spre zona n care se pstreaz datele care formeaz imaginea de afiat op - definete operaia ntre datele aflate n zona spre care pointeaz yt i cele existente pe ecran n zona dreptunghiular definit de parametrii st, sus (colul din stnga sus; colul din dreapta jos rezult din datele existente n zona spre care pointeaz zt) Parametrul op se definete astfel: Constant simbolic COPY_PUT XOR_PUT OR_PUT AND_PUT NOT_PUT Valoare 0 1 2 3 4 Aciune Copiaz imaginea din memorie pe ecran sau exclusiv ntre datele de pe ecran i cele aflate n memorie sau ntre datele de pe ecran i cele din memorie i ntre datele de pe ecran i cele din memorie Copiaz imaginea din memorie pe ecran completnd datele n memorie

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