Järgmine näiteprogramm demonstreerib paljude enamlevinud graafikafunktsioonide kasutamist ning kahte mainitud animatsioonimeetodit: rasterpildiga ja kahe ekraanilehekülje abil.
GRADEMO.C
/*********************************************************/
/*** ***/
/*** GRADEMO.C ***/
/*** ***/
/*** Näiteprogramm GRADEMO.EXE näitab Borland C/C++ ***/
/*** graafiliste funktsioonide kasutamist. ***/
/*********************************************************/
/*----------------< Päisefailid >------------------------*/
#include <graphics.h>
#include <conio.h> /* kbhit() */
#include <stdio.h> /* printf() */
#include <stdlib.h> /* exit(), rand(), randomize() */
#include <string.h> /* strcpy() */
#include <math.h> /* sin(), cos() */
#include <time.h> /* time() -> funktsiooni
randmize() jaoks */
#include <alloc.h> /* farfree() */
/*----------------< Globaalsed muutujad >----------------*/
int gmode, gdriver = DETECT, errcode;
/* määrake siin oma vastav kataloog */
char gpath[] = "D:\\BORLANDC\\BGI";
/*----------------< Funktsioonide prototüübid >----------*/
void PutText(char *);
void JoonDemo( void );
void KaarDemo( void );
void AnimDemo1( void );
void AnimDemo2( void );
/*=======================================================*/
/*=== ===*/
/*=== main() ===*/
/*=== ===*/
/*=== Initsialiseerib graafikakaardi ja kutsub ===*/
/*=== üksteise järel välja eri teste täitvad ===*/
/*=== funktsioonid. ===*/
/*=======================================================*/
int main( void )
{
/* määra graafiline rezhiim */
initgraph(&gdriver, &gmode, gpath);
/* kontrollime, kas ei tekkinud viga */
errcode = graphresult();
/* kui tekkis viga, siis ... */
if (errcode != grOk)
{
printf("Graaafika viga: %s\n", grapherrormsg(errcode));
printf("Vajutage suvalisele klahvile!");
getch();
exit(1);
}
settextstyle(TRIPLEX_FONT, HORIZ_DIR, 1);
/* näitefunktsioonid */
JoonDemo();
KaarDemo();
AnimDemo1();
AnimDemo2();
/* taastame tekstirezhiimi */
closegraph();
return 0;
} /* main() */
/*-------------------------------------------------------*/
/*--- ---*/
/*--- PutText() ---*/
/*--- ---*/
/*--- Esitab ekraanile kaks teksti, millest esimene ---*/
/*--- näitab testi nime ja teine soovitab vajutada ---*/
/*--- suvalisele klahvile. ---*/
/*-------------------------------------------------------*/
void PutText(char *pName)
{
int i;
char szMessage1[30];
char szMessage2[] = "Vajutage suvalisele klahvile!";
sprintf(szMessage1, "Funktsiooni %s näide", pName);
i = getmaxx() / 2 - textwidth(szMessage1) / 2;
outtextxy(i, getmaxy() / 2, szMessage1);
outtextxy(20, getmaxy() - 30, szMessage2;
getch();
} /* PutText() */
/*-------------------------------------------------------*/
/*--- ---*/
/*--- JoonDemo() ---*/
/*--- ---*/
/*--- Näitab funktsioonide line(), lineto(), ---*/
/*--- linerel() ja moveto() kasutamist. ---*/
/*-------------------------------------------------------*/
void JoonDemo( void )
{
int x, y, i, k;
clearviewport();
/* joonistab ekraanile ruudustiku */
for(x = 20; x < getmaxx(); x += 20)
line(x, 0, x, getmaxy());
for(y = 20; y < getmaxy(); y += 20)
line(0, y, getmaxx(), y);
PutText("line()");
/* joonistab ekraanile hulga kolmnurki */
clearviewport();
x = getmaxx() / 2;
y = getmaxy() / 2;
i = min(x / 20, y / 20);
for(k = 1; k < i; k++) {
moveto(x - k * 20, y - k * 20);
lineto(x + k * 20, y - k * 20);
lineto(x, y + k * 20);
lineto(x - k * 20, y - k * 20);
}
PutText("lineto()");
/* joonistab ekraanile spiraali */
clearviewport();
i = min(y / 10, x / 10);
moveto(x, y);
for(k = 1; k < i; k += 2) {
linerel(-k * 20, 0);
linerel(0, -k * 20);
linerel(k * 20 + 20, 0);
linerel(0, k * 20 + 20);
}
PutText("linerel()");
} /* JoonDemo() */
/*-------------------------------------------------------*/
/*--- ---*/
/*--- KaarDemo() ---*/
/*--- ---*/
/*--- Näitab mitmesuguste koverjoonte joonistamist. ---*/
/*--- Graafilised funktsioonid kasutavad nurkade ---*/
/*--- määramisel kraade, kuid matemaatilised ---*/
/*--- funktsioonid radiaane. ---*/
/*-------------------------------------------------------*/
void KaarDemo( void )
{
int x, y, r, i, j;
int protsendid[4] = { 10, 50, 25, 15 };
char nimed[4][10] = { "Jaanus", "Toomas", "Peeter", "Sven" };
/* joonistab hulga kontsentrilisi ringe */
clearviewport();
x = getmaxx() / 2;
y = getmaxy() / 2;
i = min(x / 20, y / 20);
for(j = 1; j <= i; j++)
circle(x, y, j * 20);
PutText("circle()");
/* joonistab kaheksa kaart, mis suunduvad ekraani */
/* keskpunktist ääre poole */
clearviewport();
i = min(x , y) / 2;
for(j = 0; j < 8; j++)
arc(x - i * sin((double)j * 45.0 * M_PI / 180.0),
y - i * cos((double)j * 45.0 * M_PI / 180.0),
-45 + j * 45, 45 + j * 45, i);
PutText("arc()");
/* joonistab sektordiagrammi */
clearviewport();
for(j = i = 0; j < 4; j++) {
setfillstyle(LTSLASH_FILL + j, getmaxcolor() - j );
pieslice(x, y, i, i + (int)((double)
protsendid[j] * 3.6), min(x, y) / 2);
fillellipse(50, 100 + j * 20, 20, 10);
outtextxy(100, 90 + j * 20, nimed[j]);
i += (int)((double)protsendid[j] * 3.6);
}
PutText("pieslice()");
} /* KaarDemo() */
/*-------------------------------------------------------*/
/*--- ---*/
/*--- AnimDemo1() ---*/
/*--- ---*/
/*--- Näitab animatsiooni programmeerimist raster- ---*/
/*--- piltide ja funktsiooni getimage() ning ---*/
/*--- putimage() abil. ---*/
/*-------------------------------------------------------*/
void AnimDemo1( void )
{
void far *pBitmap1, *pBitmap2;
unsigned x, y, size;
clearviewport();
/* joonistame tillukese UFO, mida hakkame hiljem liigutama */
setfillstyle(SOLID_FILL, EGA_LIGHTGRAY);
fillellipse(100, 100, 50, 20);
fillellipse(100, 80, 30, 10);
setfillstyle(SOLID_FILL, EGA_RED);
fillellipse(70, 100, 5, 5);
fillellipse(100, 110, 5, 5);
fillellipse(130, 100, 5, 5);
setlinestyle(SOLID_LINE, 0, THICK_WIDTH);
setcolor(EGA_LIGHTBLUE);
line(80, 70, 70, 50);
line(120, 70, 130, 50);
setcolor(EGA_WHITE);
setlinestyle(SOLID_LINE, 0, NORM_WIDTH);
size = imagesize(50, 50, 150, 120);
/* reserveerime mälu selle pildikese ja teise samasuure */
/* pildikese jaoks, kuhu salvestame selle koha endise sisu */
if(NULL == (pBitmap1 = malloc(size))) {
outtextxy(100, 100, "Ei suuda reserveerida küllaldaselt mälu!");
getch();
exit(1);
}
if(NULL == (pBitmap2 = malloc(size))) {
outtextxy(100, 100, "Ei suuda reserveerida küllaldaselt mälu!");
getch();
exit(1);
}
/* salvestame UFO esimesse puhvrisse */
getimage(50, 50, 150, 120, pBitmap1);
/* nüüd on koik valmis. Puhastame ekraani ja ... */
clearviewport();
/* enne teatame veel kasutajale,
kuidas funktsiooni tööd lopetada */
outtextxy(20, getmaxy() - 30, "Vajutage suvalisele klahvile!");
/* initsialiseerime juhuarvude generaatori */
randomize();
/* niikaua, kui ei ole vajutatud ühelegi klahvile */
while(!kbhit()) {
/* hangime kaks juhuarvu, millele vastav punkt asub ekraanil */
x = random(getmaxx() - 100);
y = random(getmaxy() - 70);
/* salvestame tagapohja */
getimage(x, y, x + 100, y + 70, pBitmap2);
/* esitame UFO ekraanile */
putimage(x, y, pBitmap1, COPY_PUT);
/* väljastame selle koha endise sisu uuesti ekraanile */
putimage(x, y, pBitmap2, COPY_PUT);
}
/* vabastame reserveeritud mälublokid */
farfree(pBitmap1);
farfree(pBitmap2);
} /* AnimDemo1() */
/*-------------------------------------------------------*/
/*--- ---*/
/*--- AnimDemo2() ---*/
/*--- ---*/
/*--- See funktsioon näitab animatsiooni program- ---*/
/*--- meerimist kahe ekraanilehekülje abil. ---*/
/*-------------------------------------------------------*/
void AnimDemo2( void )
{
int page, x, y;
setgraphmode(VGAMED);
if(graphresult() != grOk) {
printf("Ei suuda määrata vajalikku graafikarezhiimi!");
getch();
exit(1);
}
page = 0;
randomize();
while(!kbhit()) {
if(page) {
setactivepage(0);
setvisualpage(1);
}
else {
setactivepage(1);
setvisualpage(0);
}
page = !page;
clearviewport();
x = random(getmaxx() - 100);
y = random(getmaxy() - 70);
/* nüüd ei pea me enam neid pildikesi mälupuhvritesse */
/* salvestama, kuid selle asemel tuleb nad iga kord uuesti */
/* ekraanile joonistada. Tänu kahe puhvri kasutamisele */
/* ei märka aga kasutaja seda, kuidas üksikuid graafilisi */
/* kujundeid ekraanile joonistatakse */
settextstyle(TRIPLEX_FONT, HORIZ_DIR, 1);
outtextxy(20, getmaxy() - 30, "Vajutage suvalisele klahvile!");
setfillstyle(SOLID_FILL, EGA_LIGHTGRAY);
fillellipse(x + 50, y + 50, 50, 20);
fillellipse(x + 50, y + 30, 30, 10);
setfillstyle(SOLID_FILL, EGA_RED);
fillellipse(x + 20, y + 50, 5, 5);
fillellipse(x + 50, y + 60, 5, 5);
fillellipse(x + 80, y + 50, 5, 5);
setlinestyle(SOLID_LINE, 0, THICK_WIDTH);
setcolor(EGA_LIGHTBLUE);
line(x + 30, y + 20, x + 20, y);
line(x + 70, y + 20, x + 80, y);
setcolor(EGA_WHITE);
setlinestyle(SOLID_LINE, 0, NORM_WIDTH);
}
} /* AnimDemo2() */