|
|
səhifə | 29/55 | tarix | 07.05.2018 | ölçüsü | 4,6 Mb. | | #50260 |
| c=300+n*10;
d=250+n*10;
e=50+n;
f=1;
bar3d(a,b,c,d,e,f);
bar3d(d,c,b,a,e,f);
sleep(1);
cleardevice();
}}
FUNCTIA clearviewport()
-functia sterge desenul de pe ecran si deplaseaza cursorul la pozitia 0,0
SINTAXA GENERALA este:
void far clearviewport(void);
Functia sterge desenul de pe ecran (viewport) si apoi returneaza pozitia
cursorului la pozitia 0,0 (relativ la modul ecran in care a revenit).
Se deosebeste de cleardevice() care umple ecranul in culoarea de fond.
Functia nu returneaza nici o valoare.
EXEMPLU: (vezi closegraph())
FUNCTIA closegraph()
-sterge modul grafic al ecranului si revine la modul de afisare anterior
SINTAXA GENERALA este: void far closegraph(void);
Functia dealoca memoria alocata pentru modul grafic al ecranului si apoi
reinstaleaza modul ecran existent inainte de initializarea cu initgraph().
Pentru dealocarea memoriei apeleaza _graphfreemem().
Functia nu returneaza nici o valoare.
Se utilizeaza pentru a jongla intre modul text si modul grafic de afisaj.
-206- [ graphics.h - detectgraph() ]
EXEMPLU: #include
#include
#include
int *drv,*mod;
int a=40,b=50,c=60,d=70,e=20,f=10;
main()
{
printf("EXEMPLU DE GRAFIC 3D: \n\n";
sleep(3);
drv=DETECT;
initgraph(drv,mod,"");
bar3d(a,b,c,d,e,f);
sleep(3);
clearviewport();
printf("Text in modul grafic al ecranului: \n\n");
sleep(3);
closegraph();
printf(" Revenire la modul text al ecranului: \n\n");
sleep(3);
}
FRUNCTIA detectgraph()
-detecteaza adaptorul grafic si alege modul grafic optim
SINTAXA GENERALA este:
void far detectgraph(int far *graphdriver,int far *graphmode);
Functia detecteaza adaptorul grafic instalat (placa video) si alege
modul grafic care asigura rezolutia cea mai mare pentru adaptorul iden-
tificat(modul grafic cu numarul maxim de pixeli suportat de adaptor).
Daca nu este detectat nici un adaptor grafic,*graphdriver este setat la
grNotDetected(-2).
Variabila graphdriver contine un numar intreg care specifica tipul de
adaptor grafic dupa cum urmeaza: 0 (DETECT) 1 GCA 2 MCGA 3 EGA 4 EGA64
5 EGAMONO 6 IBM8514 7 HERCMONO 8 ATT400 VGA 9 PC3270 10 preluata din
constanta graphics_drivers definita in graphics.h sau setata de catre
utilizator.
Variabila graphmode contine tot un numar intreg care specifica modul
grafic actual si este preluat din constanta graphics_mode sau poate fi
setat de catre utilizator dupa cum urmeaza: CGA (0-4) MCGA(0-5) EGA(0-1)
EGA64(0-1) EGAMONO (3) HERC (0) ATT400(0-5) VGA(0-2) PC3270(0) IBM8514(0)
(vezi si constanta graphics.mode)
Functia se utilizeaza mai ales atunci cand utilizatorul doreste sa spe-
cifice expres un anumit mod grafic,diferit de cel detectat si setat auto-
mat.Nu se recomanda sa alegeti modul grafic la intamplare.Daca nu stiti
exact ce doriti sa faceti,utilizati optiunea DETECT.
Functia nu returneaza nici un fel de eroare.
Modurile grafice diferite oscileaza intre una si doua pagini cu dimensiuni
cuprinse intre 320/200 si 1024/768 pixeli si respectiv o paleta de culori
cuprinsa intre 2(monocrom) si 265 de culori (IBM8514LO).
Functia alege automat modul grafic cu rezolutia cea mai mare care este
compatibila cu adaptorul grafic si nu se recomanda schimbarea setarilor
automate decat daca rulati un program care necesita o alta rezolutie.
-207- [ graphics.h - drawpoly() ]
EXEMPLU: #include
#include
#include
int far *drv,*mod;
char far *nume,*modecran;
int a,b,c,d;
main()
{
drv=DETECT;
detectgraph(drv,mod);
initgraph(drv,mod,"");
nume=getdrivername();
modecran=getmodename(0);
printf(" programul grafic instalat este: %d \n",drv);
printf(" adica:%s\n\n",nume);
printf(" modul grafic este: %d \n",mod);
printf(" adica: %s \n\n",modecran);
for (a=100;a<120;a++)
{ b=a+20;
c=2*a;
d=150-a;
circle(b,c,d);
sleep(1);
}}
FUNCTIA drawpoly()
-deseneaza un poligon
SINTAXA GENERALA este:
void far drawpoly(int numpoints,int far *polypoints);
Functia deseneaza un poligon cu numarul de puncte specificat prin num-
points si respectiv cu coordonatele fiecarui punct arhivate in aria de
date spre care pointeaza pointerul *polypoints.Aria de date trebuie sa
contina un numar dublu de variabile fata de numarul de puncte specificate
prin numpoints,fiecare dintre ele continand un numar de tip int (pentru
fiecare coordonata x si y a fiecarui punct trebuie sa existe in aria de
date un numar de tip int).Fiecare pereche succesiva de numere din aria
polypoints va forma coordonatele unui punct al poligonului.Atunci cand
doriti ca poligonul sa formeze o figura inchisa (un poliedru) trebuie ca
sa va asigurati ca fiecare coordonata a ultimului punct definit este
identica cu cea a primului punct definit.
Functia nu returneaza nici o valoare.
Poligonul va fi desenat in culoarea si/sau cu stilul penitei.Daca doriti
sa formati o figura geometrica inchisa si sa umpleti cu culoare spatiul
interior,puteti sa utilizati functia fillpoly().
Daca generati polinoame aleatorii trebuie sa definiti punctele din
aria de date (polypoints) astfel incat numarul coordonatelor sa fie dublu
decat cel al punctelor solicitate si respectiv doua puncte diferite sa
nu fie definite cu aceleasi coordonate (cu exceptia primului si a ulti-
mului).Eventual se pot utiliza formule aleatorii pentru fiecare punct de
coordonata sau se pot realiza algoritmi elementari care realizeaza grafica
animata,desene animate,etc...
-208- [ graphics.h - ellipse() ]
EXEMPLU: #include
#include
int *drv,*mod,a,b[25],x;
main()
{
drv=DETECT;
initgraph(drv,mod,"");
for (a=0;a<5;a++)
{ b[a]=a+10*a;
b[2*a]=a+20*a;
b[3*a]=200-5*a;
b[4*a]=300-7*a;
b[5*a]=400-10*a;
}
for(x=1;x<11;x++)
{ setcolor(x);
cleardevice();
slellp(1);
drawpoly(x,b);
sleep(2);
}
}
In exemplul de mai sus,punctele de coordonate din aria de date b[25] sunt
generate prin functii.Pentru a intelege cat mai bine modul de reprezentare
al fiecarui punct,definiti punctlele de coordonate punct cu punct.Apoi
incercati sa definiti si sa afisati unul sau mai multe poliedre.
FUNCTIA ellipse()
-deseneaza un arc de elipsa sau o elipsa intreaga
SINTAXA GENERALA este:
void far ellipse(int x,int y,int stangle,int endangle,int xrad,int yrad);
unde: x si y sunt coordonatele centrului,stangle si endangle sunt arcul
de pornire si respectiv cel de terminare al desenului(exprimate in grade)
iar xrad si y rad sunt axa orizontala si respectiv axa verticala a elipsei.
Functia deseneaza un arc de elipsa incapand din punctul stangle si termi-
nand cu punctul endangle.Daca stangle este zero iar endangle este 360,se
va desena o elipsa intreaga.Graficul rezultat este desenat in sens invers
fata de sensul de rotatie al acelor de ceasornic iar punctul zero este
considerat la ora 3,punctul de 90 de grade este la ora 12...etc.
Desenul nu este influentat de stilul penitei ci doar de grosimea sa.
Functia nu returneaza nici o valoare.
Pentru a calcula punctele de focar se va utiliza teorema lui Pitagora.
Elipsa va fi desenata in culoarea si stilul penitei.Pentru a desena
elipse cu imaginea interioara umpluta in culoarea de scriere se poate
utiliza functia fillellipse().
Cand utilizati imagini grafice care combina mai multe elipse,trebuie sa
calculati coordonatele fiecarui punct,pentru a evita suprapunerile(spre
deosebire de functia arc() care poate apela functia getarccoord() pentru
a calcula automat coordonatele punctului final al graficului).
Functia se poate utiliza pentru a desena orbita corpurilor cersti etc...
-209- [graphics.h -fillellipse() ]
EXEMPLU: #include
#include
#int a,b,c,d,e,f,x;
int *drv,*mod;
main()
{
drv=DETECT;
initgraph(drv,mod,"");
for (x=1;x<30;x++)
{ a=200+x*5;
b=200+x*5;
c=x*15;
d=x*30;
e=100;
f=150;
ellipse(a,b,c,d,e,f);
sleep(1);
}
}
FUNCTIA fillellipse()
-deseneaza o elipsa si o umple cu culoarea penitei
SINTAXA GENERALA este:
void far fillellipse(intx,int y,int xradius,int yradius);
Functia deseneaza o elipsa cu centrul in punctul cu coordonatele x si y
si cu axa orizontala de raza xradius iar cu axa verticala de raza yradius
si apoi umple spatiul interior in culoarea penitei.
Functia nu returneaza nici o valoare.
EXEMPLU: #include
#include
#include
int a,b,c,d,x;
int *drv,*mod;
main()
{
randomize();
drv=DETECT;
initgraph(drv,mod,"");
for (x=1;x<16;x++)
{ a=random(300)+100;
b=random(300)+100;
c=random(200);
d=random(200);
setcolor(x);
setbkcolor(x-1);
fillellipse(a,b,c,d);
sleep(1);
}}
Functia se poate utiliza pentru grafice,desene animate etc. si poate fi
generata cu usurinta in rutine automate.Se utilizeaza mai mult pentru a
exemplifica si cuantifica decat pentru a desena traictorii sau orbite.
-210- [ graphics.h -fillpoly-floodfill() ]
FUNCTIA fillpoly()
-deseneaza un poligon si umple spatiul interior in culoarea penitei
SINTAXA GENERALA este:
void far fillpoly(int numpoints,int far *polypoints);
Functia este similara cu drawpoly() dar umple spatiul interior in culaorea
si stilul penitei.Regulile de definire a punctelor si coordonatelor sunt
similare (vezi drawpoly()).Nu returneaza nici o valoare.
EXEMPLU: #include
#include
int a,b[16];
int *drv,*mod;
main()
{
drv=DETECT;
initgraph(drv,mod,"");
a=6;
b[0]=75,b[1]=100;
b[2]=210,b[3]=180;
b[4]=80,b[5]=200;
b[6]=80,b[7]=350;
b[8]=470,b[9]=270;
b[10]=250,b[11]=75;
b[12]=100;
fillpoly{a,b);
sleep(7); }
Incercati sa desenati si sa deplasati un poligon cu 5 laturi.
FUNCTIA floodfill()
-umple cu culoare spatiul centrat de punctul x,y si delimitat prin border
SINTAXA GENERALA este: void far floodfill(int x,int y,int border);
Functia umple in culoarea si cu stilul penitei spatiul centrat de punctul
desemnat prin x si y (pixelul cu coordonatele respective) si delimitat
prin linii de tipul celei specificate prin border(in culoarea respectiva).
Daca punctul x,y este in interiorul unei arii inchise,se va colora tot
interiorul ariei respective,iar daca punctul x,y este in afara ariei
delimitate prin border atunci se va colora tot exteriorul ariei respective
Se va prefera functia fillpoly() ori de cate ori este posibil pentru a
asigura compatibilitatea cu versiunile viitoare de program si pentru a
desemna mai sigur poligoanele ce urmeaza sa fie colorate.Functia nu poate
fi apelata de catre driverul IBM-8514.In caz de eroare returneaza codul -7.
EXEMPLU: #include
#include
int a=250,b=200,c=75,*drv,*mod;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
circle(a,b,c);
floodfill(a,b,15);
sleep(3);
floodfill(5,5,15);
sleep(3); }
-211- [ graphics.h-arc() si getarccoords()]
FUNCTIA arc()
-deseneaza un arc de cerc
SINTAXA GENERALA este:
void far arc(int x,int y,int stangle,int endangle,int radius);
unde: x si y sunt coordonatele centrului cercului,stangle este unghiul de
la care incepe arcul de cerc iar endangle este unghiul la care se termina
si radius este raza cercului.Daca stangle este zero si endangle este 360
functia va desena un cerc complet.Desenul este derulat in sens invers
acelor de ceasornic cu unghiul de 0 grade situat la ora 3,90 grade la ora
12 etc.Desenul rezultat este influentat de rezolutia ecranului si de
dimensiunile fiecarui pixel (in functie de modul grafic si de placa grafi-
ca utilizata).Este posibil ca desenul rezultat sa nu reprezinte un cerc
sau un arc de cerc perfect(in cazul pixelilor dreptunghiulari).In modul
VGA,pixelii sunt patrati iar imaginea rezultata este realista.
Functia nu returneaza nici o valoare.
EXEMPLU: #include
#include
int *drv,*mod;
int a=100,b=250,c=10,d=270,e=50;
main()
{
drv=DETECT;
initgraph(drv,mod,"");
arc(a,b,c,d,e);
sleep(5);
}
FUNCTIA getarccoords()
-citeste coordonatele unui arc de cerc
SINTAXA GENERALA este:
void far getarccoords(struct arccoordstype far *arccoords);
Functia citeste coordonatele grafice pentru ultimul arc de cerc desenat
si le salveaza intr-o structura special definita in graphics.h de tipul
arccoordstype cu forma generala:
struct arccoordstype {
int x,y;
int xstart,ystart,xend,yend;
}
unde x si y sunt coordonatele centrului iar xstart,ystart,xend si yend
sunt coordonatele punctelor de inceput si de terminare a arcului de cerc.
Functia nu returneaza nici o valoare.
Functia este foarte utila atunci cand se realizeaza constructii grafice
mai complicate in care doriti ca o linie sau un poligon sa intersecteza
una dintre extremele unui arc de cerc sau cand doriti sa utilizati unul
dintre extremele arcului de cerc pentru a genera o noua figura geometrica
(de exemplu un lant de arcuri de cerc in care centrul fiecarui arc este
situat in punctul terminal al arcului precedent etc.)
Functia se poate utiliza si pentru o orientare sumara in calculul unor
orbite elementare sau al unor miscari circulare,pentru reprezentarea
grafica a momentelor de forta etc.Functia se poate apela atat pentru
arcurile de tip arc() cat si pentru cele de tip ellipse().
-212- [ graphics.h-getaspectratio() ]
EXEMPLU: #include
#include
int *drv,*mod;
int a=400,b=250,c=10,d=120,e=20,x;
struct arccoordstype info;
main()
{
drv=DETECT;
initgraph(drv,mod,"");
for(x=1;x<15;x++)
{
ellipse(a,b,c,d,e,x);
arc(a,b,c,d,e);
getarccoords(&info);
printf("arcul incepe la: x=%d y=%d \n",info.xstart,info.ystart);
printf(" si se termina la: x=%d y=%d \n",info.xend,info.yend);
a=info.xend,b=info.yend;
c=info.xstart,d=info.ystart;
sleep(3);
}}
Observati cum centrul arcului descris se deplaseaza in punctul terminal
al arcului precedent.
FUNCTIA getaspectratio()
-citeste raportul grafic global
SINTAXA GENERALA este:
void far getaspectratio(int far *xasp,int far *yasp);
unde: xasp si yasp sunt factorii de aspect grafic pentru cele doua coordo-
nate ale ecranului (Ox si Oy).
Factorul *yasp este normalizat la 10000.La toate placile grafice(cu excep-
tia celor de tip VGA) factorul *xasp este mai mic decat 10000 deoarece
fiecare pixel este dreptunghiulat(mai inalt decat lat).La adaptoatele VGA
fiecare pixel este patrat si cei doi factori sunt egali.
Relatia generala dintre cei doi factori de aspect este de tipul:
*yasp=10000
*xasp<=10000
iar aspectul general este determinat de raportul dintre yasp si xasp.
Functia nu returneaza nici o valoare.
EXEMPLU: #include
#include
#include
int *drv,*mod,asx,asy;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
getaspectratio(&asx,&asy);
printf("Raportul grafic/pixel este: %d/%d \n",asx,asy);
printf("Aspectul grafic al unui pixel(marit 100x100) este:\n");
bar(asx/100,asy/100,asx/100+asx/100,asy/100+asy/100);
sleep(5);
}
-213- [graphics.h -getbkcolor(),getcolor()]
FUNCTIA getbkcolor()
-returneaza culoarea de fond a ecranului
SINTAXA GENERALA este: int far getbkcolor(void);
Functia citeste si returneaza culoarea de fond a ecranului sub forma de
cod numeric (0-15) dupa codurile din tipul COLORS definit in graphics.h
( 0= BLACK 1=BLUE 2=GREEN 3=CYAN 4=RED 5=MAGENTA 6=BROWN 7=LIGHTGRAY
8=DARKGRAY 9=LIGHTBLUE 10=LIGHTGREEN 11=LIGHTCYAN 12=LIGHTRED 13=LIGHT-
MAGENTA 14=YELLOW 15=WHITE )
Functia returneaza codul culorii de fond a ecranului.
EXEMPLU: #include
#include
#include
int *drv,*mod;
int n,k;
main()
{
drv=DETECT;
initgraph(drv,mod,"");
for (n=0;n<16;n++)
{
setbkcolor(n);
k=getbkcolor();
printf("Culoarea de fond este: %d \n\n",k);
sleep(1);
}}
FUNCTIA getcolor()
-returneaza culoarea de scriere a penitei
SINTAXA GENERALA este: int far getcolor();
Functia returneaza valoarea la care sunt setati pixelii utilizati pentru
trasarea de linii sau imagini grafice.Valoarea este influentata de modul
grafic utilizat.Valoarea returnata este codul numaric al culorii din
paleta grafica utilizata.
Functia returneaza codul numeric al culorii utilizate pentru desenare.
EXEMPLU: #include
#include
#include
int *drv,*mod;
int n,k;
main()
{ drv=DETECT;
initgraph(drv,mod,"");
for (n=0;n<16;n++)
{ setcolor(n);
circle(300,200,25);
k=getcolor();
printf("Culoarea penitei grafice este: %d \n",k);
sleep(1);
}}
In functie de modul grafic utilizat,si de paleta grafica (0,1,2,3) codul
returnat va cuprinde 4,16 sau 256 de culori(IBM8514).
Dostları ilə paylaş: |
|
|