#include<stdio.h>
#include<assert.h>
#include<stdlib.h>

#define OUTPUT_BINARY 1
#define OUTPUT_TEXT 2

typedef struct complex{
  double real;
  double imag;
} Complex;

int cal_pixel(Complex c){
  int count, max_iter;
  Complex z;
  double temp, lengthsq;
  
  max_iter = 256;
  z.real = 0;
  z.imag = 0;
  count = 0;

  do{
    temp = z.real * z.real - z.imag * z.imag + c.real;
    z.imag = 2 * z.real * z.imag + c.imag;
    z.real = temp;
    lengthsq = z.real * z.real + z.imag * z.imag;
    count ++;
  }
  while ((lengthsq < 4.0) && (count < max_iter));
  return(count);
}

#define NX 512
#define NY 512
int main(int argc, char **argv){
  FILE *file;
  int output;
  int i, j;
  Complex c;
  int tmp;
  int data[NX][NY];


  for (i = 0; i < NX; ++i){
    c.real = i/((double) NX) * 4. - 2. ; 
    for (j = 0; j < NY; ++j){
      c.imag = j/((double) NY) * 4. - 2. ; 
      tmp = cal_pixel(c);
      data[i][j] = tmp;
      /*      printf("%f\n", data[i][j]);*/
      /*zmag[i][j] = data[i][j].real * data[i][j].imag;*/
    }
  }

  output = OUTPUT_TEXT;

  if (output == OUTPUT_BINARY){
    file = fopen("mandelbrot.bin", "w");
    fwrite(data, NX*NY, sizeof(int), file);
    fclose(file);
  }

  else if (output == OUTPUT_TEXT){
    int i,j;
    file = fopen("mandelbrot.txt", "w");
    for (i = 0; i < NX; ++i){
      c.real = i/((double) NX) * 4. - 2. ; 
      for (j = 0; j < NY; ++j){
	c.imag = j/((double) NY) * 4. - 2. ; 
	fprintf(file, "%f %f %d\n", c.real, c.imag, data[i][j]);
      }
    }
    fclose(file);
  }
}
