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