Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




UNIT-UL GRAPH

Informatica


UNIT-UL GRAPH

Unit-ul standard Graph implementeaza un numar de subprograme axate spre prelucrari grafice. Programele care utilizeaza subprogramele destinate prelucrarilor grafice trebuie sa contina directiva uses Graph.



Subprogramele unit-ului Graph pot li clasificate astfel:

initializarea modului grafic;

*     949e46j ;   tratarea erorilor grafice;

*     949e46j ;   definiri de ferestre si pagini;

*     949e46j ;   subprograme orientate spre puncte;

*     949e46j ;   subprograme orientate spre linii;

*     949e46j ;   subprograme orientate spre arcuri, cercuri si alte curbe;

subprograme orientate spre poligoane si hasurari;
*
subprograme orientate spre salvarea imaginilor;

subprograme orientate spre texte;

definiri de culori si de palete.

In acceptiunea unit-ului Graph, coltul stanga sus al ecranului grafic are coordonatele (0,0). Valorile x, sau coloanele, cresc spre dreapta. Valorile y, sau liniile, cresc in jos. Astfel, cu o placa CGA de mod 320x200, coordonatele celor patru colturi (cu un punct specificat in mijlocul ecranului) sunt urmatoarele:

  (0,0) (319,0)

(0,199) (319,199)

In unit-ul Graph este folosita notiunea de pointer actual (curent). Pointerul actual este similar cursorului din modul text, cu deosebirea ca acest pointer nu este vizibil.

Programe care utilizeaza unitul GRAPH.

6.1. Descrierea programelor

In acest capitol sunt prezentate programe care utilizeaza biblioteca grafica oferita de TP, numita GRAPH. Primele zece programe exemplifica folosirea primitivelor grafice ale acestui unit. Aceste programe au o structura asemanatoare, explicata in cele ce urmeaza. Scheletul dupa care au fost construite aceste programe este urmatorul:

program graf_xx; uses graph, crt;

var

gd, gm : integer;

stop : boolean;

begin

gd := detect;

