begin process at 2008 05 17 03:04:28
1 173 899 membres
32 nouveaux aujourd'hui
13 973 membres club

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 : 11/02/2007 16:22:21 Vu / téléchargé: 4 825 / 326

Note :
Aucune note

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


Description

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

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

Ajouter un commentaire

Discussions en rapport avec ce code source

Pb créer graphique Visual Basic Excel?? par jojo38

Moteur graphique TOUT SIMPLE par Alain Proviste

Math et graphique par guismo1er

Math et graphique par guismo1er

Math et graphique par guismo1er

Problème de math [matrice] par daddycool76

pb graphique excel par sobullshit

graphique special sous excel par dyeu

rotation directX par ad vitam aeternam

mschart couleur par mortha

Appels d'offres

Pub



CalendriCode

Mai 2008
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS