Grafica

Probleme:

1) desenati o casuta, o omida, un smiley 2) realizati un screensaver cu dreptunghiuri de diferite culori (generate aleator la fel ca si coordonatele dreptunghiului) 3) desenati n cercuri concentrice, de culori generate aleator. 4)realizati un grafic de tip Pie reprezentand numarul de fete si baieti din clasa voastra 5) realizati un grafic al notelor la teza 6) desenati o tabla de sah. 7) desenati un cerc care se deplaseaza din stanga ecranului spre dreapta, cand ajunge in dreapta coboara si merge spre stanga etc, pana ajunge in partea de jos a ecranului.





proiect de grafica in CodeBlocks

1) deschideti un proiect nou si adaugati fisierul sursa; 2) copiati in **folderul** proiectului fisierele graphics2.h si winbgi2.cpp; 3) __adaugati la proiect__ fisierele graphics2.h si winbgi2.cpp; (cel cu extensia .h va fi inclus la Headers, cel .cpp la sources) 4) includeti in sursa headerul cu functiile grafice folosind directiva: 5) legati la proiect biblioteca //libgdi32.a//, folosind meniul "Project", optiunea "Build Options", Accesati tab-ul "Linker Settings" si, in campul "Link libraries:" introduceti __calea completa__ pana la biblioteca. De exemplu: C:\ProgramFiles\CodeBlocks\MinGW\lib\libgdi32.a 6) (in sursa) initializati modul grafic, folositi functiile de desenare, opriti executia programului pentru a vedea rezultatul si apoi inchideti modul grafic. De exemplu sursa de mai jos deseneaza un cerc in mijlocul ferestrei.
 * Indicatii instalare Grafica in CodeBlocks **
 * 1) include "graphics2.h"

//Ce e colorat cu albastru mai jos nu trebuie sa lipseasca dintr-un program de grafica//. int main { int driver, mod; initgraph(&driver, &mod, "", 1024, 768); int XM,YM,midx,midy; XM = getmaxx; YM = getmaxy; midx=XM/2; midy=YM/2; setcolor(CYAN); circle(midx, midy, 100); while( !kbhit ); closegraph; return 0; }
 * 1) include "graphics2.h"

