#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);
}