#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include <sys/types.h>
#include <time.h>
#include "paulslib.h"
#include "bitmaplib.h"

#define NX 1000
#define NY 1000
#define N 1000000
#define SCALE (NX / 5.0)
#define PHI ((1.0 + sqrt(5.0)) / 2.0)

int main(int argc,char **argv)
{
   int n;
   XY u,p0 = {0.0,0.0},p1 = {0.0,0.0},p2 = {0.0,0.0},p = {0.0,0.0};
   double r,r0,ru;
   BITMAP *image,white={65535,65535,65535},black={0,0,0},bitmap;
   COLOUR colour;
   FILE *fptr;

   /* Create the image */
   image = CreateBitmap(NX,NY);
   EraseBitmap(image,NX,NY,white);
   srand(time(NULL));

   for (n=0;n<N;n++) {
      r = ((n % 5) > 0 ? -sqrt(5.0) : sqrt(5.0));
      p2 = p1;
      switch (rand() % 5) {
      case 0:
         p1.x = p.x / r - PHI;
         p1.y = p.y / r;
         break;
      case 1:
         p1.x = - p.x / r - PHI;
         p1.y = - p.y / r;
         break;
      case 2:
         p1.x = - p.x / r - PHI + 1;
         p1.y = - p.y / r;
         break;
      case 3:
         p1.x = p.y / r;
         p1.y = p.x / r + 1;
         break;
      case 4:
         p1.x = - p.y / r;
         p1.y = - p.x / r - 1;
         break;
      }
      p0  = p;
      p   = p1;
      r   = sqrt(p.x*p.x + p.y*p.y);
      r0  = sqrt(p0.x*p0.x + p0.y*p0.y);
      u.x = (p.x - 2 * p0.x + p2.x) / pow(r - r0,2.0);
      u.y = (p.y - 2 * p0.y + p2.y) / pow(r - r0,2.0);
      ru  = sqrt(pow(u.x - p.x,2.0) + pow(u.y - p.y,2.0));
      if (n < 100)
         continue;
      colour = GetColour(r*ru,0,10.0,2);
      bitmap.r = colour.r * 255;
      bitmap.g = colour.g * 255;
      bitmap.b = colour.b * 255;
      DrawPixel(image,NX,NY,
         (int)(p.x * SCALE + NX / 2 + NX / 7),
         (int)(p.y * SCALE + NY / 2),bitmap);
      if (n % (N/100) == 0)
         fprintf(stderr,".");
   }
   fprintf(stderr,"\n");

   /* Write the image to a ppm file */
   if ((fptr = fopen("roger2.ppm","w")) == NULL) {
      fprintf(stderr,"Unable to open bitmap file\n");
      exit(0);
   }
   WriteBitmap(fptr,image,NX,NY,2);
   fclose(fptr);
   DestroyBitmap(image);
}

#include "bitmaplib.c"
#include "paulslib.c"

