#include #include #include #include #include #define P2(a) a*a struct camera{ double x,y,width,height; }; struct render{ double omin_x,omax_x,omin_y,omax_y; int H,W,max_iter,radius,a,b; int img[1000][1000]; char basename[256]; struct camera pov; }; double map(int v, int imin, int imax, double omin, double omax); void render_init(struct render *set, int argc, char *argv[]); void render_image(struct render *set); void image_save_bw(struct render *set); void image_save_altern(struct render *set); void cam2rect(struct render *set, struct camera *pov); int main(int argc, char *argv[]){ int comp=1;/*compteur pour gérer le strtok*/ struct render set; char *co; set.pov.x=-1.142817421949293; set.pov.y=-0.21198254168631775; set.pov.width=0.0055; set.pov.height=0.0055; if (argc==3){/*si argc=3 alors il faut changer les valeurs*/ co=strtok(argv[2],","); while(co!=NULL){ if (comp==1){ set.pov.x=atof(co); } if (comp==2){ set.pov.y=atof(co); } if (comp==3){ set.pov.width=atof(co); } if (comp==4){ set.pov.height=atof(co); } co=strtok(NULL,s); comp++; } } render_init(&set,argc,argv); cam2rect(&set,&set.pov); render_image(&set); image_save_altern(&set); return 0; } double map(int v, int imin, int imax, double omin, double omax){ float x; x=v-imin; x=x/(imax-imin); x=x*(omax-omin); x+=omin; return x; } void render_init(struct render *set, int argc, char *argv[]){ set->omin_x=-2; set->omax_x=0.48; set->omin_y=-1.24; set->omax_y=1.24; set->H=1000; set->W=1000; set->max_iter=1000; if (argc==2){/*si argc=2 on change max_iter qui est 1000 par défaut*/ set->max_iter=strtol(argv[1],NULL,10); } set->radius=2; strcpy(set->basename,"mandel.pbm"); } void render_image(struct render *set){ float y=1,x=1,x0=1,y0=1,xc=1,pcent=1;/*pcent=pourcentage*/ int i=1,j=1,compteur=1;/*compteur=compte le nombre d'itérations avant divergence*/ for (i=0;iH;i++){ pcent=100*i*1.00/set->H; printf("%.2f %c\r",pcent,'%'); for (j=0;jW;j++){/*x*/ x=map(j,0,set->W,set->omin_x,set->omax_x); y=map(i,0,set->H,set->omin_y,set->omax_y); compteur=1; x0=x; y0=y; while ((sqrt(P2(x)+P2(y))<=set->radius)&&(compteurmax_iter)){ xc=x; x=P2(xc)-P2(y)+x0; y=2*xc*y+y0; compteur+=1; } set->img[i][j]=compteur; } } printf("\n"); } void image_save_bw(struct render *set){ int i,j; char format[5]="P1"; FILE *fout; strcpy(set->basename,"mandel_bw.pbm"); fout=fopen(set->basename,"w"); if (fout==NULL){ printf("Erreur\n"); return ; } fprintf(fout,"%s\n%d %d\n",format,set->H,set->W); for (i=0;iH;i++){ for (j=0;jW;j++){/*x*/ if ((set->img[i][j])==set->max_iter){ fputc('1',fout); } else{ fputc('0',fout); } } fprintf(fout,"\n"); } fclose(fout); } void image_save_altern(struct render *set){ int i,j; char format[5]="P1"; FILE *fout; strcpy(set->basename,"mandel_altern.pbm"); fout=fopen(set->basename,"w"); if (fout==NULL){ printf("Erreur\n"); return ; } fprintf(fout,"%s\n%d %d\n",format,set->H,set->W); for (i=0;iH;i++){ for (j=0;jW;j++){/*x*/ if (((set->img[i][j])==set->max_iter)||(set->img[i][j]%2==1)){ fputc('1',fout); } else{ fputc('0',fout); } } fprintf(fout,"\n"); } fclose(fout); } void cam2rect(struct render *set, struct camera *pov){ set->omin_x=pov->x-pov->width/2.0; set->omax_x=pov->x+pov->width/2.0; set->omin_y=pov->y-pov->height/2.0; set->omax_y=pov->y+pov->height/2.0; }