/*!\file drawFractal.c * * \author SOUPLET Antoine * \version 1.0 * \date 09-01-2012 * * \brief Fichier contenant les fonctions lancant les threads de dessin des différentes fractales * */ #include #include #include #include #include "thread.h" #include #include "flame.h" #include "drawFractal.h" #include "drawGeo.h" #include #include "functionSdl.h" #include "lSystem.h" #include "postfix.h" //Lance les threads de dessin de la fractale de Mandelbrot et actualise l'écran void drawFractalM(SDL_Surface *surf_screen, double* pd_zoom,Point *ppoint_pInit, int* pi_nbIter, int* pi_numGradient) { runThreadMandelbrot(100,surf_screen,pd_zoom,ppoint_pInit, pi_nbIter, pi_numGradient);//lance 100 threads de dessin de Mandelbrot SDL_Flip(surf_screen);//actualise l'écran } //Lance les threads de dessin de la fractale de Julia et actualise l'écran void drawFractalJ(SDL_Surface *surf_screen, double *pd_zoom, Point* ppoint_pInit, Point* ppoint_coeffC, int* pi_nbIter, int* pi_numGradient, int *pi_reverse) { if(*pi_reverse) { runThreadJulia(1,surf_screen,pd_zoom,ppoint_pInit,ppoint_coeffC, pi_nbIter, pi_numGradient, pi_reverse);//lance 50 threads de dessin de Julia } else { runThreadJulia(50,surf_screen,pd_zoom,ppoint_pInit,ppoint_coeffC, pi_nbIter, pi_numGradient, pi_reverse);//lance 50 threads de dessin de Julia } SDL_Flip(surf_screen);//actualise l'écran } //Lance les threads de dessin de la fractale de Mandelbrot void runThreadMandelbrot(int i_numberThread, SDL_Surface *surf_screen, double *pd_zoom, Point* ppoint_pInit, int* pi_nbIter, int* pi_numGradient) { int i_w;//entier représentant la largeur de l'écran int i_h;//entier représentant la hauteur de l'écran int i;//variable de boucle int j;//variable de boucle pthread_t pth_threads[i_numberThread];//déclarations des threads Mandelbrot* mand_mandel;//structure Mandelbrot i_w=surf_screen->w; i_h=surf_screen->h; infoWindow("Mandelbrot",surf_screen,pd_zoom,pi_nbIter,"en calcul");//affiche le titre de la fenêtre de dessin de la fractale Mandelbrot avec l'état "en cours" for (i = 1; i <=i_numberThread; i++) {//pour chaque thread on initialise une structure Mandelbrot et on lance le thread de dessin de la fractale Mandelbrot mand_mandel= initMandelbrot(surf_screen, pd_zoom, ppoint_pInit,(i-1)*i_w/i_numberThread,i*i_w/i_numberThread,0,i_h,pi_nbIter,pi_numGradient); pthread_create(&pth_threads[i-1], NULL,threadMandelbrot, (void *) (mand_mandel)); } for (j = 0; j < i_numberThread; j++) {//attends que chaque thread soit terminé avant de continuer le programme pthread_join(pth_threads[j],NULL); } infoWindow("Mandelbrot",surf_screen,pd_zoom,pi_nbIter,"terminé");//affiche le titre de la fenêtre de dessin de la fractale avec l'état "terminé" } //Lance les threads de dessin de la fractale de Julia void runThreadJulia(int i_numberThread, SDL_Surface *surf_screen, double *pd_zoom, Point* ppoint_pInit, Point* ppoint_coeffC, int* pi_nbIter, int* pi_numGradient, int* pi_reverse) { int i_w;//entier représentant la largeur de l'écran int i_h;//entier représentant la hauteur de l'écran int i;//variable de boucle int j;//variable de boucle pthread_t pth_threads[i_numberThread];//déclaration des threads Julia* jul_julia;//structure de Julia i_w=surf_screen->w; i_h=surf_screen->h; infoWindow("Julia",surf_screen,pd_zoom,pi_nbIter,"en calcul");//affiche le titre de la fenêtre de dessin de la fractale Mandelbrot avec l'état "en cours" for (i = 1; i <=i_numberThread; i++) {//pour chaque thread on initialise une structure Mandelbrot et on lance le thread de dessin de la fractale Julia jul_julia= initJulia(surf_screen, pd_zoom, ppoint_pInit,ppoint_coeffC,(i-1)*i_w/i_numberThread,i*i_w/i_numberThread,0,i_h, pi_nbIter, pi_numGradient, pi_reverse); pthread_create(&pth_threads[i-1], NULL,threadJulia, (void *) (jul_julia)); } for (j = 0; j < i_numberThread; j++) {//attends que chaque thread soit terminé avant de continuer le programme pthread_join(pth_threads[j],NULL); } infoWindow("Julia",surf_screen,pd_zoom,pi_nbIter,"terminé");//affiche le titre de la fenêtre de dessin de la fractale avec l'état "terminé" } //Lance un thread de dessin de la fractale Ifs void drawFractalIfs(Ifs *ifs_ifs) { pthread_t pth_thread;//thread dessinant la fractale Ifs pthread_create(&pth_thread, NULL,threadIfs, (void *) (ifs_ifs));//lance le thread de dessin de la fractale Ifs pthread_join(pth_thread,NULL);//attends que le thread de dessin de la fractale Ifs soit terminé pour continuer le programme } //Lance un thread de dessin de la fractale Flamme void drawFractalFlame(Flame *flame_flame){ pthread_t pth_thread;//thread dessinant la fractale Flamme pthread_create(&pth_thread, NULL,threadFlame, (void *) (flame_flame));//lance le thread de dessin de la fractale Flamme pthread_join(pth_thread,NULL);//attends que le thread de dessin de la fractale Flamme soit terminé pour continuer le programme }