/* Tracer l'ensemble de Mandelbrot */
#include <stdlib.h>
#include <stdio.h>

#define L 500
#define h 50

int nlignes=240;
int ncolonnes=320;
double Xmin=-1.2;
double Xmax=1.2;
double Ymin=-1.6;
double Ymax=1.6;
//char type[10]="Mandel\0";
int niter=9;
typedef struct {float a, b;} Point;	//Structure representant les coordonnees d'un point
typedef struct {char r; char g; char b;} pixel; //Couleur pixel Red Green Blue
typedef pixel** matrix;             //Structure matrix
typedef struct {                    //Structure representant une image
  int nlig;                         //nombre de lignes
  int ncol;                         //nombre de colonnes
  matrix mat;}                      //matrice
image;
/////////////////////////////////////////////////////
/* Allocation mémoire pour une image i lignes j colonnes */ 

image AllouerImage(int i,int j) {

  int l;               //l compteur de ligne
  image im;            //nouvelle image
 
  im.nlig=i;           //Hauteur
  im.ncol=j;           //Largeur
//la fonction calloc a 2 arguments :
     //i est le nombre d'élement à allouer
     //puis la taille d'un element
  im.mat=(pixel**)calloc(i,sizeof(pixel*));

  for (l=0;l<i;l++) 
    im.mat[l]=(pixel*)calloc(j,sizeof(pixel));

  return im;
}
////////////////////////////////////////////////////
/* L'operation de reecriture dans le fichier ppm a partir d'une matrice */
void EcrireFichier(image img) {

  int i,j,local;
  FILE* fichier;
  
  fichier=fopen("fract_julia8.ppm","w");    //on ouvre le fichier en mode écriture
  fprintf(fichier,"P6\n");   //codage du ppm en P6
  
  fprintf(fichier,"%d %d\n",img.ncol,img.nlig); //taille de l'image
  fprintf(fichier,"255\n");                     //niveau de gris
  

  for (i=0;i<img.nlig;i++) 
    for (j=0;j<img.ncol;j++) {
      fprintf(fichier,"%c%c%c",img.mat[i][j].r,img.mat[i][j].g,img.mat[i][j].b);
      
      
    }
}
/* On part d'une image de depart qu'on extrude en fonction de la variation
   de niveau sur une couleur donne */

image nouv(image depart) {
  image arrivee;
  int i,j,hauteur,local;
  int locallig,localcol;/* localig et localcol sont les coordonnees du
			   point correspondant dans la nouvelle image */
  int parcours;
  
  arrivee=AllouerImage(depart.nlig+h,depart.nlig+depart.ncol); //on alloue la mem
  local=0;
  
  for (i=0;i<depart.nlig;i++) //boucle pour les lignes
    for (j=0;j<depart.ncol;j++) {  //boucle pour les colonnes
      locallig=i+h;    //valeur des ordonnées (h = marge)
      localcol=j+depart.nlig-i; //abcisses
      local++;
      hauteur=(h*(int)(depart.mat[i][j].b))/255;
      
      for (parcours=0;parcours<hauteur;parcours++) {
	arrivee.mat[locallig-parcours][localcol].g=0;
	arrivee.mat[locallig-parcours][localcol].b=255*(h-parcours)/h;
	arrivee.mat[locallig-parcours][localcol].r=(parcours*255)/h;
	
      } 
    }

  return arrivee;
}
/* On fabrique une image de Julia en niveau de gris 
   avec en parametre le nombre d'iterations et la
   position de la fenetre dans le plan complexe */

image Julia(int nlig,int ncol,int niter,double xmin,double xmax,double ymin,double ymax) {
  
  image arrivee;
  double pasx,pasy;
  double x,y,xo,yo;
  double a,b,tmp;
  int i,lig,col;
  
  pasx=(xmax-xmin)/ncol;
  pasy=(ymax-ymin)/nlig;

  arrivee=AllouerImage(nlig,ncol);
  
  printf("Saisissez xo :\n");
  scanf("%lf",&xo);
  printf("%lf\n",xo); 
  
  printf("Saisissez yo :\n");
  scanf("%lf",&yo);
  printf("%lf\n",yo); 

  for (lig=0;lig<nlig;lig++)
    for (col=0;col<ncol;col++) {
      a=xmin+(double)col*pasx;
      b=ymax-(double)lig*pasy;
      
      x=a;
      y=b;
      i=0;
      
      while (i<niter) {
	tmp=x;
	x=x*x-y*y+xo;
	y=2*tmp*y+yo;
	if (x*x+y*y>4) break;
	i++;
      }
      /* creation point correspondant */
     
     

	arrivee.mat[lig][ncol-col].r=((double)i/niter)*255;    //couleur bleu

	  }
	
   

  return arrivee;
}

////////////////////////////////////MAIN////////////////////////////
int main(void) {
  image im1,im2;
  int nlig,ncol,nul=0;
  int i=2;
  
  im1=Julia(nlignes,ncolonnes,niter,Xmin,Xmax,Ymin,Ymax);
  EcrireFichier(im1);
  printf("Image fractale Julia cree !!!!! \n");    /* affiche */
  system("pause");
  return 0;
}