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 !

VIDEOS DE FRACTALES DE MANDELBROT


Information sur la source

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é: 6 687 / 464

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

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (17)
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_38961.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

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 tit_toinou le 01/09/2006 23:28:13

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

signaler à un administrateur
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.

signaler à un administrateur
Commentaire de JCDjcd le 01/09/2006 23:44:32

pourquoi une faible duree de vie ??

signaler à un administrateur
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)

signaler à un administrateur
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 :)

signaler à un administrateur
Commentaire de JCDjcd le 02/09/2006 13:34:06

tout a fait d'accord ...

signaler à un administrateur
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?

signaler à un administrateur
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...

signaler à un administrateur
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.

signaler à un administrateur
Commentaire de Kirua le 23/09/2006 16:42:01

GG ! :)

signaler à un administrateur
Commentaire de JCDjcd le 23/09/2006 19:38:44

et ca raconte quoi ?

signaler à un administrateur
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

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

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

signaler à un administrateur
Commentaire de oomm le 02/12/2007 13:44:02

thenk you

signaler à un administrateur
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 ;-)

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

Renomme FracVid.exe_ en FracVid.exe

signaler à un administrateur
Commentaire de Opium39 le 14/03/2008 18:40:29

merci fort bien

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...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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 : 1,295 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é.