/* JMS -- 5 juillet 2003 ---------------------------------------------------- Compilation : gcc mandel02B -o mandel02B -lgd Appel : ./mandel02B TAILLE MAXITER SEUIL palette RES XMIN XMAX YMIN YMAX GAIN ----------------------------------------------------------------------------- */ #include <unistd.h> #include <gd.h> #include <stdlib.h> long **IMG; long MAXITER; int TAILLE,SEUIL,RES; double XMIN,XMAX,YMIN,YMAX,GAIN; /* --- polynôme cubique pour « parcourir » l'espace RVB --------------------- */ float PolyCubique (int n, float x) { int i; for (i = 0; i < n ; i++) { x = 16 * x * (x - 0.75) * (x - 0.75); } return x; } /* --- index mandelbrot ----------------------------------------------------- */ long Mandelbrot (double x, double y, int f) { int n, m; long iter = 0; double t, tx = 0, ty = 0; while ( tx * tx + ty * ty < 4 && iter < MAXITER ) { t = tx * tx - ty * ty + x; ty = 2 * tx * ty + y; tx = t; if (f && iter > SEUIL) { n = (tx - XMIN) / (XMAX - XMIN) * TAILLE ; m = (ty - YMIN) / (YMAX - YMIN) * TAILLE; if (tx > XMIN && tx < XMAX && ty > YMIN && ty < YMAX) IMG[n][m]++; } iter++; } return iter; } int Max (int a, int b) { if ( a < b ) return b; return a; } int main (int argc, char *argv[]) { gdImagePtr image; int i,j,rouge,vert,bleu,max; int palette = 0; int densite = 0; long h,k,m; double t,x,y; /* récupération des arguments */ sscanf(argv[1],"%d",&TAILLE); sscanf(argv[2],"%d",&MAXITER); sscanf(argv[3],"%d",&SEUIL); sscanf(argv[4],"%d",&palette); sscanf(argv[5],"%d",&RES); XMIN = atof(argv[6]); XMAX = atof(argv[7]); YMIN = atof(argv[8]); YMAX = atof(argv[9]); GAIN = atof(argv[10]); /* allocation de la mémoire image */ IMG = malloc(TAILLE * sizeof(int *)); for (i=0;i<TAILLE;i++) IMG[i] = malloc(TAILLE * sizeof(int)); for (i=0;i<TAILLE;i++) { for (j=0;j<TAILLE;j++) { IMG[i][j] = 0; } } image = gdImageCreate(TAILLE,TAILLE); switch (palette) { case 0 : for (i = 0; i <= 255 ; i++ ) { t = (double) i / 255; rouge = i; vert = 255 * PolyCubique(1,t); bleu = 255 * PolyCubique(2,t); gdImageColorAllocate(image,rouge,vert,bleu); } break; default : for(i=0;i<=255;i++) gdImageColorAllocate(image,i,i,i); break; } m = TAILLE * RES ; for ( k = 0 ; k < m ; k++) { for (h = 0 ; h < m ; h++) { x = - 2.0 + 3.0 * k / m; y = - 1.5 + 3.0 * h / m; if (Mandelbrot(x,y,0) < MAXITER) Mandelbrot(x,y,1); } } max = 0; for ( i=0 ; i<TAILLE ; i++) for (j=0 ; j<TAILLE ; j++) max = Max(max,IMG[i][j]); fprintf(stderr,"Le maximum atteint est %d\n",max); for(i = 0 ; i < TAILLE ; i++) for(j = 0 ; j < TAILLE ; j++) { t = IMG[j][i] / ( max / GAIN ) ; if (t > 1) t = 1; gdImageSetPixel(image,i,j, t * 255); } gdImageJpeg(image,stdout,100); gdImageDestroy(image); exit(0); }