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 !

FRACTAL DE MANDELBROT


Information sur la source

Catégorie :Maths Source .NET ( DotNet ) Classé sous : fractal, mandelbrot, math, matrice, graphique Niveau : Débutant Date de création : 10/02/2007 Date de mise à jour : 05/11/2008 15:26:50 Vu / téléchargé: 6 320 / 353

Note :
Aucune note

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


Description

Cliquez pour voir la capture en taille normale
Le fractal de Mandelbrot est la visualisation d'un objet mathématique. Il s'agit en fait d'une matrice de nombres, où la valeur de chaque nombre est représentée par une couleur.
Chaque point de l'image est un nombre calculé par l'ordinateur selon une équation très simple: Zn+1 = Zn2 + C (pour plus d'informations, http://en.wikipedia.org/wiki/Mandelbrot_set).

Notez que pour optimiser le code, on peut écrire une méthode non-managée (dans un bloc unsafe) qui accélérerait considérablement la vitesse d'exécution (SetPixel n'étant pas des plus rapides...). Mais les performances en mode release sont suffisantes pour cette petite démos (moins d'une seconde).
 

Source

  • ''' ------------------------------------------------------------------------
  • ''' <summary>
  • ''' Draw the fractal.
  • ''' </summary>
  • ''' <remarks> For more performance, use unmanaged code [unsafe]. </remarks>
  • ''' ------------------------------------------------------------------------
  • Public Sub DraMandelbrotFractal()
  • Using gfx As Graphics = Me.CreateGraphics()
  • Me._bmpBuffer = New Bitmap(Me.Width, Me.Height, gfx)
  • Dim halfX As Integer = 2 * Me._bmpBuffer.Width / 3
  • Dim halfY As Integer = Me._bmpBuffer.Height / 2
  • Dim i As Integer, j As Integer = 0
  • For j = 0 To Me.Height - 1
  • For i = 0 To Me.Width - 1
  • Dim complex As Complex = New Complex((i - halfX) / 150D, (j - halfY) / 150D)
  • Me._bmpBuffer.SetPixel(i, j, Me.GetColor(Me.GetStep(complex)))
  • Next
  • Next
  • Graphics.FromImage(Me._bmpBuffer).DrawString("Mandelbrot's Fractal", Me._font, Me._fontBrush, Point.Empty)
  • gfx.DrawImage(Me._bmpBuffer, Point.Empty)
  • End Using
  • End Sub
    ''' ------------------------------------------------------------------------
    ''' <summary>
    ''' Draw the fractal.
    ''' </summary>
    ''' <remarks> For more performance, use unmanaged code [unsafe]. </remarks>
    ''' ------------------------------------------------------------------------
    Public Sub DraMandelbrotFractal()
        Using gfx As Graphics = Me.CreateGraphics()
            Me._bmpBuffer = New Bitmap(Me.Width, Me.Height, gfx)
            Dim halfX As Integer = 2 * Me._bmpBuffer.Width / 3
            Dim halfY As Integer = Me._bmpBuffer.Height / 2
            Dim i As Integer, j As Integer = 0

            For j = 0 To Me.Height - 1
                For i = 0 To Me.Width - 1
                    Dim complex As Complex = New Complex((i - halfX) / 150D, (j - halfY) / 150D)
                    Me._bmpBuffer.SetPixel(i, j, Me.GetColor(Me.GetStep(complex)))
                Next
            Next

            Graphics.FromImage(Me._bmpBuffer).DrawString("Mandelbrot's Fractal", Me._font, Me._fontBrush, Point.Empty)
            gfx.DrawImage(Me._bmpBuffer, Point.Empty)
        End Using
    End Sub

Conclusion

Pour une version C# avec code unmanaged (pointeur): http://www.csharpfr.com/code.aspx?ID=41443
 

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

10 février 2007 22:20:29 :
Corrections dans la description
11 février 2007 11:51:29 :
Ajout "explication finale"
11 février 2007 16:22:21 :
Petite modif'...
05 novembre 2008 15:26:51 :
Ortho

Commentaires et avis

signaler à un administrateur
Commentaire de jesusonline le 11/02/2007 01:21:03 administrateur CS

Voici une version non managé :

    ''' ------------------------------------------------------------------------
    ''' <summary>
    ''' Draw the fractal.
    ''' </summary>
    ''' <remarks> For more performance, use unmanaged code [unsafe]. </remarks>
    ''' ------------------------------------------------------------------------
    Public Sub DraMandelbrotFractal()
        Dim gfx As Graphics = Me.CreateGraphics()
        Me._bmpBuffer = New Bitmap(Me.Width, Me.Height, gfx)

        Dim halfX As Integer = 2 * Me._bmpBuffer.Width / 3
        Dim halfY As Integer = Me._bmpBuffer.Height / 2
        Dim i As Integer, j As Integer = 0

        Dim bmpData As Imaging.BitmapData = Me._bmpBuffer.LockBits(New Rectangle(0, 0, width, Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
        Dim newPixel(width * height - 1) As Integer
        Marshal.Copy(bmpData.Scan0, newPixel, 0, newPixel.Length)
        For j = 0 To Me.Height - 1
            For i = 0 To Me.Width - 1
                Dim complex As Complex = New Complex((i - halfX) / 150D, (j - halfY) / 150D)

                Dim temp As Integer = newPixel(Me.Width * j + i)
                newPixel(Me.Width * j + i) = Me.GetColor(Me.GetStep(complex)).ToArgb()

            Next
        Next

        Marshal.Copy(newPixel, 0, bmpData.Scan0, newPixel.Length)
        Me._bmpBuffer.UnlockBits(bmpData)
        Graphics.FromImage(Me._bmpBuffer).DrawString("Mandelbrot's Fractal", Me._font, Me._fontBrush, Point.Empty)
        gfx.DrawImage(Me._bmpBuffer, Point.Empty)
    End Sub


Pour en savoir plus il faut lire http://www.techheadbrothers.com/Articles.aspx?Id=8d3eb481-8a98-42a6-8033-e851c797aa60&p=3

signaler à un administrateur
Commentaire de badrbadr le 11/02/2007 03:11:39

Dit moi Bidou, depuis quand tu code en vb.net?
On va te voir quand même sur csharpfr hein, rassure moi :)

signaler à un administrateur
Commentaire de Bidou le 11/02/2007 09:46:39 administrateur CS

Cyril> Oui, en fait je pensais à un bloc unsafe (que j'ai écrit et qui marche) mais les couleurs ne joue plus tout à fait. J'ai pas encore regardé en détail pourquoi... mais je vais certainement trouvé la réponse dans ce très bon article dont tu as donné le lien.

Badr> Aucun risque, après utilisation et comparaison des deux, je me sens nettement plus à l'aise avec C# (et il n'a jamais été question d'arrêter C#) :-p

signaler à un administrateur
Commentaire de BruNews le 11/02/2007 17:23:56 administrateur CS

unsafe ok
'unmanaged' n'indiquerait pas un bloc de code en NATIF ? C'est le cas en C++ .NET, bizzare si les mots n'ont plus le même sens d'un sabir l'autre.
S'il a le même sens, me semble impossible d'avoir 'unmanaged' en VB comme en C#, je ne vois d'ailleurs que de l'interprété dans le code.

signaler à un administrateur
Commentaire de Bidou le 11/02/2007 17:49:08 administrateur CS

C'est pas de "l'unmanaged", mais de "l'unmanaged .NET" là est certainement la différence...
http://vivekthangaswamy.blogspot.com/2006/11/unsafe-code-in-c.html

Le code de JesusOnline n'est pas directement unmanaged .NET à mon sens car il ne fait pas intervenir de bloc unsafe.
Voici le code que j'ai fait en C# que j'appelerais unmanaged (.NET) :

unsafe
{
  byte* newPixel = (byte*)(void*)bmpData.Scan0;
  for (int y = 0; y < height; ++y)
  {
     for (int x = 0; x < width; x += 3)
     {
        Color color = XXX;
        newPixel[0] = color.B;
        newPixel[1] = color.G;
        newPixel[2] = color.R;
        newPixel += 3;
     }
     newPixel += offset;
   }
}

signaler à un administrateur
Commentaire de BruNews le 11/02/2007 17:58:46 administrateur CS

Il y aurait donc bien des sens différents selon le sabir employé.
Pourrais-tu nous indiquer si cette ligne
byte* newPixel = (byte*)(void*)bmpData.Scan0;
passerait dans un bloc unmanaged en C++ .net, me semblait qu'il ne devait y avoir que du natif dans ces blocs.

signaler à un administrateur
Commentaire de jesusonline le 11/02/2007 17:58:47 administrateur CS

Marshal copy et lock bits sont des méthodes unmanaged (au sens .net) par conséquent mon code est unmanaged :-)

A ma connaissane on ne peut pas utiliser les pointeurs en VB ... :-( donc on peut pas faire la meme chose mais je suis curieux de voir la différence de perf entre C# et VB.net et la méthode MSIL que TKfé a posté sur son blog ...

signaler à un administrateur
Commentaire de Bidou le 11/02/2007 19:13:06 administrateur CS

BruNews> Alors j'ai donné un coup de Reflector sur cette méthode et voici comment il a converti
Mon code C#:
byte* newPixel = (byte*)(void*)bmpData.Scan0;

en C++.NET:
System::Byte __gc** numPtr1 = *static_cast<__box System::Byte __gc***>(data1->Scan0);

Donc apparement ça devrait être faisable en C++.NET aussi dans un bloc unsafe (ceci dit, je n'ai pas testé).

signaler à un administrateur
Commentaire de BruNews le 11/02/2007 19:26:46 administrateur CS

oh la misère, faut avoir tué père et mère pour se taper cette syntaxe.
C'est tellement plus simple à écrire en vrai C avec en plus de bien meilleures perfs et aucun setup, j'espère que le blaireau qui a incité MS à prendre le terme "C++" en dotnetterie aura depuis été affecté à tondre la pelouse.
Merci pour les infos.

signaler à un administrateur
Commentaire de jesusonline le 11/02/2007 19:35:00 administrateur CS

Oui mais attention ! Reflector prend le MSIL est ensuite tente de convertir ca dans un autre langage ... Quand on utilise des fonctionnalités un poil tricky Reflector a tendance à générer un peu n'importe quoi, je suis sur qu'il te sort qqchose si tu lui dis de générer du VB.net et je doute que cela compile.

Ce qui faut regarder c'est surtout la partie IL : l'assembleur des langages interprété .net (aussi bien VB.net, C#, C++.net, ...)

(vi j'aime bien faire raler brunews :-))

signaler à un administrateur
Commentaire de BruNews le 11/02/2007 19:41:46 administrateur CS

"assembleur" a déjà une signification pour le commun dev dont je fais partie:
- mise au format humain des opcodes directement exécutables par le cpu.

Toutes ces usurpations de langage ne devraient pas berner grand monde.

"l'assembleur des langages interprété", voila bien une suite de mots dont chaque suivant contredit le précédent.

signaler à un administrateur
Commentaire de Bidou le 11/02/2007 19:44:36 administrateur CS

Pour le code VB il m'a généré ceci:
Dim numPtr1 As Byte* = DirectCast(data1.Scan0, Byte*)

Ce qui semble étonnant étant donné que d'après toi on ne peut pas utiliser les pointeurs en VB.NET.
Ce qui est sûr c'est que ce qui est généré par Reflector est à prendre avec des pincettes...

Pour revenir à la question de savoir si on n'est obligé de mettre du code natif dans un bloc unsafe en C++.NET, je dirais que non : http://www.springerlink.com/content/h4092285755hu473/

signaler à un administrateur
Commentaire de BruNews le 11/02/2007 19:50:21 administrateur CS

ok Bidou, j'avais bien noté avec ta réponse plus haut au vu de data1->Scan0.

signaler à un administrateur
Commentaire de guillaume1136 le 20/05/2008 17:16:21

comme dans ce coin on parle assembleur (ou on parlait...).
Il me vien une question.

En C++.Net unsafe produit t'il du code IL ou du code natif?

La r?ponse semble a priorie ?tre non, puisse que l'on peut utilis? des objet manag?,
donc il y a utilisation de Handle, donc vraisembleblement on passe par la machine virtuel .Net, donc vraisemblement par le code IL.

Et une deuxi?me question me vien, en C++.Net toujours, les bloc _asm quand ? eux,
en quoi sont il compil? ?

Une traduction de l'assembleur en IL (si c'est possible), ou directement de l'assembleur non manag?.

signaler à un administrateur
Commentaire de EBArtSoft le 20/05/2008 22:40:33 administrateur CS

Voila ce que je propose :

    Private Structure ARGB
        Dim r As Byte
        Dim g As Byte
        Dim b As Byte
        Dim a As Byte
    End Structure

    Private Declare Ansi Sub Copy Lib "kernel32" Alias "RtlMoveMemory" (ByVal memTo As Integer, ByRef memFrom As ARGB, ByVal Length As Integer)

    Public Sub DraMandelbrotFractal()

        'Me.Width = ((Me.Width + 3) And Not 3) 'Seulement pour 24Bits RGB

        Static _Width As Integer = Me.Width
        Static _Height As Integer = Me.Height
        Static halfX As Integer = _Width * 2 / 3
        Static halfY As Integer = _Height * 0.5
        Static siz As Integer = _Width * _Height * 4
        Static z1 As Single = 1 / Me._depth * 64
        Static z2 As Single = 1 / Me._depth * 255
        Static StepX As Integer = 0

        Dim Pixels(_Height - 1, _Width - 1) As ARGB
        For j As Integer = 0 To (_Height - 1)
            For i As Integer = 0 To (_Width - 1)
                stepx = Me.GetStep(New Complex((i - halfX) / 150D, (j - halfY) / 150D))
                If (stepx > 0) Then
                    With Pixels(j, i)
                        .a = 255
                        .r = z1 * stepx
                        .b = z2 * stepx
                    End With
                End If
            Next
        Next

        Me._bmpBuffer = New Bitmap(_Width, _Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
        Dim bmpData As Imaging.BitmapData = Me._bmpBuffer.LockBits(New Rectangle(0, 0, _Width, _Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
        'Marshal.Copy(NewPixel, 0, bmpData.Scan0, NewPixel.Length)
        Copy(bmpData.Scan0, Pixels(0, 0), siz)
        Me._bmpBuffer.UnlockBits(bmpData)

        Graphics.FromImage(Me._bmpBuffer).DrawString("Mandelbrot's Fractal", Me._font, Me._fontBrush, Point.Empty)
        Me.CreateGraphics().DrawImage(Me._bmpBuffer, Point.Empty)

    End Sub

Apres difficile de faire mieu sans changer le comportement des autres methodes dont celles qui prennent le plus de temps : Complexe et GetStep

Et puis on pourrais creer le bitmap au moment de l'initialisation et pas a chaque fois, bref l'optimisation peut ce faire un peu partout.

@+

signaler à un administrateur
Commentaire de EBArtSoft le 20/05/2008 22:41:36 administrateur CS

Et encore... il y a trop de "New" à mon gout !

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Pb créer graphique Visual Basic Excel?? [ par jojo38 ] Salut à toi internaut!!, tout d'abord merci d'avoir choisi de jeter un ptit coup d'oeil sur mon message car j'ai un vrai problème qui doit être élluci Moteur graphique TOUT SIMPLE [ par Alain Proviste ] Salut les gens.Bien, je demande votre aide, simple, je veux juste qu'on me guide un tout petit peu parce que j'ai du mal à savoir par où commencer.Sim Math et graphique [ par guismo1er ] Salut tout le monde, vous me connaissez surement pas.J'ai fait du PHP, Html, Javascript, Sql, Asp (un peu). et je me suis mis au Visual Basic.Je suis Math et graphique [ par guismo1er ] Salut tout le monde, vous me connaissez surement pas.J'ai fait du PHP, Html, Javascript, Sql, Asp (un peu). et je me suis mis au Visual Basic.Je suis Math et graphique [ par guismo1er ] Salut tout le monde, vous me connaissez surement pas.J'ai fait du PHP, Html, Javascript, Sql, Asp (un peu). et je me suis mis au Visual Basic.Je suis Problème de math [matrice] [ par daddycool76 ] Bonjour, je suis une bouse en math, j'ai un problème que je n'arrive pas à résoudre.Mon prog me donne une série d'équations (de degrés un) qui peuvent pb graphique excel [ par sobullshit ] nom = yopwk.Name        yopwk.Select        Charts.Add        ActiveChart.ChartType = xlXYScatterSmoothNoMarkers        ActiveChart.SeriesCollection.N graphique special sous excel [ par dyeu ] sous excelJe me demande comment retenir la valeur d'une cellule variant chaque jour pour suivre son évolution avec un rotation directX [ par ad vitam aeternam ] Bonjour à tous!Voici ma question; en directX, je programme la rotation de ma caméra mais celle-ci tourne selon l'axe passant par les points de ses axe mschart couleur [ par mortha ] Bonjour je sais qui a deja quelque texte sur sa sur le site mais je comprend pas plus :( Alorsj e travail sur un programme qui doit afficher des graph


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