/* Fj�ril f�r VBE.LIB */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <vbe.h>

#define arrsize 22

                   /* 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 minbild[arrsize] = {0,0, 50,0, 50,50,  0,50,  0,0, 30,20,
                     50,0,  60,0, 60,50, 40,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 = 479 - 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));

    }

    vsync();
    vbeDrawPoly(asize/2, oldP, 0L);    /* radera bilden */
    vbeDrawPoly(asize/2, newP, 0xFFFFFFL);     /* 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 = .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;

    posX = 319.0;              /* B�rja animeringen i mitten */
    posY = 239.0;

    vbeInit(0x112, TRUE);

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

    vbeExit();
    return(0);
}