Ghid pentru functii: [|http://www.cs.colorado.edu/~main/cs1300/doc/bgi/index.html]

Placa grafică tratează ecranul în două moduri: //text// şi //grafic//. În **modul text** fiecare caracter care urmează a fi afişat pe ecran este păstrat în memoria ecran pe 2 octeţi (primul cuprinde codul ASCII al caracterului, iar al doilea caracteristicile caracterului: culoare, iluminare, culoare fond, clipire). În **modul grafic**, memoria ecran cuprinde pentru fiecare pixel (element de imagine) de pe ecran un cod reprezentat pe biţi prin care se determină culoarea pixelului. Datorită acestui mod de codificare, memoria ecran poate cuprinde imaginea codificată a mai multor ecrane. Zona din memoria ecran necesară pentru memorarea unui ecran se numeşte **pagină video**. La un moment dat doar o pagină din paginile video apare pe ecran; aceasta se numeşte **pagina vizibilă**. A) Funcţii pentru controlul sistemului grafic void initgraph(int *driver, int *mod,char *cale); iniţializează modul grafic. Pentru a asigura portabilitatea programului pentru calculatoare cu diverse tipuri de adaptoare funcţia se foloseşte: int driver = DETECT, mod; initgraph(&driver, &mod, ˝˝);  getwindowwidth; returneaza latimea maxima a ferestrei getwindowheight; returneaza inaltimea maxima a ferestrei initwindow(x,y,”titlu fereastra”); deschide o fereastra de dimensiunile specificate int getmaxx(void); determină rezoluţia modului grafic curent pe orizontală int getmaxy(void); determină rezoluţia modului grafic curent pe verticală void restorecrtmode(void); trece din modul grafic în modul text void setgraphmode(int mode); revenirea în modul grafic void closegraph(void); închide sistemul grafic, eliberează memoria alocată pentru driver şi revine în modul text existent înainte de apelul funcţiei initgraph. int graphresult(void); returnează codul erorii, dacă apare o eroare la executarea unei funcţii a sistemului grafic char * grapherrormsg(int cod_eroare); întoarece adresa mesajului asociat codului de eroare B) Funcţii pentru controlul culorii Există constante predefinite pentru culori (se poate folosi atât numele, cât şi codul culorii.)
 * Placa grafică** este componenta hard a calculatorului care asigură gestiunea memoriei ecran şi controlul monitorului video. **Memoria ecran** aparţine plăcii grafice şi păstrează informaţiile ce se afişează "instantaneu" pe ecran. Memoria ecran poate fi adresată ca o memorie obişnuită.
 * Driver-ul grafic** este componenta software care comandă placa grafică.
 * BLACK || 0 ||
 * BLUE || 1 ||
 * GREEN || 2 ||
 * CYAN || 3 ||
 * RED || 4 ||
 * MAGENTA || 5 ||
 * BROWN || 6 ||
 * LIGHTGRAY || 7 ||
 * DARKGRAY || 8 ||
 * LIGHTBLUE || 9 ||
 * LIGHTGREEN || 10 ||
 * LIGHTCYAN || 11 ||
 * LIGHTRED || 12 ||
 * LIGHTMAGENTA || 13 ||
 * YELLOW || 14 ||
 * WHITE || 15 ||

int getcolor(void); întoarce culoarea curentă de desenare void setcolor(int culoare_noua); fixează culoarea curentă de desenare int getbkcolor(void) //;// întoarce culoarea curentă a fundalului void setbkcolor(int color); fixează culoarea curentă a fundalului unsigned getpixel(int x, int y); returnează culoarea punctului de coordonate (x,y) putpixel(int x, int y, int cul); desenează un punct de culoarea cul la coordonatele (x, y) int getmaxcolor(void); întoarce cel mai mare număr ce reprezintă codul unei culori valide int RGB(int,int,int) intoarce codul unei culori pentru care specificam codurile red, green si blue (numere intre 0 si 255)

** C) Funcţii de desenare ** int getx(void); întoarce numărul coloanei curente în fereastră int gety(void); întoarce numărul liniei curente în fereastră void moveto(int x, int y); mută poziţia curentă la coordonatele absolute (x,y) void moverel(int dx, int dy); realizează o deplasare relativă a poziţiei curente Există **3 metode de a desena linii**: void line(int x1, int y1, int x2, int y2);  void linerel(int dx, int dy);  void lineto(int x, int y);  line desenează o linie între punctele (x1,y1) si (x2,y2) fără a modifica poziţia curentă linerel desenează o linie între poziţia curentă (pcx,pcy) şi punctul (pcx+dx, pcy+dy) care devine noua poziţie curentă lineto desenează o linie între poziţia curentă şi punctul (x,y) care devine noua poziţie curentă În C se mai pot desena (pe lânga puncte şi linii) **cercuri, arce, elipse, dreptunghiuri şi poligoane**: void circle(int x, int y, int raza); - punctul (x,y) este centrul cercului void arc(int x, int y, int inceput_unghi, int s sit_unghi, int raza); unghiurile au valori de la 0 la 360 de grade void ellipse(int x, int y, inceput_unghi, int s sit_unghi, int raza_x, int raza_y); void rectangle(int stanga, int sus, int dreapta, int jos); void drawpoly(int nr_puncte, int *coord_puncte); ** Toate figurile sunt desenate folosind culoarea curentă şi stilul de linie curent. ** void setlinestyle(int stil_linie, unsigned model, int grosime); modifică stilul liniei stil_linie poate fi: "SOLID_LINE" = linie continuă, "DOTTED_LINE" = linie punctată, "CENTER_LINE" = linie punct, "DASHED_LINE"= linie întreruptă, "USERBIT_LINE" = stil definit de utilizator. //grosime// poate fi: NORM_WIDTH (un pixel lăţime), THICK_WIDTH (3 pixeli lăţime). D) Colorarea şi haşurarea figurilor void floodfill(int x, int y, int culoare_contur); umple cu modelul şi culoarea de haşurare curente suprafaţa care conţine punctul (x,y) şi este mărginită de un contur egal cu culoarea indicată void setfillstyle(int model, int culoare); fixează modelul şi culoarea de umplere. Pentru desenarea şi colorarea imediată a figurilor există un set de funcţii separat. **Se pot desena şi colora dreptunghiuri (bare), elipse, poligoane, sectoare de cerc sau elipsă şi bare tridimensionale:** void bar(int stanga, int sus, int dreapta, int jos);  void fillellipse(int x, int y, int raza_x, int raza_y);  void sector(int x, int y, int unghi_inceput, int unghi_s sit, int raza_x, int raza_y);  void fillpoly(int nr_puncte, int *coord_poligon);  void pieslice(int x, int y, int unghi_inceput, int unghi_s sit, int raza);  void bar3d(int stanga, int sus, int dreapta, int jos, int adancime, int varf); dacă vârf=1 atunci se desenează şi partea superioară a barei, iar dacă vârf=0 atunci vârful barei nu se mai desenează. În lipsa unui criteriu se poate alege adâncime=25% din laţime. E) Afişarea textului în mod grafic void settextjustify(int oriz, int vert); controlează alinierea textului faţă de poziţia curentă void settextstyle(int font, int directie, int marime); setarea dimensiunii, a tipului de caracter şi a direcţiei textului (directie= HORIZ_DIR= orizontal sau directie= VERT_DIR =vertical) Cele 2 funcţii de mai sus sunt valabile în cazul afişării textului cu funcţiile: outtext sau outtextxy  void outtext(char * text); afisează textul la poziţia curentă void outtextxy(int x, inty, char *text); afişează textul la poziţia (x,y).
 * **Model** || **Valoare** || **Descriere** ||
 * EMPTY_FILL || 0 || Umple cu culoarea de fond ||
 * SOLID_FILL || 1 || Umple uniform (toti pixelii) ||
 * LINE_FILL || 2 || Haşură orizontală --- ||
 * LTSLASH_FILL || 3 || Haşură / ||
 * SLASH_FILL || 4 || Haşură /, linii groase ||
 * BKSLASH_FILL || 5 || Haşură \\\, linii groase ||
 * LTBKSLASH_FILL || 6 || Haşură \\\ ||
 * HATCH_FILL || 7 || Haşură în cruce ++ ||
 * XHATCH_FILL || 8 || Haşură în cruce oblică ||
 * INTERLEAVE_FILL || 9 || Haşura cu intreţesere ||
 * WIDE_DOT_FILL || 10 || Umplere cu puncte rare ||
 * CLOSE_DOT_FILL || 11 || Umplere cu puncte dese ||
 * USER_FILL || 12 || Model definit de programator ||
 * Colorarea si haşurarea se face cu modelul şi culoarea curente fixate cu //setfillstyle//. Cu excepţia barei (bidimensionale) care nu are contur, pentru toate celelalte figuri conturul este desenat cu stilul de linie şi culoarea curente, fixate cu //setlinestyle// şi //setcolor//.**
 * Descriere || Nume || Valoare || Acţiune ||
 * Oriz || LEFT_TEXT || 0 || Poziţia curentă la stânga textului ||
 * || CENTER_TEXT || 1 || Poziţia curentă în centrul textului ||
 * || RIGHT_TEXT || 2 || Poziţia curentă la dreapta textului ||
 * Vert || BOTTOM_TEXT || 0 || Poziţia curentă la baza textului ||
 * || CENTER_TEXT || 1 || Poziţia curentă în centrul textului ||
 * || TOP_TEXT || 2 || Poziţia curentă deasupra centrului ||

code int kbhit(void); code The kbhit function is available in the [|winbgim] implementation of BGI graphics. You do not need to include conio.h; just include graphics.h. The function returns true (non-zero) if there is a character in the input buffer ready to read. Otherwise it returns false. In order to work, the user must click in the graphics window (i.e., the Windows focus must be in the graphics window).
 * F) Alte functii utile**

code int getch(void); code The getch function is available in the [|winbgim] implementation of BGI graphics. You do not need to include conio.h; just include graphics.h. The function reads one character from the keyboard and returns its ASCII value (without waiting for a return key). In order to work, the user must click in the graphics window (i.e., the Windows focus must be in the graphics window).

code void delay(int millisec); code The delay function is available in the [|winbgim] implementation of BGI graphics. You do not need to include conio.h; just include graphics.h. The function pauses the computation for the the specified number of milliseconds.

int rand genereaza un numar aleator intre 0 si RAND_MAX. Daca dorim sa generam numere intre 0 si x, vom scrie rand%x. Trebuie apelata si functia srand(time(NULL)); o singura data, la inceputul programului.