Näiteprogramm GRADEMO

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() */