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 !

EXPLORATEUR FRACTALE MANDELBROT HAUTE DEFINITION


Information sur la source

Catégorie :Graphique Classé sous : fractale, mandelbrot, buddhabrot, video, zoom Niveau : Initié Date de création : 11/03/2007 Date de mise à jour : 03/06/2007 00:45:13 Vu / téléchargé: 6 356 / 757

Note :
9,4 / 10 - par 5 personnes
9,40 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Explorateur de l'ensemble M de Mandelbrot avec fonctions de rendu avancé, ainsi que le rendu buddhabrot.

Pour ceux qui n'aiment pas les longs discours, lancez le programme et cliquez sur le bouton ' Démo! '
Lisez aussi les commentaires dans le sub de ce bouton.


Bonjour,

Suite à une soudaine envie de dessiner des fractales, j'ai regarder les différentes sources du site. Il y en a de fort sympa, j'ai donc voulu ajouter mon grain de sel :) Etant un fana de l'optimisation, je vous propose ce soft, en VB6, qui n'a pas à rougir en terme de performances.
Rien d'intéressant jusque là, me direz-vous, alors j'ai codé des fonctions en prime qui, à mon avis, en amusera plus d'un.

Au menu :
- Exploration et zoom par simple clique gauche / clique droit maintenu de la souris
- Différentes palettes de couleurs précalculées, dont la HSL qui donne d'excellents résultats dans les zones complexes
- Rotation de la palette avec barre espace (spacebar) et retour arrière (backspace)
- Fenêtre de visualisation séparée et redimensionnable à volonté
- Copie direct dans le presse-papier pour envoyer une image dans un autre logiciel
- Rendu haute résolution : faites vos fond d'écran fractale avec une qualité d'image stupéfiante! En plus il n'y a pas de limite de taille (mettez vous-même les dimensions : 1024x768, 1920x1080, 200x200, ... fonctionne en 8000x8000, mais comptez un bon quart d'heure de calcul...)
- Rendu vidéo AVI ! Zoomez, zoomez, zoomez ... et faite un rendu vidéo de votre exploration. Vous verrez les motifs se répéter à l'infini :) . Une option permet le rendu en haute résolution, mais c'est très lent !
- Rendu BuddhaBrot, une autre façon de présenter l'ensemble M en traçant tous les points calculés dans la suite z(n+1)=z(n)^2+z(0) . Les effets sont remarquable.
- D'autres gadgets encore, et surtout un code optimisé pour le compilateur. Compilez-le et les calculs seront 10 fois plus rapide.

C'est un programme complexe et l'interface n'est, hélas, pas très intuitive. Le code source est, je l'espère, suffisament commenté pour que vous compreniez les fonctionnalités.
 