initgraph (gd, gm,

if graphresult <> grok then

halt;

randomize;

stop := false;

repeat

if keypressed then

if readkey = #13 then

stop := true;

until stop;

cleardevice;

closegraph;

end.

In prima parte a programului este apelata procedura INITGRAPH. Sunt folosite variabilele intregi GD si GM, prima fiind initializata cu valoarea constantei DETECT recunoscuta de rutina de initializare INITGRAPH. Cel de-ai treilea parametru din apelurile acestei proceduri reprezinta directorul in care se cauta fisierele .BGI. Specificarea sirului vid ('') face ca aceste fisiere sa fie cautate in directorul curent. Spre exemplu daca dispuneti de o placa VGA fisierul EGAVGA.BGI trebuie sa se gaseasca in directorul curent in momentul rularii programului.

Detectarea unei eventuale erori se face cu functia GRAPHRESULT. Daca aceasta returneaza o valoare diferita de GROK (GROK este constanta a unitului GRAPH), atunci inseamna ca a aparut o eroare si programul este intrerupt cu HALT.

Atentie!

Apelul lui INITGRAPH trebuie sa preceada apelurile rutinelor de afisare grafica. Daca modul grafic care se doreste a fi folosit nu a fost initializat, incercarea de afisare pe ecran esueaza, programul intrerupandu-se cu eroare de executie. Acest lucru se intampla la aproape orice apel de rutina a unitului GRAPH in conditiile in care INTGRAPH nu a fost apelata sau nu s-a reusit initializarea modului grafic. INITGRAPH esueaza daca, spre exemplu, nu s-a gasit fisierul .BGI corespunzator sau nu exista suficienta memorie pentru incarcarea respectivului fisier. Exista insa si proceduri ale unitului GRAPH care pot fi apelate inaintea apelului lui INITGRAPH. De exemplu, DETECTGRAPH poate fi apelata inainte de initializarea grafica pentru a detecta placa grafica disponibila (Hercules, CGA, EGA, VGA etc.).

Intrucat primitivele grafice sunt afisate cu caracteristici aleatoare, generatorul de numere aleatoare trebuie initializat cu RANDOMIZE.

Urmeaza o bucla REPEAT in care se apeleaza RANDOM pentru generarea aleatoare a coordonatelor si culorilor de afisare a primitiveior grafice urmata de apelul rutinelor grafice corespunzatoare. Aceasta secventa de apeluri este specifica fiecarui program. Iesirea din REPEAT se face atunci cand este apasata tasta ENTER, al carei cod este 13. Sunt folosite functiile KEYPRESSED si READKEY ale unitului CRT. Prima determina daca a fost apasata o tasta, iar a doua determina codul acestei taste.

In final sunt apelate procedurile CLEARDEVICE si CLOSEGRAPH ale unitului GRAPH pentru stergerea ecranului, respectiv inchiderea modului grafic si revenirea ia modul text.

Alte functii si proceduri folosite frecvent in programele ce urmeaza sunt GETMAXX si GETMAXY pentru aflarea rezolutiei orizontale si verticale a monitorului, SETCOLOR pentru stabilirea culorii de desenare si SETFILLSTILE pentru stabilirea culorii de umplere in cazul elipselor, dreptunghiurilor, etc.

6.1.1. Programul GRAF_01

Sa se scrie un program care deseneaza pe ecran, in mod aleator, arce de cerc.

Pentru fiecare arc de cerc se genereaza aleator coordonatele (X,Y) ale centrului unui cerc, raza R a acestui cerc, S si E unghiurile de slart si sfarsit ale arcului acestui cerc care va fi afisat cit culoarea aleatoare C. Stabilirea culorii de desenare se face cu procedura SETCOLOR, iar trasarea efectiva a arcului de cerc se face cu ARC. Instructiunile care fac acest lucru sunt urmatoarele :

x := random (gettmaxx);

y := random (getmaxy);

c := random (getamax color + l);

s := random (360);

e := random (360);

r: = random (50); setcolor ( c );

arc (x, y, s, e, r);

Programul GRAF_02

Sa se scrie un program care deseneaza pe ecran, in mod aleator, dreptunghiuri.

Se genereaza mai intai coordonatele (XI,Yl) ale coltului stanga-sus al dreptunghiului, apoi la XI si Y l se adauga doua valori aleatoare cuprinse intre 0 si 49 reprezentand latimea-1, respectiv inaltimea-1 ale dreptunghiului, obtinandu-se astfel coordonatele (X2,Y2) ale coltului dreapta-jos al dreptunghiului. La generarea culorii se tine seama de valoarea intoarsa de functia GETMAXCOLOR, astfel incat programul sa ruleze corect oricare ar fi numarul de culori afisabile.

Stabilirea culorii de umplere a dreptunghiuri lor se face cu SETFILLSTYLE, iar desenarea acestora cu procedura BAR:

x1 : = random (getmaxx);

y1 : = random (getmaxy);

x2 : = x1 + random (50);

y2 : = y1 + random (50);

c : = random (getmaxcolor+1);

setfillsty1e (solidfill, c);

bar(x1,y1,x2, y2);

Programul GRAF_03

Sa se scrie un program care deseneaza pe ecran, in mod aleator, paralelipipede dreptunghice.

Programul GRAF_03 este identic cu cel precedent cu exceptia faptului ca se apeleaza BAR3D in loc de BAR. Este nevoie si de un parametru suplimentar D, care reprezinta adancimea paralelipipedului si care ia valori aleatoare pozitive mai mici decat 50 :

x1 : = random (getmaxx);

y1 : = random (getmaxy);

x2 : = x1 + random (50);

y2 : = y1+ random (50);

c : = random (getmaxcolor+l);

d : = random (50);

setfillsty1e (solidfill, c);

bar3d (x1, y1, x2, y2, d, topon);

6.1.4. Programul GRAF_04

Sa se scrie un program care deseneaza pe ecran, in mod aleator, cercuri concentrice.

Intrucat cercurile sunt concentrice, calcularea coordonatelor (X,Y) ale centrului comun este facuta in afara buclei REPEAT:

x : = getmaxx div 2;

y : = getmaxy div 2;

Se observa ca centrul cercurilor va coincide cu unul din punctele situate in mijlocul ecranului.

Grupul de instructiuni din bucla REPEAT specifice acestui program este urmatorul:

c := random (getmaxcolor+1);

r := random (y);

setcolor ( c );

circle (x, y, r);

Dupa aflarea culorii C si a razei R ale cercului, acesta este trasat pe ecran cu procedura CIRCLE a unitului GRAPH.



6.1.5. Programul GRAF_05

Sa se scrie un program care deseneaza pe ecran, in mod aleator, elipse.

Pentru fiecare elipsa se stabilesc coordonatele centrului (X,Y), culoarea C si razele XR si YR. Culoarea de umplere este setata cu SETFILLSTYLE, iar desenarea elipselor se face cu procedura FILLELIPSE a unitului GRAPH:

x : = random (getmaxx);

y := random (getmaxy);

c := random (getmaxcolor+1);

xr: = random (25);

yr: = random (25);

setfillsty1e (solidfill, c);

fillellipse (x, y, xr, yr);

Ca si la programele precedente X si Y nu iau valori mai mari decat valorile returnate de GETMAXX si GETMAXY, iar valoarea lui C este cuprinsa intre 0 si intregul returnat de GETMAXCOLOR.

Programul GRAF_06

Sa se scrie un program care deseneaza pe ecran, in mod aleator, linii.

Liniile trasate pe ecran, cu culoarea C, au ca extremitati punctele ale caror coordonate sunt generate aleator in perechile de variabile (X1,Y1), respectiv (X2,Y2):

x1 := random (getmaxx);

y2:= random (getmaxy);

c := random (getemaxcolor + 1);

setcolor ( c );

line (x1,y1,x2,y2);

S-a folosit procedura LINE a unitului GRAPH, careia i s-au furnizat ca parametri variabilele X1, Y1, X2 si Y2.

Programul GRAF_07

Sa se scrie un program care deseneaza pe ecran, in mod aleator, sectoare de cerc.

Singurele deosebiri dintre GRAPH_01 si acest program sunt apelurile lui SETFILLSTYLE si PIESLICE in loc de SETCOLOR si ARC.

x := random (getmaxx);

y := random (getmaxy);

c := random (getmaxcolor+1);

s := random (360);

e := random (360);

r := random (50);

setfillsty1e (solidfill, c); pieslice (x, y, s, e, r);

In urma apelurilor lui PIESLICE, pe ecran vor aparea sectoare de cerc la coordonate aleatoare, in pozitii aleatoare si colorate cu culori aleatoare.

Programul GRAF_08

Sa se scrie un program care deseneaza pe ecran, in mod aleator, puncte.

Afisarea pe ecran a unui punct aleator se face cu ajutorul procedurii PUTPIXEL a unitului GRAPH, astfel:

x := random (getmaxx);

y := random (getmaxy);

c := random (getmaxcolor+1);

putpixel (x, y, c);

Valorile variabilelor X si Y reprezinta coordonatele punctului, iar C este culoarea acestuia.

Programul GRAF_09

Sa se scrie un program care deseneaza pe ecran, in mod aleator, patrate cu acelasi centru de simetrie.

In afara buclei REPEAT se calculeaza centrul ecranului impartind la 2 valorile returnate de functiile GETMAXX si GETMAXY :

x: = getmaxx div 2;

Grupul de instructiuni din bucla REPEAT calculeaza coordonatele (X1,Y1) si (X2,Y2) a doua puncte simetrice fata de (X, Y), care vor reprezenta colturile stanga-sus, respectiv dreapta-jos ale patratului :

d := random (y);

x1 := x - d ;

y1 := y - d;

x2 : = x + d;

y2 := y + d;

c : = random (getmaxcolor+1);

setcolor ( c );

rectangle (x1, y1, x2, y 2);

Stabilirea culorii de desenare se face cu SETCOLOR, iar trasarea patratelor cu

RECTANGLE.

Atentie!

Procedura RECTANGLE permite in general trasarea de dreptunghiuri, patratul fiind tratat ca un caz particular de dreptunghi. Totusi pe monitoare al caror raport dintre rezolutia orizontala si cea verticala nu este 4/3 'patratele' vor aparea deformate. Daca se doreste afisarea de patrate 'corecte' trebuie sa se tina seama de acest raport.

6.1.10. Programul GRAF_10

Sa se scrie un program care deseneaza pe ecran, in mod aleator, sectoare de elipsa.

Acest program este asemanator cu GRAPH_07, care desena sectoare de cerc, numai ca acum este nevoie de doua raze XR si YR, in locul procedurii PIESLICE folosindu-se SECTOR, procedura care deseneaza pe. ecran un sector de elipsa.

x := random (getmaxx);

y := random (getmaxy);

c := random (getmaxcolor+1);

s := random (360);

e := random (360);

xr := random (50);

yr: = random (50);

setfillsty1e (soldfill, c);

sector (x, y, s, e, xr, yr);

6.1.11. Programul MAINGRAF

Sa se scrie un program care sa permita rularea programelor de mai sus in functie de tastele apasate : F1-GRAF_01, F2-GRAF_02, F10-GRAF_10.

Pentru ca programul sa ruleze corect executabilele GRAF_XX.EXE, trebuie sa se afle in directorul curent in momentul lansarii in executie a programului, intrucat aceste programe executabile sunt apelate din interiorul lui MAINGRAF folosindu-se procedura EXEC a unitului DOS, va trebui folosita directiva de compilare $M pentru a limita memoria alocata programului astfel in cat sa existe memorie si pentru rularea program elor GRAF_XX.EXE.

Codul sursa al programului contine doua proceduri numite MENU si MAIN. Prima sterge ecranul apeland procedura CLRSCR a unitului CRT si afiseaza meniul programului :

F1 Graf_01

F2 Graf_02

F3 Graf_03

F4 Graf_04

F5 Graf_05

F6 Graf_06

F7 Graf_07

F8 Graf_08

F9 Graf_09

F10 Graf_10

ESC Exit

Acest meniu indica utilizatorului ce taste trebuie sa apese pentru a comunica programului ce trebuie sa faca.

Cea de-a doua procedura este apelata de programul principal si contine o bucla REPEAT in care este apelata MENU, se foloseste READKEY pentru a obtine codurile tastelor apasate si se apeleaza unul din programele GRAF_XX.EXE, daca este cazul.

procedure main; var

ch : char; begin repeat

menu;

repeat

ch := readkey;

if ch = #0then

ch : = readkey;

until ch in[#27,#59, #68];

swapvectors;

case ord (ch) - 58 of

1     949e46j ;   : exec('GRAF_0l.EXE','');

2     949e46j ;   : exec('GRAF_02.EXE',''

10 : exec('GRAF_10.EXE','');

end;

swapvectors;

if doserror <> 0 then

begin

writeln ('ERROR');

halt;

end;

until ch = #27;

clrscr;

end;

Codurile tastelor functionale F1, F2, F10 suni formate din doi octeti dintre care primul este 0, diferentierea facandu-se dupa al doilea: 59 pt. F1, 60 pt. F2, pt. F10. Inainte si dupa apelul kui EXEC trebuie apelata procedura SWAPVECTORS a unitului DOS din motive care au fost explicate in capitolul 4.

Se iese din bucla REPEAT, apoi din program, in urma actionarii de catre utilizator a tastei ESC, al carei cod este 27.

6.2. Sursele programelor

6.2.1. Sursa programului GRAF J)l

program graf_01;



uses graph, crt;

var gd, gm : integer;

stop : boolean;

x, y : integer;

s, e, r:, c : word;

begin

gd : = detect;

initgraph (gd, gm, '');

if graphresult <> grok then halt;

randomize;

stop := false;

repeat

x := random (getmaxx);

y := random (getmaxy);

c := random (getmaxcolor+1);

s := random (360);

e := random (360);

r := random (50);

setcolor ( c );

arc (x, y, s, e, r);

if readkey = #13 then stop := true;

until stop;

cleardevice;

closegraph;

end.

6.2.2. Sursa programului GRAF_02

program graf_02;

uses graph, crt;

var

gd, gm : integer;

stop : boolean,

x1, y1, x2, y2 : integer;

c : word;

begin

gd := detect;

initgraph (gd, gm, '');

if graphresult <> grok then halt;

randomize;

stop := false;

repeat

x1 := random (getmaxx);

y1 := random (getmaxy);

x2 := x1 + random (50);

y2 := y1 + random (50);

c := random (getmaxcolor+1);

setfillsty1e(solidfill,c);

bar (x1, y1, x2, y2);

if keypressed then if readkey = #13 then

stop := true;

until stop;

cleardevice;

closegraph;

end.

6.2.3. Sursa programului GRAF__03

program graf_05;

uses graph, crt;

var

gd, gm : integer;

stop : boolean;

x1, y1, x2, y2: integer;

c, d : word, begin

gd := detect;

initgraph (gd, gm, '');

if graphresult <> grok then halt;

randomize;

stop : = false;

repeat

x1 := random (getmaxx);

y1 := random (getmaxy);

x2 := x1 + random (50);

y2 := y1 + random (50);

c := random (getmaxcolor+l);

d := random (50);

setfillstyle(solidfill, c);

bar3d (x1, y1, x2, y2, d, topon);

if keypressed then

if readkey = #13 then

stop := truel

unril stop;

cleardevice;

closegraph;

end.

6.2.4. Sursa programului GRAF_04

program graf_04;

uses graph, crt;

var

gd, gm : integer;

stop : boolean;

x, y : integer;

r, c : word;

begin

gd := detect;

initgraph (gd, gm, '');

if graphresult <> grok then halt;

randomize;

stop := false;

x := getmaxx div 2;

y := getmaxy div 2;

repeat

c:= random (getmaxcolor+1);

r:= random (y);

setcolor ( c );

circle (x, y, r);

if keypressed then

if readkey = #13 then stop :=true ;

until stop;

cleardevice;

closegraph;

end.

6.2.5. Sursa programului GRAF_05

program graf_05;

uses graph, crt;

var

gd, gm : integer;

stop : boolean;

x, y ; integer;

xr, yr, c ; word; begm

gd := detect;

initgraph (gd, gm, '');

if graphresult <> grok then halt;

randomize;

stop := false;

repeat

x := random (getmaxx);

y := random (getmaxy);

c := random (getmaxcolor + 1);

xr: =: random (25);

yr : = random (25);

setfillsty1e (solidfill, c);

fillellipse (x, y, xr, yr);

if keypressed then if readkey = #13 then stop : = true;

until stop;

cleardevice;

closegraph;

end.

6.2.6. Sursa programului GRAF_06

program graf_06;

uses graph, crt;

var

gd, gm : integer;

stop : boolean;

x1, y I, x2, y 2 : integer;

c : word;

begin

gd := detect;

initgraph (gd,gm, '');

if graphresult <> grok then halt;

randomize;

stop : = false;

repeat

x1 := random (getmaxx);

y1 := random (getmaxy);

x2 := random (getmaxx);

y2 := random (getmaxy);

c := random (getmaxcolo + 1);

setcolor ( c );

line (x1, y1, x 2, y 2);

if keypressed then if readkey = #13 then

stop := true;

until stop;

cleardevice;

closegraph;

end.

6.2.7. Sursa programului GRAF_07

program graf_07;

uses graph, crt;



var

gd, gm : integer;

stop : boolean;

x, y : integer;

s, e, r, c : word;

begin

gd ; = detect;

initgraph (gd, gra, '');

if graphresult <> grok then halt;

randomize;

stop := false;

repeat

x := random (getmaxx);

y := random (getmaxy);

c := random (getmaxcolor+1);

s := random (360);

e := random (360);

r := random (50);

setfillsty1e (solidfill, c);

pieslice (x, y, s, e, r);

if keypressed then if readkey = #13 then

stop := true;

until stop;

cleardevice;

closegraph;

end.

6.2.8. Sursa programului GRAF_08

program graf_08;

uses graph, crt;

var

gd, gm : integer;

stop : boolean;

x, y : integer;

c :word;

begin

gd := detect;

initgraph (gd, gm, '');

if graphresulto grok then halt;

randomize:

stop : = false;

repeat

x := random (getmaxx);

y := random (getmaxy);

c : = random (getmaxcolor+1);

putpixel (x, y, c);

if keypressed then

if readkey = #13 then

stop := true;

until stop;

cleardevice;

closegraph;

end.

6.2.9. Sursa programului GRAF_09

program graf_09;

uses graph, crt;

var

gd, gm : integer;

stop : boolean;

x, y, x1, y1, x2, y2 : integer,

c, d : word;

begin

gd := detect;

initgraph (gd, gm, '');

if graphresult <> grok then halt;

randomize;

stop := false;

x := getmaxx div 2;

y := getmaxy div 2;

repeat

d := random (y);

x1 := x - d;

y1 := y - d;

x2 := x + d;

y2 := y + d;

c := random (getmaxcolor +l);

setcolor ( c );

rectangle (x1, y1, x2, y2);

if keypressed then if readkey = #13 then

stop : = true;

until stop;

cleardevice;

closegraph;

end.

6.2.10. Sursa programului GRAF_10

program graf_10;

uses graph, crt;

var

gd, gm : integer;

stop : boolean;

x, y : integer;

s, e, xr, yr, c : word; begin

gd := detect;

initgraph (gd, gm, '');

if graphresult <> grok then halt;

randomize; stop := false; repeat

x := random (getmaxx);

y := random (getmaxy);

c := random (getmaxcolor + 1);

s := raudom (360);

e := raudom (360);

xr := random (50);

yr := random (50);

setfillstyle (solidfill, c);

sector (x, y, s, e, xr, yr);

if keypressed then

if readkey = #13 then

stop := true;

until stop;

cleardevice;

closegraph;

end.

6.2.11. Sursa programului MAINGRF

program maingraf;

uses crt, dos;

begin

clrscr;

writeln('----- ----- -------------');

writeln('F1 Graf_01');

writeln('F2 Graf_02');

writeln('F3 Graf_03');

writeln('F4 Graf_04');

writeln('F Graf_05');

writeln('F6 Graf_06');

writeln('F7 Graf_07');

writeln('F8 Graf_08');

writeln('F9 Graf_09');

writeln('F10 Graf_10');

writeln('ESC Exit');

procedure main;

var

ch : char;

begin

repeat

menu;

repeat

ch : = readkey; if ch = #0 then

ch := readkey;

until ch in [#27, #59, #68];

swapvectors;

case ord (ch) of

1 : exec('GRAF_0l.EXE','');

2 : exec('GRAF_02.EXE','');

3 : exec('GRAF_03.EXE','');

exec('GRAF_04.EXE','');

5 : exec('GRAF_05.EXE','');

: exec('GRAF 06.EXE', '');

: exec('GRAF_07.EXE', ');
8 : exec('GRAF_08.EXE','');
9 : exec
('GRAF_09.EXE', '');
10:exec('GRAF_10.EXE', '');

end;

swapvectors;

if doserror <> 0 then

begin

writeln ('ERROR'); halt;

end;

until ch = #27; clearscr;

end;

begin

main; end.




Document Info


Accesari: 1645
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2025 )