Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

FRACTALE DE MANDELBROT ET JULIA [DJGPP]


Information sur la source

Description

Cliquez pour voir la capture en taille normale
Un programme qui dessine une fractale de Mandelbrot ou de Julia. Possibilité d'enregistrer une image au format .bmp, voir la capture pour quelques exemples générés avec le programme.

Pour compiler le programme, utilisez la ligne de commande :
gcc mandelbrot-julia.c gfx.c mouse.c bmp.c -o mandelbrot-julia.exe

Certaines fonctions que j'ai implémentées ne sont pas utilisées, par exemple le programme n'a pas besoin d'ouvrir un .bmp (seulement de l'enregistrer), ni de laisser l'utilisateur entrer un nombre réel (seulement un nombre entier est nécessaire), ni d'avoir un appel à une fonction pour afficher la souris. J'ai choisi de ne pas effacer ces fonctions de la source, même si elles ne sont pas vraiment nécessaires...

Le mode graphique utilisé est le VGA 13h, c'est pas très moderne ni très beau, mais ça a le mérite d'être très simple.

Pour ceux qui ne veulent pas compiler ou n'ont pas DJGPP, vous pouvez essayer le programme ici :
http://gcheese.free.fr/prog/mandelbrot-julia.exe
 

Source

  • Voir le fichier zip pour le code source, ici j'explique en gros comment generer une fractale pour ceux qui ne le sauraient pas.
  • Premiere chose a savoir pour vouloir generer une fractale : les operations sur les nombres complexes.
  • Un nombre complexe est un nombre de la forme z = a + bi, ou i est un nombre tel que i^2 = -1 (en d'autre mot, i est la racine carree de -1, c'est donc un nombre 'imaginaire')
  • A partir de la toutes les operations se font normalement, mais en tenant compte du fait que i^2 = -1
  • exemple :
  • (a + bi) + (c + di) = (a+c) + (b+d)i
  • (a + bi) * (c + di) = (ac-bd) + (ad+bc)i
  • Ensuite, les fractales de Mandelbrot et de Julia sont bases sur une seule ridicule petite formule :
  • z_n+1 = z_n^2 + c
  • (ne pas oublier que c et z sont des nombres complexes !)
  • Si je prend z_0=a+bi et c=c+di, j'ai donc :
  • z_0=a+bi
  • z_1=(a+bi)^2+(c+di)
  • z_2=((a+bi)^2+(c+di))^2+(c+di)
  • z_3=(((a+bi)^2+(c+di))^2+(c+di))^2+(c+di)
  • etc...
  • Les nombres complexes sont donc d'une certaine maniere des couples de nombres 'normaux'.
  • Vu qu'on a donc deux nombres, on peut representer les nombres complexes sur un plan, le nombre z=a+bi sera le point (a,b)
  • Maintenant, on se rend compte que selon la valeur de depart de z_0, la plupart des z_n deviennent de plus en plus grand jusqu'a l'infini, mais que certains au contraire convergent...
  • Ces valeurs de depart z_0 qui donnent des z_n convergents appartiennent a l'ensemble de Mandelbrot, c'est notre fractale.
  • Cependant on ne peut evidemment pas calculer les z_n jusque l'infini pour savoir s'ils convergent ou pas... mais on peut etre sur que si la valeur absolue d'un nombre est plus grande que 2, alors il va diverger.
  • La valeur absolue d'un nombre complexe z=a+bi est |z|=sqrt(a^2+b^2), en fait c'est la distance de (a,b) a (0,0)
  • Donc je devrai seulement calculer les z_n tant que (a^2+b^2)<4 (mais avec un nombre d'iterations maximum, sinon les nombres appartenant a la fractale provoqueront une boucle infinie !)
  • Il reste a colorier differemment les points z_0 selon qu'ils divergent ou convergent. Generalement, on choisir de colorier en noir les z_0 convergents et d'attribuer une couleur au z_0 divergents selon le nombre d'iterations necessaires avant qu'ils se mettent a grandir irremediablement.
  • Et par magie (et ca je ne sais pas vraiment l'expliquer), la fractale de Mandelbrot va apparaitre.
  • Le c de l'equation z_n+1 = z_n^2 + c est en fait une 'perturbation', normalement on met le c a zero, autrement la fractale sera un peu 'deformee'.
  • Quant a la fractale de Julia c'est presque pareil, a la difference pres que z_0 contiendra une constante et c contiendra le point.
  • Ce qui est interessant c'est que les constantes z_0 les plus interessantes sont celles qui bordent la fractale de Mandelbrot... c'est pourquoi dans le programme on peut voir un 'apercu' du Julia 'associe' au Mandelbrot.
  • Le seul probleme est donc qu'il est parfois un peu lent de calculer une fractale... en effet, si je veux une image de dimensions x*y, avec une iteration maximum de i, alors il faudra executer la formule x*y*i fois (et apres ça s'occuper du coloriage, etc...).
  • PS : normalement on ecrit 'fractale', c'est un mot féminin, en tout cas Benoit Mandelbrot en expliquant sa theorie a insiste pour que 'fractale' soit utilise au feminin... cependant on le voit souvent ecrit au masculin 'un fractal'.
Voir le fichier zip pour le code source, ici j'explique en gros comment generer une fractale pour ceux qui ne le sauraient pas.

Premiere chose a savoir pour vouloir generer une fractale : les operations sur les nombres complexes.

Un nombre complexe est un nombre de la forme z = a + bi, ou i est un nombre tel que i^2 = -1 (en d'autre mot, i est la racine carree de -1, c'est donc un nombre 'imaginaire')

A partir de la toutes les operations se font normalement, mais en tenant compte du fait que i^2 = -1

exemple :

(a + bi) + (c + di) = (a+c) + (b+d)i

(a + bi) * (c + di) = (ac-bd) + (ad+bc)i

Ensuite, les fractales de Mandelbrot et de Julia sont bases sur une seule ridicule petite formule :

z_n+1 = z_n^2 + c

(ne pas oublier que c et z sont des nombres complexes !)

Si je prend z_0=a+bi et c=c+di, j'ai donc :

z_0=a+bi
z_1=(a+bi)^2+(c+di)
z_2=((a+bi)^2+(c+di))^2+(c+di)
z_3=(((a+bi)^2+(c+di))^2+(c+di))^2+(c+di)
etc...

Les nombres complexes sont donc d'une certaine maniere des couples de nombres 'normaux'.
Vu qu'on a donc deux nombres, on peut representer les nombres complexes sur un plan, le nombre z=a+bi sera le point (a,b)

Maintenant, on se rend compte que selon la valeur de depart de z_0, la plupart des z_n deviennent de plus en plus grand jusqu'a l'infini, mais que certains au contraire convergent...
Ces valeurs de depart z_0 qui donnent des z_n convergents appartiennent a l'ensemble de Mandelbrot, c'est notre fractale.

Cependant on ne peut evidemment pas calculer les z_n jusque l'infini pour savoir s'ils convergent ou pas... mais on peut etre sur que si la valeur absolue d'un nombre est plus grande que 2, alors il va diverger.
La valeur absolue d'un nombre complexe z=a+bi est |z|=sqrt(a^2+b^2), en fait c'est la distance de (a,b) a (0,0)

Donc je devrai seulement calculer les z_n tant que (a^2+b^2)<4 (mais avec un nombre d'iterations maximum, sinon les nombres appartenant a la fractale provoqueront une boucle infinie !)

Il reste a colorier differemment les points z_0 selon qu'ils divergent ou convergent. Generalement, on choisir de colorier en noir les z_0 convergents et d'attribuer une couleur au z_0 divergents selon le nombre d'iterations necessaires avant qu'ils se mettent a grandir irremediablement.

Et par magie (et ca je ne sais pas vraiment l'expliquer), la fractale de Mandelbrot va apparaitre.

Le c de l'equation z_n+1 = z_n^2 + c est en fait une 'perturbation', normalement on met le c a zero, autrement la fractale sera un peu 'deformee'.


Quant a la fractale de Julia c'est presque pareil, a la difference pres que z_0 contiendra une constante et c contiendra le point.
Ce qui est interessant c'est que les constantes z_0 les plus interessantes sont celles qui bordent la fractale de Mandelbrot... c'est pourquoi dans le programme on peut voir un 'apercu' du Julia 'associe' au Mandelbrot.


Le seul probleme est donc qu'il est parfois un peu lent de calculer une fractale... en effet, si je veux une image de dimensions x*y, avec une iteration maximum de i, alors il faudra executer la formule x*y*i fois (et apres ça s'occuper du coloriage, etc...).


PS : normalement on ecrit 'fractale', c'est un mot féminin, en tout cas Benoit Mandelbrot en expliquant sa theorie a insiste pour que 'fractale' soit utilise au feminin... cependant on le voit souvent ecrit au masculin 'un fractal'.

Conclusion

Problèmes connus :
- Lors de l'enregistrement d'un .bmp, si on choisit un grand nombre d'iterations maximum, on aura peu de couleurs différentes. Ça dépend du mode de coloriage choisi, mais normalement le programme essaye de s'arranger pour que toute la palette des couleurs soit présente. Mais seulement pour un grand nombre d'itérations, on aura souvent une petite centaine de points de couleurs 200-255, et des milliers de points pour les couleurs 2-50. On pourrait arranger cela en implémentant un algorithme qui s'arrange non pas pour que toute la palette soit utilisée, mais pour que toutes les couleurs soit présentes en proportions équivalentes. Mais c'est beaucoup de boulot (compter les points de même itérations, etc...) pour pas grand chose, j'ai donc choisi de laisser ça comme ça.
- Quand on zoome trop, au bout d'un moment la fractale se déforme, puis n'est même plus affichée. L'explication réside dans le fait que le zoom est en fait exprimé sous la forme du "rayon" (la taille) de l'image qui doit être affichée. Plus la variable "radius" est petite plus le zoom est fort, mais on ne peut pas mettre une valeur aussi petite qu'on veut dans une variable "double" ! Un moment le nombre sera si petit qu'il sera considéré comme nul, ce qui fait planter la génération de la fractale. Là encore, les solutions possibles demandent trop de travail pour pas grand chose...
- Sinon c'est tout, quelques petits bugs d'affichage de temps en temps peut-être, mais rien de grave.
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de noSnoR le 05/01/2006 21:46:38

fractalE, au feminin, pour l'objet mathématique, fractal : adjectif utilisé pour qualifier certains objets de la nature qui peuvent être comparés à des fractales (Choux romanesco, Côte Bretonne etc...).

signaler à un administrateur
Commentaire de dthuler le 09/01/2006 09:14:15

Introduction qui donne envie de voir le code... suis impatient d'y jeter un coup d'oeil! Bien vu :)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Mandelbrot, Julia [ par Novae ] J'essaye de programmer un log. de dessin de fractales Mandelbrot ou Julia, l'algorithme ca va mais je n'arrive pas a tracer koi ke ce soit avec graphi BMP sous devcpp [ par dionysos ] Salut Comment insere-t-on un fichier BMP en C, console ms-dos, sous devcpp.Quelles fonctions?Quelles bibliotheques?Merci. pleeeeeeeeeaaaaaaase:images bmp [ par kambo ] salut ! j'aimerais savoir comment inserer une bmp dans une fenetre ,serait-t-il possible de la manipuler avec la souris ,ou de la localiser ds un repe Device context et StretchBlt ? [ par tavernier ] Bonjour, je suis en train de faire un générateur de fractale et j'ai besoin de mettre la fractale de coté pour ne pas avoir à tout recalculer pour la seuillage d'une image bmp [ par coolman789 ] salut a tous !!!je voudrais savoir si il y a quelqu'un pour me dire ou je puisse trouver un algorithme pour effectuer un seuillage sur une image bmp e pb de pointeur... [ par didrocks ] Voici une de mes fonctions:void Main::LoadBmp(geBitmap *Bmp, char *NomFichier){ geVFile *File; int temp;/* if (m_Height==800) *NomFichier ="E" && * importer des bmp ou jpeg du disk dur dans un projet vc++6 et les mettres en fond sur une boite de dialigue ou un bouton [ par retaks666 ] j'aimerais savoir comment importer des bmp ou jpeg du disk dur dans un projet vc++6 et les mettres en fond sur une boite de dialigue ou un bouton. je Format de fichier : très étrange [ par GoldenEye ] Bonjour à tous J'ai un problème très bizarre: je viens de revenir sur un programme de compression (Huffman sur ce site) et je m'aperçois qu'il ne fonc PB:[TURBO C++]charger une image (bmp ou jpg) et l'afficher [ par kobee12 ] depuis quelque temps j'essaie de trouver un programme qui me permettrait d'afficher une ou plusieurs images en utilisant GRAPHICS.H avec TURBO C++.Seu Comment convertir une image png en bmp? [ par REk2002 ] Je cherche un programme pas trop compliqué à comprendre pour convertir une images png en format bmp.


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.