PROGRAMAREA ECRANULUI ÎN MOD GRAFIC (2) 1. Umplerea figurilor Aceasta operatie se realizeaza cu functiile: a). void far bar(int st, int sus, int dr, int jos); Deseneaza o bara dreptunghiulara bidimensionala, fara contur, umpluta în functie de modul si culoarea de umplere curenta. Parametrii au aceiasi semnificatie ca la rectangle. Exemplu: //deseneaza semnul '+' în centrul ecranului de dimensiune mare bar(xmax/2 - 10, ymax/2 - 50, xmax/2 +10, ymax/2 + 50); bar(xmax/2 - 50, ymax/2 - 10, xmax/2 + 50, ymax/2 +10); b). void far bar3d(int st,int sus,int dr,int jos,int adanc,int acop); Deseneaza o bara dreptunghiulara tridimensionala, conturata, umpluta în functie de modul si culoarea de umplere curenta. Primii patru parametrii au aceeasi semnificatie ca la functia bar. Adâncimea barei este specificata de parametrul adanc. Daca adanc = 0, atunci se deseneaza o bara bidimensionala conturata. Parametrul acop specifica daca bara va fi acoperita (acop 0) sau nu (acop = 0). Exemplu: //deseneaza semnul '+' tridimensional în centrul ecranului bar3d(xmax/2 - 10, ymax/2 - 50, xmax/2 + 10, ymax/2 + 50, 10, 1); bar3d(xmax/2 - 50, ymax/2 - 10, xmax/2 + 50, ymax/2 + 10, 10, 1); c). void far fillellipse(int x, int rx, int ry); Deseneaza o elipsa de centru (x ,y) si raze rx, ry, umpluta functie de modul si culoarea curenta. Exemplu: //simuleaza o stiva de 10 discuri magnetice (platan) int i; for(i = 0; i < 10; i++) fillellipse(xmax/2, ymax/2 + i *20, 40, 8); d). void far fillpoly(int nr_varf, int far tablou_de_puncte); Deseneaza conturul unui poligon cu nr_varf vârfuri, folosind culoarea curenta, umpluta în functie de modul si culoarea de umplere curenta. Parametrul tablou_de_puncte este un tablou de (nr_varf*2) întregi, fiecare pereche reprezentând coordonatele x si y ale cate unui vârf. Daca se doreste închiderea conturului, prima si ultima pereche sunt identice. Exemplu: //deseneaza un romb umplut cu culoarea curenta int romb[ ] = {100, 100, 150, 200, 100, 300, 50, 200, 100, 100}; fillpoly(5, romb); e). void far pieslice(int x, int y, int unghi_1, int unghi_2, int r); Deseneaza conturul si umple un sector de cerc, de centru (x, y), între unghi_1 si unghi_2, de raza r. Valoarea unghiurilor creste în sens trigonometric si este data în grade hexazecimale. f). void far sector(int x,int y, int unghi_1, int unghi_2, int rx, int ry); Deseneaza si umple conturul folosind pozitionarile curente, un sector de elipsa, ai carui parametri sunt identici cu cei de la functia ellipse. Exemplu: //deseneaza un cerc cu raza de 50 de pixeli (compus din 4 sectoare) int i; for(i = 0; i < 4; i++) sector(xmax/2, ymax/2, i*90, (i + 1)*90, 50, 50); g). void setlinestyle(int stil, int sablon, int grosime); Stabileste stilul de trasare al liniilor pentru desenele realizate. Parametrii functiei corespund membrilor structurii linesettingstype, definita în graphics.h: struct linesettingstype { int linestyle; //stil unsigned pattern; //sablon int thickness; //grosime }; Parametrul stil, corespunde lui linestyle , specifica modul de trasare al liniilor. El poate avea una din valorile: SOLID_LINE = 0 linie continua DOTTED_LINE = 1 linie punctata CENTER_LINE = 2 linie centrata DASHED_LINE = 3 linie întrerupta USERBIT_LINE = 4 model definit de utilizator Parametrul sablon (corespunde lui pattern) este 0 daca stil apartine multimii {0, 1, 2, 3} si are valoare 0 daca stil = 4 (adica USERBIT_LINE). În acest caz, daca un bit din sablon este pozitionat pe 1, pixelul corespunzator din linie este desenat utilizând culoarea de desen curenta. Exemplu: 0xFFFF este linia continua (SOLID _LINE) 0xAAAA este linia punctata (DOTTED_LINE) Parametrul grosime (corespunzator lui thickness) specifica grosimea liniilor: NORM_WIDTH grosimea liniei este un pixel THICK_WIDTH grosimea liniei este de 3 pixeli Exemplu: //deseneaza toate tipurile de linii definite de utilizator (si cele predefinite) // la fiecare apasare de tasta se afiseaza o linie cu un nou model int i; for(i = 0; i < 0xFFFF; i++) { setlinestyle(USERBIT_LINE, i, THICK_WIDTH); line(0, ymax/2, xmax, ymax/2); getch(); cleardevice(); //sterge ecranul în modul grafic } h). void far setfillstyle(int sablon, int culoare); Stabileste modul si culoarea de umplere curente. Modurile de umplere, corespunzatoare sablonului, se afla în enumerarea fill_pattern din graphics.h. i). void far setfillpattern(char far *sablon, int culoare); Functia este asemanatoare cu setfillstyle, dar se foloseste pentru selectarea unui sablon definit de utilizator. Exemplu: a) char sablon[ ] = {0xFF, 0xFF, ...0xFF}; //de 8 ori, defineste pattern-ul SOLID_FILL setfillpattern(sablon, getmaxcolor()); b) char sablon[ ] = {0x8, 0x1C, 0x3E, 0x7F, 0xFE, 0x7C, 0x38, 0x10}; //defineste un model oarecare de pattern setfillpattern(sablon, WHITE); bar(xmax/2 - 50, ymax/2 - 50, xmax/ + 50, ymax/2 + 50); j). void far getfillpattern(char far* sablon); Memoreaza un model de umplere definit de utilizator cu o functie setfillpattern, într-o zona de memorie de 8 octeti, pointata de sablon. Fiecare octet corespunde la 8 pixeli din sablon. k). void far getfillsettings(struct fillsettingstype far* info); Memoreaza o structura de tipul fillsettingstype pointata de info. Structura contine informatii privind umplerea si culoarea: struct fillsettingstype { int pattern; //modelul de umplere int color; //culoarea de umplere }; Exemplu: Sa se scrie o secventa de program pentru desenarea cu contur alb si umplerea cu diferite culori a unor sectoare de cerc. #include #include int gd = DETECT, gm, i, xmax, ymax; void main(void) { initgraph(&gd, &gm, "...bgi"); xmax = getmaxx(); ymax = getmaxy(); setcolor(WHITE); for(i = 0; i < 12; i++) { setfillstyle(i, i + 1); pieslice(xmax/2, ymax/2, i*30, i*30 + 30, 150); getch(); } closegraph(); } 2. Afisarea textelor Se folosesc urmatoarele functii: a). void far gettextsettings(struct textsettingstype far* info); Completeaza o structura de tipul textsettingstype, pointata de info cu informatii despre setul de caractere, directia, dimensiunea si alinierea lor. Aceasta structura este definita în graphics.h astfel: struct textsettingstype { int font; int direction; int charsize int horiz; int vert; }; b). void far outtext(char far* sir); Scrie sirul specificat de sir începând de la pozitia curenta. Implicit textul este scris orizontal, aliniat la stânga. Dupa scrierea sirului, pozitia curenta se muta la sfârsitul lui. Urmatorul apel outtext va plasa noul sir în continuarea sirului anterior. Exemplu: //afiseaza pe mijlocul ecranului textul specificat moveto(xmax/2 - 140, ymax/2); outtext("FACULTATEA DE AUTOMATICA SI "); outtext("CALCULATOARE"); //un nou apel plaseaza sirul în continuare c). void far outtextxy(int c, int y, char far* sir); Scrie sirul specificat începând de la pozitia de coordonate (x, y). Exemplu: char *universitate = "UNIVERSITATEA TEHNICA GH. ASACHI"; char *facultate = "FACULTATEA DE AUTOMATICA SI CALCULATOARE"; outtextxy(xmax/2 - 100, ymax/2 - 20, universitate); outtextxy(xmax/2 - 100, ymax/2, facultate); d). void far settextjustify(int horiz, int vert); Stabileste alinierea textului grafic scris, orizontal si vertical, în jurul pozitiei curente. Enumerarea text_just se afla în conio.h si contine: - pentru orizontala: LEFT_TEXT = 0 implicit (pozitia curenta este la stânga textului) CENTER_TEXT = 1 RIGHT_TEXT = 2 (pozitia curenta este la dreapta textului) - pentru verticala: BOTTOM_TEXT = 0 implicit CENTER_TEXT = 1 TOP_TEXT = 2 e). void far settextstyle(int set, int directie, int dim); Stabileste setul de caractere, directia de scriere si dimensiunea lor. Parametrul set specifica setul de caractere. În modul grafic exista 2 moduri de scriere a caracterelor: - implicit se utilizeaza setul mapat; fiecare caracter este o matrice de 8x8 biti; - cu seturi (fonturi) de caractere, pentru scrierea textelor de calitate; fiecare caracter este definit printr-un set de segmente, segmente care specifica sistemului grafic modul de desenare a caracterului. Rezolutia se pastreaza si pentru caractere cu dimensiuni mari. Seturile disponibile sunt: DEFAULT_FONT = 0 set mapat 8x8 biti (implicit) TRIPLEX_FONT = 1 set trasat triplex SMALL_FONT = 2 set trasat small SANSSERIF_FONT = 3 set trasat sans-serif GOTHIC_FONT = 4 set trasat gotic Prin specificarea acestor seturi de caractere se cere încarcarea uni fisier în care sunt descrise caracterele folosind fonturile respective (*.CHR). Parametrul directie poate avea 2 valori: HORIZ_DIR = 0 orizontal (implicit) VERT_DIR = 1 vertical Parametrul dim specifica dimensiunea caracterelor si poate lua valori de la 0 la 10. Daca dim=1, functiile outtext si outtextxy vor afisa caracterele din setul mapat 8x8 intr-un dreptunghi de ecran de 8x8 pixeli. Daca dim=2, caracterele setului mapat se vor afisa intr-un dreptunghi de 16x16 pixeli, n=3 (24x24)...n=10 (80x80) Daca se da dim = 0, atunci functiile amintite vor folosi fie valoarea implicita, fie valoarea data de functia setusercharsize. Exemplu de program: //afisarea tuturor seturilor de caractere pe orizontala #include #include char* fonturi[ ] = {"DEFAULT font", "TRPLEX font", "SMALL font", \ "SANS SERIF font", "GOTHIC font"}; void main(void) { int gd = DETECT, gm, xmax, ymax, stil, dim; initgraph(&gd, &gm, "...bgi"); xmax = getmaxx(); ymax = getmaxy(); dim = 4; settextjustfy(CENTER_TEXT, CENTER_TEXT); for(stil = DEFAULT_FONT; stil <= GOTHIC_FONT, stil++) { cleardevice(); settextstyle(stil, HORIZ_DIR, dim); outtextxy(xmax/2, ymax/2, fonturi[stil]); getch(); } closegraph(); } f). void far setusercharsize(int multx,int divx,int multy,int divy); Permite stabilirea factorilor de scara (dim) pentru seturi de caractere trasate. Latimea implicita a caracterelor este scalata cu raportul multx/divx, iar înaltimea implicita cu raportul multy/divy. Functia are efect numai daca parametrul dim din functia settextstyle are valoarea 0. Exemplu: settextstyle(TRIPLEX_FONT, HORIZ_DIR, 0); moveto(0, getmaxy()/2); getch(); cleardevice(); outtext("Normal"); setusercharsize(1, 3, 1, 1); //face textul 1/3 din latimea normala outtext("Ingustat"); getch(); cleardevice(); setusercharsize(3, 1, 1, 1) //textul este largit de 3 ori decât cel normal outtext("Largit"); getch(); cleardevice(); g). int far textheight(char *sir); Returneaza înaltimea în pixeli a caracterelor din sir. h). int far textwidth(char far *sir); Returneaza latimea în pixeli a caracterelor din sir. 3. Alte functii utile a). void far cleardevice(void); Sterge fereastra de afisare curenta si stabileste pozitia curenta în punctul de coordonate (0, 0) relativ la fereastra stearsa. b). void far getimage(int st, int sus, int dr, int jos, void far *dest); Copie o imagine dintr-o zona ecran dreptunghiulara definita prin vârfurile sale (st, sus) si (dr, jos) intr-o zona de memorie de destinatie indicata de pointerul dest. c). unsigned far imagesize(int st, int sus, int dr, int jos); Returneaza numarul de octeti necesari pentru a memora imaginea din zona de ecran dreptunghiulara definita prin vârfurile sale. d). void far putimage(int st, int sus, void far *sursa, int op); Reface imaginea salvata cu getimage într-o zona ecran având vârful (st, sus). Parametrul sursa este un pointer pe zona unde este salvata imaginea. Parametrul op specifica modul de calculare a culorii elementelor de imagine pe baza culorii pixelului de pe ecran si a celui din memorie. Parametrul op poate avea una din valorile (enumerarea putimage_ops): COPY_PUT = 0 copiere XOR_PUT = 1 sau exclusiv OR_PUT = 2 sau AND_PUT = 3 si NOT_PUT = 4 negare Teme Problema 1 Sa se deseneze pe ecran 12 patrate dispuse pe trei rânduri care se vor umple cu cele 12 moduri standard de umplere. Sub fiecare mod se va scrie denumirea acestuia cu setul implicit de caractere. Problema 2 Sa se scrie un program care realizeaza urmatoarele: - scrie un text, centrat pe mijlocul ecranului; - la fiecare apasare a tastei 'M' sa se mareasca textul cu un increment prestabilit; - la fiecare apasare a tastei 'm' sa se micsoreze textul cu acelasi increment; - la apasarea tastei 'd' se schimba directia textului; - la apasarea tastei 'x' programul se termina. Problema 3 Sa se simuleze caderea literelor ce formeaza un text oarecare (cel mult o linie). Problema 4 În urma studiului rezultatelor obtinute de elevii unui liceu în timpului anului scolar s-au evidentiat urmatoarele: - 3 % din elevi au ramas corigenti - 12,5 % din elevi au medii între 5 si 6 - 17 % din elevi au medii între 6 si 7 - 37,5 % din elevi au medii între 7 si 8 - 17 % din elevi au medii între 8 si 9 - 13 % din elevi au medii între 9 si 10 Sa se reprezinte aceasta situatie, grafic, facând apel la: - diagrame dreptunghiulare (histograme) - diagrame circulare (asa numitele diagrame "placinte" - pie diagram). Se va înscrie un titlu pentru graficul respectiv, o legenda si se vor înscrie pe grafic si procentele corespunzatoare.