grafica

download grafica

of 14

description

grafica pe calculator

Transcript of grafica

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    1

    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

    2

    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.

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    3

    Utilizarea sistemului grafic presupune i includerea fiierului antet: #include sau #include "graphics.h" sau

    #include 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 DETECT CGA MCGA EGA EGA64 EGAMONO IBM8514 HERCMONO ATT400 VGA PC3270

    0 1 2 3 4 5 6 7 8 9 10

    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 VGA

    VGALO VGAMED VGAHI

    0 1 2

    640 200 640 350 640 480

    Pentru alte adaptoare: Driver Mod Valoare numeric Rezoluie CGA

    CGAC0 CGAC1

    0 1

    320 200 (i 4 culori) 320 200 (i 4 culori)

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    4

    CGAC2 CGAC3 CGAHI

    2 3 4

    320 200 (i 4 culori) 320 200 (i 4 culori) 640 200 (i 2 culori)

    MCGA

    MCGAC0 MCGAC1 MCGAC2 MCGAC3 MCGAMED CMGAHI

    0 1 2 3 4 5

    320 200 (i 4 culori) 320 200 (i 4 culori) 320 200 (i 4 culori) 320 200 (i 4 culori) 640 200 (i 2 culori) 640 480 (i 2 culori)

    EGA EGALO EGAHI

    0 1

    640 200 (i 16 culori) 640 350 (i 16 culori)

    EGA64 EGA64LO EGA64HI

    0 1

    640 200 (i 16 culori) 640 350 (i 16 culori)

    EGAMONO EGAMONOHI 3 640 200 (i 2 culori) ATT400C0 MCGAC0

    ATT400C1 ATT400C2 ATT400C3 ATT400MED ATT400HI

    0 1 2 3 4 5

    320 200 (i 4 culori) 320 200 (i 4 culori) 320 200 (i 4 culori) 320 200 (i 4 culori) 640 200 (i 2 culori) 640 400 (i 2 culori)

    HERC HERCMONO 0 720 348 (i 2 culori) PC3270 PC3270HI 0 640 350 (i 2 culori) IBM8514 IBM8514LO

    IBM8514HI 0 1

    640 80 (i 256 culori) 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

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    5

    (639,479) (0,479) Y

    X (639,0) (0,0)

    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 Constant Mesaj de eroare 0 grOK Nicio eroare -1 grNoInitGraph Driverul grafic BGI neinstalat (folosii initgraph) -2 grNotDetected Plac grafic negsit -3 grFileNotFound Fiierul pentru driverul grafic negsit -4 grInvalidDriver Fiierul invalid pentru driver grafic -5 grNoLoadMem Memorie insuficient pentru driver grafic -6 grNoScamMem Memorie insuficient pentru fill -7 grNoFloodMem Memorie insuficient pentru floodfill -8 grFontNonFound Fiier de font negsit -9 grNoFontMem Memorie insuficient pentru ncrcare de fonturi

    -10 grInvalidMode Mod grafic nepermis pentru driverul selectat -11 grError Eroare grafic -12 grIOError Eroare grafic de intrare-ieire -13 grInvalidFont Fiier de font invalid -14 grInvalidFontNum Numr de font invalid -15 grInvalidDeviceNum Numr de driver invalid -18 grInvalidVersion 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. (orientarea axelor pe hrtie) (orientarea axelor pe ecranul calculatorului)

    Y

    X O

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    6

    Aplicaie: Afiarea pe ecran a valorilor returnate de getmaxx() i getmaxy(). #include //sau #include #include #include //pt exit #include //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

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    7

    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 Valoare Aciune orizontal vertical

    LEFT_TEXT CENTER_TEXT RIGHT_TEXT BOTTOM_TEXT CENTER_TEXT TOP_TEXT

    0 1 2 0 1 2

    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 DEFAULT_FONT TRIPLEX_FONT SMALL_FONT SANS_SERIF_FONT GOTHIC_FONT

    0 1 2 3 4

    88 bit-mapped font stroked triplex font stroked small font stroked sans serif font stroked 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 VERT_DIR

    0 1

    stnga-dreapta 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

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    8

    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 func ia: 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 Valoare numerica

    Background Foreground

    BLACK Negru 0 Yes Yes BLUE Albastru 1 Yes Yes GREEN Verde 2 Yes Yes CYAN Azuriu 3 Yes Yes RED Rou 4 Yes Yes MAGENTA Violet 5 Yes Yes BROWN Maron 6 Yes Yes LIGHTGRAY Gri deschis 7 Yes Yes DARKGRAY Gri nchis 8 No Yes LIGHTBLUE Albastru deschis 9 No Yes LIGHTGREEN Verde deschis 10 No Yes LIGHTCYAN Azuriu deschis 11 No Yes LIGHTRED Rou deschis 12 No Yes LIGHTMAGENTA Violet deschis 13 No Yes YELLOW Galben 14 No Yes WHITE Alb 15 No Yes

    n WinGBIm, culorile pot fi specificate i n varianta RGB (red-green-blue = rou-verde-albastru) 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

    9

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

    De exemplu: #include #include 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; }

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

    100 250 300

    100 200 250

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    10

    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 #include 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.

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    11

    De exemplu: #include #include 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 Valoare Descriere SOLID_LINE DOTTED_LINE CENTER_LINE DASHED_LINE USERBIT_LINE

    0 1 2 3 4

    Linie continu Linie punctat Linie ntrerupt de forma Linie ntrerupt de forma Stil definit de utilizator

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    12

    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 THICK_WIDTH

    1 3

    1 pixel lime 3 pixel lime

    De exemplu: #include #include 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 Valoare Descriere EMPTY_FILL SOLID_FILL LINE_FILL LTSLASH_FILL SLASH_FILL BKSLASH_FILL LTBKSLASH_FILL HACH_FILL XHATCH_FILL INTERLEAVE_FILL

    0 1 2 3 4 5 6 7 8 9

    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

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    13

    WIDE_DOT_FILL CLOSE_DOT_FILL USER_FILL

    10 11 12

    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 #include #include #include using namespace std; int main() A-B AB B-A { 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) 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; }

  • Grafic pe calculator (26.02.2015) Informatica, anul 1 GpC_C01

    14

    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 func iile clasice de desenare i floodfill.

    Exemplu: #include #include #include 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; }