Explorateur fractale mandelbrot haute definition

Soyez le premier à donner votre avis sur cette source.

Vue 12 192 fois - Téléchargée 1 166 fois

Description

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 / Exemple :


'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!

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

guillaume1136
Messages postés
21
Date d'inscription
jeudi 10 novembre 2005
Statut
Membre
Dernière intervention
3 juin 2008

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.
Proger
Messages postés
248
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
19 décembre 2008

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.
guillaume1136
Messages postés
21
Date d'inscription
jeudi 10 novembre 2005
Statut
Membre
Dernière intervention
3 juin 2008

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.
Proger
Messages postés
248
Date d'inscription
vendredi 10 novembre 2000
Statut
Membre
Dernière intervention
19 décembre 2008

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
Renfield
Messages postés
17286
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
23 décembre 2019
60
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

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.