Générateur de fractales dans un bitmap

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 053 fois - Téléchargée 29 fois

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

Ajouter un commentaire Commentaires
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
dis voir , a quoi correspond nb0 ? enfin, je veux dire, d'ou sort ce calcul: nb0=largeur%r ? pasque moi j'ai des ptits pb avec les bmp en ce moment... si t'avais de la doc...
merci
++
ad
Messages postés
117
Date d'inscription
mercredi 3 septembre 2003
Statut
Membre
Dernière intervention
17 février 2007

un code source clair, court et concis pour un programme amusant et intéressant... sympa !
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
Tout de suite c mieux ^^ merci et hop 10 ^^
Messages postés
546
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
4 mai 2007
1
Tres interessant mais pas assez commenté : tu commentes ca a mort et je te mets dierct un joli 10/10 ^^ Merci

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.