/* mandelbrot.c
 * NextMove Software
 * April 2010
 */
#include <stdio.h>

int main() {
  double d0 = 0.0004;
  double xo = -0.7434;
  double yo = 0.1058;
  double delta,x,y;
  int yp,xp;

  printf("P3\n512 512\n256\n");
  delta = d0/512.0;
  y = yo;
  for (yp=0; yp<511; yp++) {
    x = xo;
    for (xp = 0; xp<511; xp++) {
      /* Mandelbrot calculation */
      int count = 1;
      double da = x;
      double db = y;
      int r, g, b;

      while ( 1 ) {
        double apb = da+db;
        double amb = da*db;
        double dab = 2.0*amb;
        double size = apb*apb-dab;
        if (size >= 4.0) {
          break;
        }
        count += 1;
        if (count == 256) {
          count = 0;
          break;
        }
        da = apb*(da-db)+x;
        db = dab+y;
      }

      /* Convert #count to #r,#g,#b */
      if ( count < 32 ) {
        r = 0;
        g = 0;
        b = 4*count;
      } else if ( count < 64 ) {
        int t = count - 32;
        r = 0;
        g = 6*t;
        b = 128-4*t;
      } else if ( count < 96 ) {
        int t = count - 64;
        r = 8*t;
        g = 255;
        b = 2*t;
      } else if ( count < 128 ) {
        int t = count - 96;
        r = 255;
        g = 255-6*t;
        b = 64-2*t;
      } else if ( count < 160 ) {
        int t = count - 128;
        r = 255-6*t;
        g = 64-2*t;
        b = 0;
      } else if ( count < 192 ) {
        int t = count - 160;
        r = 54+6*t;
        g = 0;
        b = 8*t;
      } else if ( count < 224 ) {
        int t = 8*(count - 192);
        r = 255-t;
        g = t;
        b = 255;
      } else {
        r = 8*(count-224);
        g = 255;
        b = 255;
      }
      printf("%d %d %d\n",r,g,b);
      x += delta;
    }
    y -= delta;
  }
  return 0;
}


