#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_ttf.h>
#include <iostream>
#include "Structure.h"

void fractale (SDL_Surface *fenetre, SDL_Surface *pixel, SDL_Surface *localisation, double x, double y, double zoom, int N);

int main (int argc, char** argv)
{
    int continuer = 0, N = 1000; // Continuer est la variable pour la boucle infini, N //////
    double zoom = 1, x=0, y=0; // Les coordonées de bases et le zoom sont initalisé
    SDL_Event event; //On initialse les evenements de la SDL
    SDL_Surface *fenetre, *pixel, *localisation;
    /* 3 surfaces SDL sont crées, la première est la fenetre en elle meme, la deuxieme corresepond au pixel colorié
    et la dernière la croix pour la position*/


    SDL_Init(SDL_INIT_VIDEO);
    SDL_WM_SetCaption("Generateur de Fractele (Mandelbrot)", 0); //On donne un nom a la fenetre

    fenetre = SDL_SetVideoMode(640,640,32, SDL_HWSURFACE|SDL_DOUBLEBUF); //On defini la taille de la fenetre (650*640)
    pixel = SDL_CreateRGBSurface(SDL_HWSURFACE, 1,1,32,0,0,0,0);

    fractale(fenetre, pixel, localisation, x,y, zoom, N);

    while (!continuer)
    {
        SDL_WaitEvent(&event);
        switch (event.type)
        {
            case SDL_QUIT:
                continuer =1;
                break;
            case SDL_KEYDOWN:
                {
                    switch (event.key.keysym.sym)
                    {
                    case SDLK_ESCAPE:
                        continuer =1;
                        break;
                    case SDLK_m:
                        fractale(fenetre, pixel, localisation,x,y,zoom,N+=30);
                        break;
                    case SDLK_PAGEUP:
                        fractale(fenetre, pixel, localisation,x,y,zoom+=zoom/2,N);
                        break;
                    case SDLK_PAGEDOWN:
                        fractale(fenetre,pixel,localisation,x,y,zoom-=zoom/3,N);
                        break;
                    case SDLK_RIGHT:
                        fractale(fenetre, pixel, localisation, x+=0.4/zoom, y, zoom, N);
                        break;
                    case SDLK_LEFT:
                        fractale(fenetre, pixel, localisation, x-=0.4/zoom, y, zoom, N);
                        break;
                    case SDLK_UP:
                        fractale(fenetre, pixel, localisation, x, y-=0.4/zoom, zoom, N);
                        break;
                    case SDLK_DOWN:
                        fractale(fenetre, pixel, localisation, x, y+=0.4/zoom, zoom, N);
                        break;
                    default:
                        break;


                    }
                }


        }


    }
    return 0;
}



void fractale(SDL_Surface *fenetre, SDL_Surface *pixel, SDL_Surface *localisation,double x,double y,double zoom, int N)
{
    int n;
    complexe Z;
    double ModuleZ, a ,b, temp;
    SDL_Rect position;

    for (int i=-fenetre->w/2; i<fenetre->w/2; i++)
    {
        position.x= i+fenetre->w/2;
        a=4*i/((double)fenetre->w*zoom)+x;

        for (int j=-fenetre->h/2; j<fenetre->h/2; j++)
        {
            n= Z.imaginaire = Z.reel = 0;
            position.y =j+fenetre->h/2;
            b=4*j/((double) fenetre->h*zoom)+y;

            if ((-5<i && i<5 && j==0 ) || (-5<j && j<5 && i==0))
                SDL_FillRect(pixel, NULL, SDL_MapRGB(pixel->format,255, 255, 255 ));
            else
            {
                do
                {
                    n++;
                    temp = Z.reel;
                    Z.reel = Z.reel*Z.reel-Z.imaginaire*Z.imaginaire+a;
                    Z.reel=2*temp*Z.reel+b;
                    ModuleZ = Z.imaginaire*Z.imaginaire+Z.reel*Z.reel;

                }while (n<N && ModuleZ<=4);

                if ( n=N)
                    SDL_FillRect(pixel,NULL,SDL_MapRGB(pixel->format, 0,0,0));
                else
                    SDL_FillRect(pixel,NULL, SDL_MapRGB(pixel->format, 64*n/N, 255*n/N,0));
            }
            SDL_BlitSurface(pixel,NULL,fenetre, &position);
        }
    }
    position.x=10;
    position.y=10;
    SDL_Flip(fenetre);
    return ;

}