Source

  • 'Voir le ZIP, le code est complexe mais commenté au maximum.
  • 'Le module principale : G_Fract.bas
  • 'Le module d'interface image : MatrixBuffer.bas
  • 'Le module de rendu AVI : myAVI.bas
  • 'Le module pour multithreadé le rendu AVI : GF_Thread.bas
  • 'Autres modules importés pour le rendu AVI : mdAVI.bas, CDib.cls
  • 'Algorithme utilisé pour le rendu Mandelbrot. Des variantes optimisés pour les divers rendus sont ailleur dans le code.
  • Function PurMandelCalc(ByRef ro As Double, ByRef io As Double, ByVal mx_iter As Long) As Long
  • 'boucle de calcul de la suite pur
  • 'ro, io ont les coordonnées de départ
  • 'mx_iter le nombre d'itération maximale de la suite (pour éviter l'overflow)
  • Dim r As Double, rt As Double, i As Double, r2 As Double, i2 as Double
  • r = ro
  • i = io
  • r2 = r * r
  • i2 = i * i
  • Do
  • rt = r2 - i2 + ro
  • i = 2 * r * i + io
  • r = rt
  • r2 = r * r
  • i2 = i * i
  • PurMandelCalc = PurMandelCalc + 1
  • Loop While ((r2 + i2 < 4) And (PurMandelCalc < mx_iter)
  • End Function
'Voir le ZIP, le code est complexe mais commenté au maximum.
'Le module principale : G_Fract.bas
'Le module d'interface image : MatrixBuffer.bas
'Le module de rendu AVI : myAVI.bas
'Le module pour multithreadé le rendu AVI : GF_Thread.bas
'Autres modules importés pour le rendu AVI : mdAVI.bas, CDib.cls


'Algorithme utilisé pour le rendu Mandelbrot. Des variantes optimisés pour les divers rendus sont ailleur dans le code.

Function PurMandelCalc(ByRef ro As Double, ByRef io As Double, ByVal mx_iter As Long) As Long
'boucle de calcul de la suite pur
'ro, io ont les coordonnées de départ
'mx_iter le nombre d'itération maximale de la suite (pour éviter l'overflow)
Dim r As Double, rt As Double, i As Double, r2 As Double, i2 as Double
    
    r = ro
    i = io
    r2 = r * r
    i2 = i * i

    Do

        rt = r2 - i2 + ro
        i = 2 * r * i + io
        r = rt
        r2 = r * r
        i2 = i * i
        
    PurMandelCalc = PurMandelCalc + 1
    Loop While ((r2 + i2 < 4) And (PurMandelCalc < mx_iter)
    
End Function

Conclusion

Ne criez pas "au loup!", j'ai regardé des sources et m'en suis inspiré. Le système de rendu AVI utilise même deux modules récupéré de planet-source-code.
Toutefois il n'y a pas de copié-collé. J'ai réécrit les algo entièrement pour essayer d'optimiser la vitesse de rendu.

Vous trouverez le module MatrixBuffer.bas qui permet de s'affranchir de la lenteur de VB question interface picturebox et images.

C'est aussi un code partiellement multithread compilable. Comment faire pour que le multithread ne plante pas ? C'est simple : ne faite pas de sortie sur fichier!! Limitez au maximum l'appels aux objets, et ça marche.

ATTENTION le rendu haute résolution sur disque dur (bouton 'dd') nécessite que l'option Etendre palette soit choisi.


Voila, sur ce, essayez de trouver une belle zone à rendre en mode haute résolution, c'est impressionnant par moment!
 

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

Historique

11 mars 2007 01:25:07 :
Zip débuggé. La capture est moche, faute au Jpeg, pas au programme :)
12 mars 2007 13:27:29 :
Debug de G_Fract.ReScale() et G_Fract.RenderToDisk(), ainsi qu'optimisation de cette dernière (économie d'une boucle imbriqué). Debug de la remarque de Neamar :). Test d'une image 12000x12000 : pas de plantage :D
15 avril 2007 19:31:56 :
- Réécriture de la routine de rendu vidéo AVI : suppression du bug de caméra et de palette, rajout d'une Form pour choisir la résolution. A la place de 4 subs éparpillés, il n'y en a plus qu'un, souple et évolutif. - Révision de l'interface : deux-trois boutons repositionnés. - Application du tweak de Renfield : calcul jusque 8% plus rapide.
15 mai 2007 12:23:02 :
- Revue de l'interface. - Revue du code d'export AVI, la synchro entre threads provoquait une erreur fatale. Une fenêtre spéciale propose les différentes résolutions possibles. - Séparation de la fenêtre de prévisu de la form de contrôle. Pratique pour des démos en bi-écran. - Ajout de la fonction rotation de palette (la fenêtre de prévisu dois avoir le focus). - Ajout de la "Zone ultime noire", souvent utilisé pour représenter le M-Set. - Légère optimisation de la vitesse de calcul pur. Il reste des traces de l'appel d'une DLL externe, avec un code optimisé fpu asm, mais les performances n'étaient pas significative par rapport au vb compilé. - Ajout de tooltiptext sur certains boutons pour aider l'utilisateur. - Revue du code de benchmark. comptez 30 millions d'itérations par seconde sur un cpu intel centrino ou core 2 à 2GHz.
03 juin 2007 00:45:13 :
- Recodage intégrale du rendu Buddhabrot, avec son interface revu. Il est possible de l'explorer : quand vous zoomez dans la fractale normale, les coordonnées du zoom sont conservé pour le rendu buddhabrot. Le rendu "standard" calcule les points aléatoires, le rendu "linéaire" utilise une grille de points défini. Il faut quitter le mode Buddhabrot pour l'exploration... - Ajout du "zoom arrière" : maintenez la touche Ctrl quand vous faite un clique gauche. - Ajout du "palette shifting" : dans la fenêtre de visu, maintenez la barre espace (spacebar) ou retour arrière (backspace) pour décaler l'ordre des couleurs de la palette. - Revu du calcul de la palette de couleur "logarithmique". - Revu de la mesure du benchmark. Si votre PC est trop puissant, le résultat se bloquait à 42 millions, limite dû à l'imprécision de la fonction Timer : bug corrigé.

Commentaires et avis

signaler à un administrateur
Commentaire de violent_ken le 11/03/2007 11:42:30

Je n'ai pas regardé le code, juste le résultat, mais c'est vraiment impressionant !

10/10
@+

signaler à un administrateur
Commentaire de neamar le 11/03/2007 14:14:13

Très utile, le module MatrixBuffer !

signaler à un administrateur
Commentaire de neamar le 11/03/2007 15:07:27

Après quelques test, programme vraiment génial !
Une interface graphique hyper rapide (jamais vu ca en Vb %-) , des fonctions pour les fractales optimisées...

Juste une remarque comme ca (parce que ca fait tâche sinon dans ce super code) : les deux variables de M_StartRender ne sont pas typées...

Et merci pour tout les commentaires !

signaler à un administrateur
Commentaire de Renfield le 14/03/2007 13:19:45 administrateur CS

pas mal !
code survollé...
fuite mémoire dans MatrixBuffer (StopRender)
   GetDC(0)
   non Releasé (ReleaseDC)


quelques cycles gagnés, en calculant r*r et i*i d'avance :
(j'ai également typé dx, dy, r, i & co)


Dim dx As Double, dy As Double
Dim r As Double, i As Double, ro As Double, io As Double, rt As Double
Dim r2 As Double, i2 As Double
Dim n As Long
Dim cl As Long
Dim xx As Long, yy As Long ', adv As Long
    Tracing = True

    dx = (XMax - XMin) / F_Width ' + XMin
    dy = (YMax - YMin) / F_Height ' + YMin
        
    ReDim FractBuf(1 To F_Width, 1 To F_Height)
    
    'suite mandelbrot
    'z.(n+1)=z.n^2-z.0
    'avec z.n tel que (z=a+i*b, i*i=-1)
    
    For xx = 1& To F_Width
        'dans le cas d'un dessin tramé, il vaux mieux utiliser la formule de localisation x,y
        'adv = adv + 1
        'xx = adv Mod F_Width
        'yy = Int(adv / F_Height)

        ro = dx * xx + XMin

    For yy = 1& To F_Height  
        io = dy * yy + YMin
        i2 = io * io
        r2 = ro * ro
        
        'en jouant sur r, on peux changer la forme initiale de la fractale (ro + 1, - 1, etc)
        r = ro
        i = io
        
        n = 0

        Do While ((r2 + i2) < F_Eloigne) And (n < F_Iter)

            rt = r2 - i2 + ro
            i = 2 * r * i + io
            r = rt
            r2 = r * r
            i2 = i * i
            
            n = n + 1
        Loop
        FractBuf(xx, yy) = n
    Next yy, xx
    
    Tracing = False
End Sub

signaler à un administrateur
Commentaire de Proger le 15/03/2007 01:46:08

Quel soucis du détail, Renfield :) Tu m'incites à revoir tout le code !

Le coup du GetDC(0) je me suis toujours demandé comment le releaser, vu que ça n'utilise pas GetDesktopWindow() je n'ai pas les params pour ReleaseDC() !

Pour l'autre remarque, le gain semble minime vu les courtes boucles, j'ai donc pas fait l'astuce... Cependant comme t'as fait la remarque, voici le résultat décompilé : on remplace une suite d'instructions asm fst/fld/fmul/fld/fmul/faddp/fcomp par un fxch/fstp/fxch/fadd/fcomp (test du while, en gros). On économise effectivement deux instructions, qui sont les fmul. Même si les fmul sont rapide avec les cpu moderne, c'est l'économie de deux cycles qui est intéressant.
Tiens d'ailleur je viens de voir que le i=2*r*i+io c'est en fait a=r*i puis i=a+a+io ... pas fou le compilateur :D

signaler à un administrateur
Commentaire de guillaume1136 le 04/10/2007 19:29:34

Je suis aussi sur un programme affichant des fractals de Mandelbrot et Julia mais en .NET, et je l'ai commencer dans le même esprit notamment celui de l'optimisation, pour ma part je ne suis pas encore aller fouiller dans le code ASM, mais j'ai déja banni le SetPixel qui afreusement lent pour utiliser une version réctifier de la source "GetPixel Très rapide" http://www.vbfrance.com/codes/GETPIXEL-TRES-RAPIDE_37145.aspx, problème : encore et toujour des bugs (problème du décalage des pixel résolue mais pas celui de "Memory Access Violation"), j'aimerai donc connaitre un moyen en VB.NET d'écrire et afficher directement à partir d'une même zone mémoire mémoire dans une fenètre.

De plus je suis preneur de tout algorithme different du mandelbrot classic, les maths et les complexes c'est pas mon fort et je suis imcapable de transformer une formule mathématique en algo. Or, sa cour pas la rue sur internet contrairement au formules.

signaler à un administrateur
Commentaire de Proger le 15/11/2007 14:56:04

Salut Guillaume1136, je n'ai pas de réponses pour .NET ...

Cependant la fameuse DLL ddraw.dll est certainement la réponse (c'est celle utilisé pour l'affichage vidéo/film, ca ne passe donc pas par le GDI:Get/SetPixel... mais ca écrit pratiquement directement dans la mémoire vidéo)

En VB6 c'est pratiquement inutilisable hélas. Peut-etre qu'en .NET c'est plus simple.

Question source, cherche directement dans la msdn online de microsoft, ca m'étonnerai qu'un code source ai jamais été publié en vb.net

Enfin, si tu cherches d'autres formules a modéliser, intéresse toi aux attracteurs étranges (clifford, etc). Le site de Paul Bourke fourni les fonctions mathématiques "prete à l'emploi" pour la programmation.

signaler à un administrateur
Commentaire de guillaume1136 le 15/11/2007 16:45:01 9/10

Salut Proger,

merci pour le tuyaux :), je vais me pencher sur cette DLL.
C'est vrai qu'on ne pence pas assez souvent à regarder directement dans MSDN, c'est un bon reflex, j'y avai pas pencé. lol
Et enfin merci pour le site c'est se que je cherchais.


Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Video [ par Nic ] Comment faire pour lire et affiché un fichier *.AVI en boucle lire une video qui se trouve dans un autre repertoire [ par drublic ] salut,j'ai mis un contrôle media player dans une de mes feuille, mais comment lui faire lire une vidéo qui se trouve dans un sous-repertoire.merci à t lancer une video [ par drublic ] salut, en fait j'aimerais que lorsque je lance ma video via mon soft.que media player affiche les menu du haut telque files(fichier) view(vues) etc... j'ai une erreur dans mon code [ par drublic ] salut, en fait je veux lancer une video via media player sans passer par un contrôle donc je fais ça mais media player ne trouve pas la video.Shell "C j'ai une erreur dans mon code [ par drublic ] salut, en fait je veux lancer une video via media player sans passer par un contrôle donc je fais ça mais media player ne trouve pas la video.Shell "C j'ai une erreur dans mon code [ par drublic ] salut, en fait je veux lancer une video via media player sans passer par un contrôle donc je fais ça mais media player ne trouve pas la video.Shell "C driver video info [ par purple ] j'aimerais savoir si il est possible en vb de recuperer le noms des fichiers du driver de la carte video et reseau?merci. Un zoom plus petit que dans la source de Joe Ace (#235) [ par WebMagique ] Peut-on faire un ZOOM plus petitque dans le code exemple de Joe Ace?http://www.vbfrance.com/index.asp?Val=235grand merci... video ds picture et mp3 [ par gustave ] comment faire pour centrer une video(avi ou mov, mpeg) dans une picture box ou alors la mettre a la taille de la picture meme question pour une image! video -codec/gif animé [ par Ninja ] Je voudrai savoir comment créer un avi,c'est t'a dire utilisation de codec etc...et aussi exiterai t'il une dll pour créer des gif animée....merci d'a


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