Générateur de fractales dans un bitmap

Contenu du snippet

Ce code crée un bitmap dans lequel est contenue la fractale.

une fois compilé on utilise le programme comme ceci :

c:\fractale image.bmp
larg --> largeur du bmp en pixel
haut --> hauteur du bmp en pixel
cx --> coordonée sur les absisses du centre du repere
cy --> coordonée sur les ordonnées du centre du repere
largeur complexe --> largeur du plan complexe (4 pour pas de zoom)
Iterations --> iterations

Je suis conscient que ce code n'est pas super optimiser (surtout our la creation du bitmap) mais ca que je voulais c'était faire des jolis dessins.

Source / Exemple :


#include <stdio.h>
#include <math.h>

FILE *picture;

int main(int argc, char *argv[])
{                                               
    //creation de l'entete du bitmap///////////////////////////////// 
     short haut,larg;        //hauteur et largeur de l'image en pixel
     char nb0;                //nb de zero de fin de lign du bitmap
     char title[7];            //tableau contenant les paramètre de l'entete
     title[0]=66;             // caractère "B"
     title[1]=77;            // "M"
     title[2]=0;
     title[3]=54;            //divers caractères situés en entete
     title[4]=40;
     title[5]=01;
     title[6]=24;            //codage des couleurs en bits
     short resolution=2834; //resolution du bitmap

     picture = fopen(argv[1],"wb"); //ouverture du fichier en ecriture
     
     //ecriture de l'entete

     fwrite(&title[0],sizeof(char),1,picture);
     fwrite(&title[1],sizeof(char),1,picture);
     for(int i=0;i<8;i++) fwrite(&title[2],sizeof(char),1,picture);
     fwrite(&title[3],sizeof(char),1,picture);for(int i=0;i<3;i++) fwrite(&title[2],sizeof(char),1,picture);
     fwrite(&title[4],sizeof(char),1,picture);for(int i=0;i<3;i++) fwrite(&title[2],sizeof(char),1,picture);
     printf("Larg ? "); scanf("%i",&larg); fwrite(&larg,sizeof(long),1,picture);
     printf("Haut ? "); scanf("%i",&haut); fwrite(&haut,sizeof(long),1,picture);
     fwrite(&title[5],sizeof(char),1,picture);
     fwrite(&title[2],sizeof(char),1,picture);
     fwrite(&title[6],sizeof(char),1,picture);
     fwrite(&title[2],sizeof(char),1,picture);
     for(int i=0;i<8;i++) fwrite(&title[2],sizeof(char),1,picture);
     fwrite(&resolution,sizeof(short),1,picture);
     fwrite(&title[2],sizeof(char),1,picture);
     fwrite(&title[2],sizeof(char),1,picture);
     fwrite(&resolution,sizeof(short),1,picture);
     fwrite(&title[2],sizeof(char),1,picture);
     fwrite(&title[2],sizeof(char),1,picture);
     for(int i=0;i<8;i++) fwrite(&title[2],sizeof(char),1,picture);

/////////////////////////////////////////////////////////////////////////////////

     nb0=larg%4;   // permet de connaitre le nombre de zeros à mettre en fin de ligne du bitmap.

     float cx,cy;           //coordonnées du plan complexe
     float largeur;        //largeur du plan complexe
     printf("cx ? ");
     scanf("%f",&cx);
     printf("cy ? ");
     scanf("%f",&cy);
     printf("largeur complexe ? ");
     scanf("%f",&largeur);

     short nx=larg,ny=haut;
     float xmin=cx-largeur/2.0;             //calculs des bornes du plan
     float ymax=cy+largeur/2.0*ny/nx;  //calculs des bornes du plan
     float pas=float(largeur/nx);           //calculs du pas d'incrementation
     float a,b,x,y,x1;                          //variables du problemes
     short n;
     char color[3];      //Tableau des couleurs ( 24bits -> 3 couleurs RVB [0->255])
     short iter;

     printf("Iterations ? ");   //Nb de fois que la suite doit convergé
     scanf("%i",&iter);

     for(int j=0;j<ny;j++)
     {
      b=ymax-j*pas;
      for(int i=0;i<nx;i++)
      {
       a=i*pas+xmin;
       x=0;y=0;n=0;
       do
       {
        x1=x*x-y*y+a;
        y=2*x*y+b;
        x=x1;
        n=n+1;
       }while(((x*x+y*y)<4) && (n<iter));

       color[0]=255-255/(sqrt(sqrt(n))+1);      //joli codage des couleurs
       color[1]=pow(n,0.85);                          //joli codage des couleurs
       color[2]=255/(sqrt(n)+1);                    //joli codage des couleurs

       if(n>(iter-1)) {color[0]=0;color[1]=0;color[2]=0;}

       fwrite(&color[0],sizeof(char),1,picture);
       fwrite(&color[1],sizeof(char),1,picture);   //ecriture dans le bitmap
       fwrite(&color[2],sizeof(char),1,picture);
      }
      for(int j=0;j<nb0;j++) fwrite(&title[2],sizeof(char),1,picture);  //zeros de fin de ligne
     }

     return 0;
}

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.