#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#define arrsize 24
/* Polygon-koordinater som liknar en fj�ril */
int bild1[arrsize] = {30,40, 20,50, 0,50, 0,0, 10,0, 30,20,
50,0, 60,0, 60,50, 40,50, 30,40};
/* Fj�rilspolygon med n�got hopvikta vingar */
int bild2[arrsize] = {30,40, 27,50, 15,50, 15,0, 20,0, 30,20,
33,0, 45,0, 45,50, 33,50, 30,40};
int newP[arrsize]; /* Ber�kningsresultat f�r n�sta sk�rmpolygon */
int oldP[arrsize]; /* Koordinaterna f�r polygonen som �r ritad */
static const double twoPi = 6.28318530717958647693;
void redraw(int asize, int *newP, int *oldP, int *orgP,
int posX, int posY, double z, double v)
{
int i;
posY = getmaxy() - posY; /* v�nd sk�rmens y-axel, lokal variabel */
for(i=0; i<asize; i+=2) { /* bearbeta koordinaterna parvis */
/* ny X-koordinat, de ligger p� j�mna array-index */
newP[i] = posX + z * (orgP[i]*cos(v) - orgP[i+1]* sin(v));
/* ny Y-koordinat, de ligger p� udda array-index */
newP[i+1] = posY - z * (orgP[i]*sin(v) + orgP[i+1]*cos(v));
}
setcolor(getbkcolor()); /* v�lj raderande f�rg */
drawpoly(asize/2, oldP); /* radera bilden */
setcolor(getmaxcolor()); /* v�lj synlig f�rg */
drawpoly(asize/2, newP); /* rita bilden p� ny plats */
memcpy(oldP, newP, (asize *2)); /* f�r kommande radering */
}
main()
{
double posX; /* figurens position p� sk�rmen */
double posY; /* figurens position p� sk�rmen */
double dx = 4, dy = 4; /* Stegl�ngden i h�jd resp sidled */
double z = 0.5; /* best�mmer bildens storlek */
double dz = 0.02; /* Stegl�ngden i zooming */
double v = 0; /* Vridningsvinkeln */
double dv = twoPi / 100; /* dv �r ett hundadels varv */
int i;
/**********************************************************/
/* h�r f�ljer grafiken p� Borland-vis */
int gdriver = DETECT, gmode, errcode;
initgraph(&gdriver, &gmode, "\\bc\\bgi");
errcode = graphresult();
if(errcode != grOk) {
printf(" %s\n", grapherrormsg(errcode));
exit(1);
}
posX = getmaxx() / 2; /* B�rja animeringen i mitten */
posY = getmaxy() / 2;
/***********************************************************/
/* h�r f�ljer "styrprogrammet" f�r animeringen */
while(!kbhit()) {
for(i=0; i<25; i++)
redraw(arrsize, newP, oldP, bild1,
posX-=dx, posY+=dy, z+=dz, v+=dv);
for(i=0; i<25; i++);
redraw(arrsize, newP, oldP, bild2,
posX-=dx, posY-=dy, z+=dz, v+=dv);
if(kbhit()) break; /* dags att sluta ? */
for(i=0; i<25; i++);
redraw(arrsize, newP, oldP, bild1,
posX+=dx, posY-=dy, z-=dz, v+=dv);
for(i=0; i<25; i++);
redraw(arrsize, newP, oldP, bild2,
posX-=dx, posY+=dy, z-=dz, v+=dv);
}
closegraph(); /* st�ng grafiken � la Borland */
return(0);
}