begin process at 2012 02 12 14:27:07
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > VIDEOS DE FRACTALES DE MANDELBROT

VIDEOS DE FRACTALES DE MANDELBROT


 Information sur la source

Note :
10 / 10 - par 2 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Classé sous :fractal, video, mandelbrot, potentiel, mdi Niveau :Débutant Date de création :01/09/2006 Vu / téléchargé :9 469 / 516

Auteur : JCDjcd

Ecrire un message privé
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note


 Description

Cliquez pour voir la capture en taille normale
Programme qui creer des videos de fractales (pour l'instant
que des fractales de l'ensemble de Mandelbrot).

Les videos sont enregistrees dans des fichiers .vid, le format est non-standart :
c'est fait personnellement, donc une amelioration serait de faire des .avi ...
Il y a 4 formats de videos :
- bitmap : enregistre image par image sans compression, pixel par pixel,
les fichiers sont gros, mais la compression est rapide !
- Diff. : enregistre la premier image en bitmap, puis pour les images
suivantes, enregistre seulement les pixels qui different de l'image
precedente; peu utile pour des images fractales ...
- RLE : compression RLE : on regroupe les memes pixels (memes couleurs)
- Huffman : compression de chaque image par l'algorithme de Huffman
(statique), cf http://www.cppfrance.com/codes/HUFFMAN-CPPFRANCE_3 8961.aspx

Un lecteur de video est bien-sur integrer dans le programme.

L'interface pour creer la video est assez simple d'utilisation :
A gauche la visualisation, le dessin de Mandelbrot avec
les options de coloriage courant.
Les informations de chaque pixel s'affiche a bas, et il y a :
sa position (x,y), sa couleur (RGB), et 4 parametres
de coloriage : iteration, attacteur, potentiel, angle

A droite il y a trois parties :
* en haut les outils pour definir la position de la camera
au cours du temps. Il y a une pile de "vue" associee a
un temps. Par exemple : le programme s'ouvre sur l'ensemble
de Mandelbrot, et le temps est a 0ms, donc la video commencera
par cette image, ensuite zoomer sur une partie interessante
et metter le tempsa 5000ms, ainsi la camera va passer
lineairement de la position initiale, a la position de la partie
choisie en 5 secondes (soit 5000 milli-secondes), et ainsi de
suite, vous pouvez ajouter des "vues". Les vues se visualisent
par des rectangles dans l'image a gauche. Pour enlever
une vur, cliquer sur la croix. La logique est celle d'une pile
donc "ajouter" <=> pusher et "X" <=> poper

* au milieu la partie creation de la video
il faut choisir un format video (bitamp,diff,RLE,huffman)
il faut choisir un nom de fichier *.vid
il faut choisir la taille de la video (cx,cy)
(NB cette taille sera arrondie sur un mutiple de 4 superieur)
il faut choisir le nombre d'images affichees par secondes,
(NB par trop grande, votre PC ne suivera pas,
  par exemple 5 ca saccade, alors que 10 c'est assez fluide)
Puis il suffit de cliquer sur "Creer", alors vous pouvez
voir l'evolution de la creation grace a deux 'progress bars' :
celle du haut la progression du calcule de l'image courante,
celle dubas, la progression du calcule totale de la video.
Vous pouvez apres cliquez sur "Voir" pour lancer une fenere
de lecture de la video.

* en bas la partie des parametres de coloriage
il y a 4 facons dans ce programme de colorier
Pour les comprendre revenons sur l'ensemble de Mandelbrot :
La definition est la suivante, un peu abstraitre, mais bon ...
c'est l'ensemble des nombres complexes (donc point du plan)
tel que "la suite" ne diverge pas (i.e. module de u(n) < 2
pour tout n)
"Le suite" est definie par l'iteration suivante :
soit Z le complexe dont on cherche la couleur :
U(0) = Z
u(N+1) = u(n)^2 + Z

En faite on peut voir cela comme une suite de polynome en Z :
P[0](Z) = Z
P[1](Z) = Z²+Z
P[2](Z) = (Z²+Z)² + Z = Z^4 + 2.Z^3 + Z^2 + Z
...

Maintenant on peut definir l'iteration :
c'est l'indice a partir duquel la suite diverge, i.e.
en terme pompeux : minimum de l'ensemble des 'n'
tel que |u(n)|>=2
Pour les points n'appartenant pas a l'ensemble, ce minimum
existe, et permet d'avoir un jolie fractale.
Les points de l'ensemble de Mandelbrot sont colorier en noir.
Ensuite la il faut faire appelle a l'artiste, car dans
les fractales, une des choses les plus difficile c'est
le choix des couleurs. On a un parametre, il a plus qu'a
definir une fonction de coloriage.
Pour calculer ce parametre, il nous faut un "maxIter",
qui definit les points de l'ensemble de Mandelbrot :
en mathematique c'est tres simple : l'iteration
est infinie, mais en informatique il nous faut une borne.
Donc on ne trace qu'une approximation de l'ensemble.
La fonction de coloriage est toujours une sinusoide
tu parametres : il y a apres pour chaque composante RGB
trois parametres : pulsation (w) dephasage (phi) et
l'amplitude (A) : composante = A*(sin(w.ITER+phi)
avec ITER comme definit plus haut.

L'inconveniant de l'iteration, c'est que c'est un paremtres
discret, et non continue, ce qui serait mieux pour le coloriage.
Pour cela on peut calculer le potentiel de Douady-Hubbard.
Je vais l'introduire de facon tres tres simple :
P[n](Z) c'est en gros du Z^(2^n)) (le terme dominant)
car en elevant au carre on double le degre, donc
elever n fois, car fait multiplier n fois par 2, d'ou
le degre 2^n.
Si on s'interesse au log2 du module, alors il evolue en 2^n
maintenant on s'interesse au log2 du log2 du module, alors
il evolue en n, donc ASYMPTOTIQUEMENT, log2(log2(|P[n](Z)|))
c'est une droite de pente 1 en n : n+V avec V l'ordonne
a l'origine de la droite. Bon alors la c'est fini,
il est montre (merci Douady et Hubbard !) que V etait
justement un potentiel (bon alors c'est pas du tout rigoureux)
mais V est continue, c'est ce qui nous suffit de savoir.
Donc en calculant V=log2(log2(|P[n](Z)|)) - n
on a un parametre de coloriage en plus.
Cependant il est tres lie a l'iteration, c'est en fait
"l'extension continue" de l'iteration

Definition maintenant l'angle : c'est l'argument
(enfin soyons ici rigoureux : 'un' argument) du complexe
P(Z)/P'(Z), alors notons ici un probleme numerique :
P(Z) est relativement gentil avant de diverder (sans blague ! :))
mais le probleme vient de P'(Z), il y a un coefficient 2^n devant
donc pour le calculer pour des zooms tres grands (i.e. iteration grande)
ca peut poser des problemes...
Ce coloriage en fonction de cette angle donne un effet de relief.
(attention ici pour les pulsations, il faut qu'elles soient ENTIERE car
sinon il y aura des problemes de raccordements, alors que si c'est des
entiers sin(w.ANGLE) sera contine !

Le dernier parametre est ce que j'ai appele l'attracteur (c'est pas moi
qui l'est inventer, mais je ne connais pas son nom...).
Il est interessant de s'interresant aux racines des polynomes
successifs (P[0] P[1] P[2] ...), car la grosse figure noire du debut
se repete partout dans le plan mais en plus petite (d'ou le nom de
fractale d'ailleurs...), car a ces zeros la (les racines) correspondent
aux figures noires comme au debut. Et plus le degres du polynome est grand
plus les figures sont petites, mais plus elles sont nombreuses car
il y en a 2^n.
Donc pour un nombre complex Z, il utile de s'interesser a quel polyome
on annule "le plus", en gros on regarde l'indice du plus petit terme
dans la suite en module.
En gros au debut tout les points s'annule le plus le premier polynome
que les suivants, donc ATTRACTEUR=1, mais ensuite au voisinage des petites
figures, on annule plus le polynome dont la racine de la petite figure
correspond a ce polynome. Bon c'est pour cela que ca forme en gros des
cercles centres sur les petites figures.




Bon je donne seulement le code de calcul des differents parametres :

Source

  • //-------------------------------------------------
  • void computingM(P_COLOR_M c,P_PIXEL pixel,P_COMPLEX p)
  • {
  • double re,im,a,b,aPrime,bPrime;
  • double _a,_b,_aPrime,_bPrime;
  • U32 nbIter,maxIter,iMinModule2;
  • double minModule2;
  • nbIter = 0;
  • maxIter = c->nbIterMax;
  • a = re = p->re;
  • b = im = p->im;
  • aPrime = 0;
  • bPrime = 0;
  • minModule2 = a*a + b*b;
  • iMinModule2 = 0;
  • do
  • {
  • double r2;
  • // P(z)^2 + Z
  • _a = a*a - b*b + re;
  • _b = 2.*a*b + im;
  • // 2.P'(Z).P(Z) + 1
  • _aPrime = 2.*(a*aPrime-b*bPrime) + 1.;
  • _bPrime = 2.*(a*bPrime+b*aPrime);
  • a = _a;
  • b = _b;
  • aPrime = _aPrime;
  • bPrime = _bPrime;
  • nbIter ++;
  • r2 = a*a + b*b;
  • if(minModule2 > r2)
  • {
  • minModule2 = r2;
  • iMinModule2 = nbIter;
  • }
  • }while((nbIter < maxIter) && (a*a + b*b < 4.));
  • if(nbIter < maxIter)
  • {
  • U32 k,n; // _
  • double reDiv,imDiv; // P(Z)/P'(Z) = P(Z).P'(Z)/|P'(Z)|² , on oublie le <module2> car pour l'angle c'est pas utile
  • //double module2;
  • n = 5;// ca commence a diverger, faisons-le diverger un peu plus (5 fois)
  • // pour pouvoir etre sur la droite n+V
  • for(k=0;k<n;k++)
  • {
  • // P(z)^2 + Z
  • _a = a*a - b*b + re;
  • _b = 2.*a*b + im;
  • // 2.P'(Z).P(Z) + 1
  • _aPrime = 2.*(a*aPrime-b*bPrime) + 1.;
  • _bPrime = 2.*(a*bPrime+b*aPrime);
  • a = _a;
  • b = _b;
  • aPrime = _aPrime;
  • bPrime = _bPrime;
  • }
  • //module2 = aPrime*aPrime + bPrime*bPrime;
  • reDiv = a*aPrime+b*bPrime;
  • imDiv = a*bPrime-b*aPrime;
  • pixel->nbIter = nbIter;
  • pixel->attrac = iMinModule2;
  • pixel->V = -(float)(log(0.5*log(a*a + b*b)/log(2))/log(2) - nbIter - n);
  • pixel->A = (float)atan2(imDiv,reDiv);
  • }
  • else
  • {
  • pixel->nbIter = (U32)(-1);
  • }
  • } // computingM()
//-------------------------------------------------
void computingM(P_COLOR_M c,P_PIXEL pixel,P_COMPLEX p)
{
double    re,im,a,b,aPrime,bPrime;
double    _a,_b,_aPrime,_bPrime;
U32       nbIter,maxIter,iMinModule2;
double    minModule2;

nbIter  = 0;
maxIter = c->nbIterMax;

a = re      = p->re;
b = im      = p->im;
aPrime      = 0;
bPrime      = 0;
minModule2  = a*a + b*b;
iMinModule2 = 0;

do
  {
  double r2;
  // P(z)^2 + Z
  _a      = a*a - b*b + re;
  _b      = 2.*a*b + im;
  // 2.P'(Z).P(Z) + 1
  _aPrime = 2.*(a*aPrime-b*bPrime) + 1.;
  _bPrime = 2.*(a*bPrime+b*aPrime);

  a      = _a;
  b      = _b;
  aPrime = _aPrime;
  bPrime = _bPrime;
  nbIter ++;

  r2 = a*a + b*b;
  if(minModule2 > r2)
    {
    minModule2  = r2;
    iMinModule2 = nbIter;
    }

  }while((nbIter < maxIter) && (a*a + b*b < 4.));

if(nbIter < maxIter)
  {
  U32     k,n;         //                   _
  double  reDiv,imDiv; // P(Z)/P'(Z) = P(Z).P'(Z)/|P'(Z)|² , on oublie le <module2> car pour l'angle c'est pas utile
  //double  module2;

  n = 5;// ca commence a diverger, faisons-le diverger un peu plus (5 fois)
// pour pouvoir etre sur la droite n+V
  for(k=0;k<n;k++)
    {
    // P(z)^2 + Z
    _a      = a*a - b*b + re;
    _b      = 2.*a*b + im;
    // 2.P'(Z).P(Z) + 1
    _aPrime = 2.*(a*aPrime-b*bPrime) + 1.;
    _bPrime = 2.*(a*bPrime+b*aPrime);

    a      = _a;
    b      = _b;
    aPrime = _aPrime;
    bPrime = _bPrime;
    }

  //module2 = aPrime*aPrime + bPrime*bPrime;
  reDiv   = a*aPrime+b*bPrime;
  imDiv   = a*bPrime-b*aPrime;


  pixel->nbIter = nbIter;
  pixel->attrac = iMinModule2;
  pixel->V      = -(float)(log(0.5*log(a*a + b*b)/log(2))/log(2) - nbIter - n);
  pixel->A      = (float)atan2(imDiv,reDiv);
  }
else
  {
  pixel->nbIter = (U32)(-1);
  }
} // computingM()


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture COLORATION SYNTAXIQUE
Source avec Zip Source avec une capture ORBITES DES SATELLITES GPS
Source avec Zip Source avec une capture DESSIN D'ARBRES
Source avec Zip Source avec une capture PROGRAMMATION LINEAIRE
Source avec Zip EXTENSION DE CORPS (MATH)

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip WMV VIDEO ENREGISTREMENT par nanonavich
Source avec Zip Source avec une capture TRAITEMENT DES VIDÉOS AVI: IMANALYSE par Pistol_Pete
Source avec Zip Source avec une capture CAPTURE ECRAN OU WEBCAM par TheTiger
Source avec Zip Source avec une capture YOUTUBE VIDEO par f_l_a_s_h_b_a_c_k
Source avec Zip Source avec une capture FRACTALE DE MANDELBROT ET JULIA [DJGPP] par seelenblut

Commentaires et avis

Commentaire de tit_toinou le 01/09/2006 23:28:13

Bien vu !
quoique la taille de la vidéo est trop petite

Commentaire de luhtor le 01/09/2006 23:30:05

Comme tu le dis toi meme : plus que "à faire".

Vraiment sympa comme programme et j'imagine relativement complexe pour gérer l'ensemble des options que tu proposes.
Dommage qu'un tel programme n'est qu'une faible durée de vie :) mais la possiblité de créer des vidéos est vraiment intéressante et surtout ! ... elle semble marcher.

Bonne continuation.

Commentaire de JCDjcd le 01/09/2006 23:44:32

pourquoi une faible duree de vie ??

Commentaire de Patrice99 le 02/09/2006 10:25:18

J'avais fait exactement la même chose sous DOS :
Création de films fractals sous DOS (le code source date de 1992) :
http://patrice.dargenton.free.fr/fractal/fractal.zip (68 Ko)
(mémoire DOS conventionnelle libre requise : 550 Ko, tapez mem dans une fenêtre de commandes MS-DOS pour vérifier la mémoire disponible).

Je voulais refaire cela sous Windows, mais je n'ai pas encore fait de vidéo avi :
http://patrice.dargenton.free.fr/fractal/index.html

J'ai cependant un lien ici :

Create a new video stream from a list of bitmaps :
A Simple C# Wrapper for the AviFile Library
www.codeproject.com/cs/media/aviFileWrapper.asp

Sinon il existe peut être d'autres logiciels capables de faire des video AVI depuis une liste d'images numérotées (j'en avais un sous DOS : VFD, voir VBDivX, mais il ne marche plus avec Windows XP)

Commentaire de luhtor le 02/09/2006 12:41:29

Ben j'ai dis faible durée de vie, car moi (par exemple) je vais pas m'amuser des heures et des heures a faire des videos sur mandelbrot. C'est tout :)

Commentaire de JCDjcd le 02/09/2006 13:34:06

tout a fait d'accord ...

Commentaire de Kirua le 02/09/2006 18:53:57

Splendide, et une description hyper poussée ... Ca mérite un trophée ça non? Youhou, un admin?

Commentaire de Alain Proviste le 02/09/2006 20:50:33 administrateur CS

je suis admin et j'aimerais attribuer un trophée sur chacune des sources de jcdjcd. je laisse à d'autres le choix de le faire ou non...

Commentaire de BruNews le 23/09/2006 08:59:38 administrateur CS

La newsletter MSDN de cette semaine contient un encart et un lien sur cette très bonne source.

Commentaire de Kirua le 23/09/2006 16:42:01

GG ! :)

Commentaire de JCDjcd le 23/09/2006 19:38:44

et ca raconte quoi ?

Commentaire de BruNews le 23/09/2006 19:52:09 administrateur CS

Rien de particuluer, section C/C++ il y a un lien vers ta source avec la 1ere phrase que tu as mise en description plus haut.
Ne cherche pas plus loin le coupable de cet encart, j'avoue.

Ici pour vous inscrire à cette newsletter:
http://www.microsoft.com/france/msdn/abonnements/newsletter/default.mspx

Commentaire de Alain Proviste le 23/09/2006 19:53:45 administrateur CS

pas de culpabilité à avoir, c'est mérité.

Commentaire de oomm le 02/12/2007 13:44:02

thenk you

Commentaire de Opium39 le 14/03/2008 18:27:20

Bonsoir tout le monde
connaissant vraiment très peu l'informatique ^^
je voudrait savoir comment lancé le programme??
j'ai DL le dossier zip et ensuite j'ai tout extrais.
mais me voila bloqué :-/
merci d'avance ;-)

Commentaire de BruNews le 14/03/2008 18:32:20 administrateur CS

Renomme FracVid.exe_ en FracVid.exe

Commentaire de Opium39 le 14/03/2008 18:40:29

merci fort bien

Commentaire de orcima le 12/01/2010 11:46:31

Bonjour,

J'ai fais la même chose il y a quelques années et j'ai finis par lui faire générer des vidéo avi puis j'ai arrété, 2 ans de fractale ça marque suffisamment pour commencer à s'intéresser à la théorie du chaos.  

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Acquisition Video [ par petitsonic ] Salut!Je possede un camescope numerique et une carte tuner tvqui me sert de carte d'acquisition (hauppauge wintv primio (chip BT878)).J aimerai develo Besion d'aide pour Capture Video WDM en C++ [ par kodoma ] Je dois faire un programme en c++, ki permette de capturer une video à l'aide des drivers WDM et de pouvoir récupérer une seule image ki sera sauvegar Besion d'info urgentes pour Capture Video WDM en C++ [ par kodoma ] Je dois faire un programme en c++, ki permette de capturer une video à l'aide des drivers WDM et de pouvoir récupérer une seule image ki sera sauvegar Loader une video [ par Anakin ] Bonjour a tous,J'aimerais savoir si il est possible de loader une video en format avi par exemple dans la fenetre active de l'ecran, et si oui, est ce question pour logiciel sur jeux video [ par glash ] lut,J'ai créé une sorte de répertoire pour les serveurs de jeux et j'aimerai y mettre un fonction qui permettent de rejoindre le serveur rien qu'en ta video compression [ par bibou75 ] salut à tous,je cherche toutes info sur les fonction ICOpen ICCompressorchoose et tout ce qui est initialisation de video compression manager je vous Ouverture d'une MDI sans doc vierge [ par drix ] Je voudrai ouvrir mon appli MDI sous VC++ 6.0 sans qu'un document vierge soit ouvert au lancement du logiciel.Mais je voudrai aussi avoir la possibili Ouverture d'une MDI sans doc vierge [ par drix ] Je voudrai ouvrir mon appli MDI sous VC++ 6.0 sans qu'un document vierge soit ouvert au lancement du logiciel.Mais je voudrai aussi avoir la possibili 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 Texte & SDL en mode Video [ par Gaelle ] Bonjour à tous,Je suis en train d'interfacer une application C à l'aide de SDL. Pour ce qui est de la gestion vidéo et évènements souris aucun problèm


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,170 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales