Batch Index du Forum
S’enregistrerRechercherFAQMembresGroupesConnexion
Répondre au sujet Page 1 sur 1
[R] Fractale de Mandelbrot
Auteur Message
Répondre en citant
Message [R] Fractale de Mandelbrot 
Bonjour, moz_smile

Après avoir vu le post de sablier94, j'ai décidé de m'intéresser aux fractales avec Autoit. J'ai trouvé un code sur internet qui produit l'ensemble de Mandelbrot, l'une des fractales les plus célèbres.
J'ai donc essayer de l'améliorer.

Le voici :

Code:
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Fractale de Mandelbrot par Matcarto", 501, 501, -1, -1)
GUISetBkColor(0x000000)
GUISetState(@SW_SHOW) ;Création de la GUI
GUISetOnEvent($GUI_EVENT_CLOSE,"quit")

$user32 = DllOpen("user32.dll")
$gdi32 = DllOpen("gdi32.dll")

$start = TimerInit() ;Démarrage d'un timer
Mandelbrot() ;Appelle de la focntion Mandelbrot
MsgBox(64,"Temps écoulé:",TimerDiff($start)/1000 &" secondes") ;Temps écoulé depuis le début du Timer

While 1
    Sleep(1000) ;Pour éviter que la fenêtre ne se ferme après la msgbox
WEnd

Func quit()
    Exit
EndFunc

Func pix($dc,$x,$y,$color)
    DllCall ($gdi32, "long", "SetPixel", "long", $dc, "long", $x, "long", $y, "long", $color)
EndFunc

Func GetDC($handle)
    $dc = DllCall ($user32, "int", "GetDC", "hwnd", $handle)
    Return $dc[0]
EndFunc

Func Mandelbrot()
    $dc = GetDC(WinGetHandle($Form1))

    $largeur = 500
    $hauteur = 500
    $maxiteration = 30

    for $py = 0 to $hauteur step 1
        for $px = 0 to $largeur Step 1
            $x0 = (4/$largeur)*$px-2
            $y0 = (4/$hauteur)*$py-2
            $x = $x0
            $y = $y0
            $iteration = 0

            While (($x*$x + $y*$y) < 4  AND  $iteration < $maxiteration)
                $xtemp = $x*$x - $y*$y + $x0
                $y = 2*$x*$y + $y0
                $x = $xtemp
                $iteration+= 1
            WEnd
            pix($dc,$px,$py,($iteration/$maxiteration)*0xff) ;C'est cette ligne qui détermine la couleur des pixels
        Next
    Next
EndFunc


Ce qui produit ceci :




Je ne vous cache pas que je ne le comprends pas encore entièrement car il n'était pas du tout commenté...

J'aimerais maintenant pouvoir modifié la couleur de la fractale qui s'affiche actuellement en rouge. Je pense qu'il faut modifié le "0xff" en "0xLECODEHEXADELACOULEUR" mais voici ce qui se passe lorsque je modifie cette ligne avec "0x00ff00" par exemple :



Le "contour" de la fractale reste rouge... moz_frown


Pouvez-vous m'aider ? moz_embarassed



Dernière édition par matcarto le Ven 19 Aoû 2011 - 11:22; édité 1 fois
Message Publicité 
PublicitéSupprimer les publicités ?


Répondre en citant
Message Re: [?] Fractale de Mandelbrot 
hello!

C'est assez complexe ... d'ailleurs ça utilise les ensembles complexes Mort de Rire

on part du principe qu'un plan est un ensemble de points représentés chacun par un nombre complexe P = (a+bi)

a est l'absice du point (x)
b est l'ordonée du point (y)

la fractale(ou ensemble) de Mendelbrot est composée de l'ensemble des points P de C pour lesquels la suite suivante ne tend pas vers l'infini en module:

Un+1=Un²+P

en principe on prend un nombre x comme limite, la fractale est alors l'ensemble des points pour lesquels le module de la suite ne dépasse pas 2...

voici un exellent tuto pour lequel tu n'as pas besoin de notions mathématiques avancéés http://www.siteduzero.com/tutoriel-3-344309-dessiner-la-fractale-de-mandelbrot.html

@+




______________________________________________________
--
> Que pensez vous de l'ajout du repertoire point dans $PATH ?
Ma version de troll 18.0.32 beta 3 vient de me faire un core dump.
-+- SE in Guide du Linuxien Pervers : Bien développer son troll -+-

[Dos9]
Visiter le site web du posteur Skype
Répondre en citant
Message [R] Fractale de Mandelbrot 
Salut,

Au fait le problème c'est que tu ne peux pas choisir la couleur du tour et celle du milieu car elles dépendent l'une de l'autre à cause de l'algorithme non ?

Dans ce cas tu ne peux pas faire grand chose je pense... moz_undecided

A+




______________________________________________________
Répondre en citant
Message [R] Fractale de Mandelbrot 
Salut, merci de ta réponse. Smile

Ca a l'air hyper technique !! moz_frown Un peu trop pour mon niveau je crois...


@Sablier94 : C'est possible de les rendre indépendantes l'une de l'autre ? moz_embarassed



Répondre en citant
Message [R] Fractale de Mandelbrot 
Non vu que la couleur est définie comme ceci :
Code:
($iteration/$maxiteration)*0xff


Tu peux tester si tu trouve ce que tu veux en changeant le calcul qui détermine la couleur mais moi j'ai pas trouvé.
Exemple parmi tant d'autres :
Code:
$maxiteration/$y*0xff


Donc la réponse pour moi serait non... moz_frown

++




______________________________________________________
Répondre en citant
Message [R] Fractale de Mandelbrot 
hello !

moi je trouve que l'auréole va vachement bien avec la factale Mort de Rire

mais sinon tu peux faire un if après la boucle je crois:
Code:
IF $iteration=$maxiteration pix($dc,$px,$py,$couleur) ;C'est cette ligne qui détermine la couleur des pixels


je suis pas du tout sur de ma syntaxe mais je pense qu'on comprend l'idée

@+




______________________________________________________
--
> Que pensez vous de l'ajout du repertoire point dans $PATH ?
Ma version de troll 18.0.32 beta 3 vient de me faire un core dump.
-+- SE in Guide du Linuxien Pervers : Bien développer son troll -+-

[Dos9]
Visiter le site web du posteur Skype
Répondre en citant
Message [R] Fractale de Mandelbrot 
La syntaxe correcte est :
Code:
If $iteration=$maxiteration Then pix($dc,$px,$py,$couleur) ;C'est cette ligne qui détermine la couleur des pixels


Mais même avec ça j'ai pas réussi, faut le placer où ?




______________________________________________________
Répondre en citant
Message [R] Fractale de Mandelbrot 
Moi je la mettrai a la place de la lgine qui régit les pixels

Code:
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Fractale de Mandelbrot par Matcarto", 501, 501, -1, -1)
GUISetBkColor(0x000000)
GUISetState(@SW_SHOW) ;Création de la GUI
GUISetOnEvent($GUI_EVENT_CLOSE,"quit")

$user32 = DllOpen("user32.dll")
$gdi32 = DllOpen("gdi32.dll")

$start = TimerInit() ;Démarrage d'un timer
Mandelbrot() ;Appelle de la focntion Mandelbrot
MsgBox(64,"Temps écoulé:",TimerDiff($start)/1000 &" secondes") ;Temps écoulé depuis le début du Timer

While 1
    Sleep(1000) ;Pour éviter que la fenêtre ne se ferme après la msgbox
WEnd

Func quit()
    Exit
EndFunc

Func pix($dc,$x,$y,$color)
    DllCall ($gdi32, "long", "SetPixel", "long", $dc, "long", $x, "long", $y, "long", $color)
EndFunc

Func GetDC($handle)
    $dc = DllCall ($user32, "int", "GetDC", "hwnd", $handle)
    Return $dc[0]
EndFunc

Func Mandelbrot()
    $dc = GetDC(WinGetHandle($Form1))

    $largeur = 500
    $hauteur = 500
    $maxiteration = 30

    for $py = 0 to $hauteur step 1
        for $px = 0 to $largeur Step 1
            $x0 = (4/$largeur)*$px-2
            $y0 = (4/$hauteur)*$py-2
            $x = $x0
            $y = $y0
            $iteration = 0

            While (($x*$x + $y*$y) < 4  AND  $iteration < $maxiteration)
                $xtemp = $x*$x - $y*$y + $x0
                $y = 2*$x*$y + $y0
                $x = $xtemp
                $iteration+= 1
            WEnd
If $iteration=$maxiteration Then pix($dc,$px,$py,$couleur) ;C'est cette ligne qui détermine la couleur des pixels
        Next
    Next
EndFunc


sinon je vois pas comment faire Sad

@+




______________________________________________________
--
> Que pensez vous de l'ajout du repertoire point dans $PATH ?
Ma version de troll 18.0.32 beta 3 vient de me faire un core dump.
-+- SE in Guide du Linuxien Pervers : Bien développer son troll -+-

[Dos9]
Visiter le site web du posteur Skype
Répondre en citant
Message [R] Fractale de Mandelbrot 
Désolé, j'étais pas chez moi hier... moz_smile Merci à vous deux !!

J'ai réussi avec ton code DarkBatcher !! moz_laughing

Code:
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Fractale de Mandelbrot par Matcarto", 501, 501, -1, -1)
GUISetBkColor(0x000000)
GUISetState(@SW_SHOW) ;Création de la GUI
GUISetOnEvent($GUI_EVENT_CLOSE,"quit")

$user32 = DllOpen("user32.dll")
$gdi32 = DllOpen("gdi32.dll")

Global $color

$start = TimerInit() ;Démarrage d'un timer
Mandelbrot() ;Appelle de la focntion Mandelbrot
MsgBox(64,"Temps écoulé:",TimerDiff($start)/1000 &" secondes") ;Temps écoulé depuis le début du Timer

While 1
    Sleep(1000) ;Pour éviter que la fenêtre ne se ferme après la msgbox
WEnd

Func quit()
    Exit
EndFunc

Func pix($dc,$x,$y,$color)
    DllCall ($gdi32, "long", "SetPixel", "long", $dc, "long", $x, "long", $y, "long", $color)
EndFunc

Func GetDC($handle)
    $dc = DllCall ($user32, "int", "GetDC", "hwnd", $handle)
    Return $dc[0]
EndFunc

Func Mandelbrot()
    $dc = GetDC(WinGetHandle($Form1))

    $largeur = 500
    $hauteur = 500
    $maxiteration = 30

    for $py = 0 to $hauteur step 1
        for $px = 0 to $largeur Step 1
            $x0 = (4/$largeur)*$px-2
            $y0 = (4/$hauteur)*$py-2
            $x = $x0
            $y = $y0
            $iteration = 0

            While (($x*$x + $y*$y) < 4  AND  $iteration < $maxiteration)
                $xtemp = $x*$x - $y*$y + $x0
                $y = 2*$x*$y + $y0
                $x = $xtemp
                $iteration+= 1
            WEnd
If $iteration=$maxiteration Then pix($dc,$px,$py,0x00ff00) ;C'est cette ligne qui détermine la couleur des pixels
        Next
    Next
EndFunc



On peut remplacer 0x00ff00 par la couleur qu'on veut. moz_smile

En revanche, à cause de la condition, seuls les pixels se trouvant à l'intérieur de la fractale sont marqués. Est-il possible de conserver le dégradé autour de la fractale ? moz_laughing



Répondre en citant
Message [R] Fractale de Mandelbrot 
Bah non, justement...




______________________________________________________
Répondre en citant
Message [R] Fractale de Mandelbrot 
Ok, c'est pas grave. moz_smile Merci. moz_wink



Répondre en citant
Message [R] Fractale de Mandelbrot 
matcarto a écrit:
Code:
#include <GUIConstants.au3>

Opt("GUIOnEventMode", 1)
$Form1 = GUICreate("Fractale de Mandelbrot par Matcarto", 501, 501, -1, -1)
GUISetBkColor(0x000000)
GUISetState(@SW_SHOW) ;Création de la GUI
GUISetOnEvent($GUI_EVENT_CLOSE,"quit")

$user32 = DllOpen("user32.dll")
$gdi32 = DllOpen("gdi32.dll")

Global $color

$start = TimerInit() ;Démarrage d'un timer
Mandelbrot() ;Appelle de la focntion Mandelbrot
MsgBox(64,"Temps écoulé:",TimerDiff($start)/1000 &" secondes") ;Temps écoulé depuis le début du Timer

While 1
    Sleep(1000) ;Pour éviter que la fenêtre ne se ferme après la msgbox
WEnd

Func quit()
    Exit
EndFunc

Func pix($dc,$x,$y,$color)
    DllCall ($gdi32, "long", "SetPixel", "long", $dc, "long", $x, "long", $y, "long", $color)
EndFunc

Func GetDC($handle)
    $dc = DllCall ($user32, "int", "GetDC", "hwnd", $handle)
    Return $dc[0]
EndFunc

Func Mandelbrot()
    $dc = GetDC(WinGetHandle($Form1))

    $largeur = 500
    $hauteur = 500
    $maxiteration = 30

    for $py = 0 to $hauteur step 1
        for $px = 0 to $largeur Step 1
            $x0 = (4/$largeur)*$px-2
            $y0 = (4/$hauteur)*$py-2
            $x = $x0
            $y = $y0
            $iteration = 0

            While (($x*$x + $y*$y) < 4  AND  $iteration < $maxiteration)
                $xtemp = $x*$x - $y*$y + $x0
                $y = 2*$x*$y + $y0
                $x = $xtemp
                $iteration+= 1
            WEnd
            If $iteration=$maxiteration Then
                pix($dc,$px,$py,0x00ff00) ;C'est cette ligne qui détermine la couleur des pixels
            Else
                pix($dc,$px,$py, ($iteration/$maxiteration) * 0x00ff00) ;C'est cette ligne de l'auréole
            EndIf
        Next
    Next
EndFunc





On peut remplacer 0x00ff00 par la couleur qu'on veut. moz_smile

En revanche, à cause de la condition, seuls les pixels se trouvant à l'intérieur de la fractale sont marqués. Est-il possible de conserver le dégradé autour de la fractale ? moz_laughing




Oui, voir correction. (If / Else)




Zoupla, ninja-edit : pas vu la date du poste. 1 an plus tard, ok...



Visiter le site web du posteur
Répondre en citant
Message [R] Fractale de Mandelbrot 
Hello !

Le up du m'a fait pensé à une nouvelle chose, vu que me niveau en maths c'est considérablement accru depuis l'année dernière et en info aussi.
Donc en fait voilà ce qui se passe :

C'est donc une histoire de suite. Le comportement qu'on obtient la première fois est est tout à fait normal.
En effet , le dégradé est représentatif de la vitesse de divergence de la suite dont j'ai parlé plus haut.

Dans la source on trouve la formule
Code:
[lang=autoit]$iteration/$iterationMax*$couleur


$itération est le nombre de boucles faites avant de quitter (donc plus c'est faible et plus ça diverge violemment (ou "sauvagement" comme dirait mon prof de maths Mort de Rire))
D'un autre coté on comprends bien donc que $iteration/$iterationMax devient de plus en plus petit, quand $iteration devient grand. Donc quand la couleur quand on s'éloigne la couleur devient de plus en plus foncée, car plus on s'éloigne de la fractale et plus les suites divergent rapidement, ce qui crée un dégradé autour de la fractale. Ca, ça marche uniquement puisque la couleur rouge est le 0x0000FF (moi aussi je comprends pas trop pourquoi c'est comme ça et pas 0xff0000 m'enfin Mr. Green) puisque quand ça devient très petit, on ne change pas de couleur, ça ne peux pas déborder)

maintenant, si on utilise le vert (0x00ff00), on peut très facilement trouver un moyen pour que la couleur "déborde" sur déborde sur le rouge ... si on fait 1/$iterationMax*0x00FF00 on obtient : 0x880

Et il se trouve que c'est du rouge légèrement vert, ce qui correspond aux observations




______________________________________________________
--
> Que pensez vous de l'ajout du repertoire point dans $PATH ?
Ma version de troll 18.0.32 beta 3 vient de me faire un core dump.
-+- SE in Guide du Linuxien Pervers : Bien développer son troll -+-

[Dos9]
Visiter le site web du posteur Skype
Répondre en citant
Message [R] Fractale de Mandelbrot 
Oui, enfin, vu que $iteration/$maxiteration est censé avoir un effet direct sur le rendu de la couleur, il arrive que le vert influe sur le rouge.
En effet, lorsque $iteration est à 1 sur 30, le vert (0x100+) devient du rouge (0x100-), et c'est pour cette raison que parfois l'aura a une très jolie couleur (quand $maxiteration est à 15), et d'autres fois ça rend n'importe-quoi (presque toutes les autres valeurs pour $maxiteration sauf 255).
Bref, je suis d'accord avec toi.

Mais bon, vu que j'aime pas les trucs qui ne vont pas comme je veux, cadeau :

Code:
#include <GUIConstants.au3>
Opt("GUIOnEventMode", 1)

Global $user32 = DllOpen("user32.dll"), $gdi32 = DllOpen("gdi32.dll"), _
   $winw = 400, $winh = 400, _ ;Taille de la fenêtre affichée (sera aussi la taille de la zone de dessin interne)
   $Form1 = GUICreate("Fractale de Mandelbrot par Matcarto", $winw + 1, $winh + 1, -1, -1)

GUISetBkColor(0xFFFFFF) ;Couleur du fond.
GUISetState(@SW_SHOW) ;Création de la GUI
GUISetOnEvent($GUI_EVENT_CLOSE, "quit")


;start = TimerInit() ;Démarrage d'un timer
Mandelbrot() ;Appelle de la fonction Mandelbrot
;MsgBox(64, "Temps écoulé:", TimerDiff($start) / 1000 & " secondes") ;Temps écoulé depuis le début du Timer

While 1
   Sleep(1000) ;Pour éviter que la fenêtre ne se ferme après la msgbox
WEnd

Func quit()
   GUIDelete($Form1)
   Exit
EndFunc   ;==>quit

Func pix($dc, $color = 0x000000, $x = 0, $y = 0)
   DllCall($gdi32, "long", "SetPixel", "long", $dc, "long", $x, "long", $y, "long", $color)
EndFunc   ;==>pix

Func GetDC($handle)
   $dc = DllCall($user32, "int", "GetDC", "hwnd", $handle)
   Return $dc[0]
EndFunc   ;==>GetDC

Func Mandelbrot()
   Local $dc = GetDC(WinGetHandle($Form1)), $largeur = $winw, $hauteur = $winh, $couleur, _
      $rouge_coeur = 255, $vert_coeur = 127, $bleu_coeur = 127, _ ;Couleur du coeur (pensez à décommenter quelques lignes plus bas pour prendre en compte)
      $rouge_aura = 255, $vert_aura = 0, $bleu_aura = 0, _
      $maxiteration = 31 ;Maximum 0xFF (255) ?

   For $py = 0 To $hauteur Step 1
      For $px = 0 To $largeur Step 1
         $x0 = (4 / $largeur) * $px - 2
         $y0 = (4 / $hauteur) * $py - 2
         $x = $x0
         $y = $y0
         $iteration = 0

         While (($x * $x + $y * $y) <= 4 And $iteration < $maxiteration)
            $xtemp = $x ^ 2 - $y ^ 2 + $x0 ;Mémo : $x ^ 2 - $y ^ 2 + $x0
            $y = 2 * $x * $y + $y0
            $x = $xtemp
            ;If $iteration <> $maxiteration Then pix($dc, $px, $py, 0xFF00FF) ;Ligne en cours d'affichage. (Éviter de l'utiliser.)
            $iteration += 1
         WEnd
         
         $couleur = 0
;~          If $iteration = $maxiteration Then ;Pour changer la couleur du coeur, décommenter cette ligne
;~             $couleur += 1 * $rouge_coeur * 0x1 ;cette ligne
;~             $couleur += 1 * $vert_coeur * 0x100 ;cette ligne
;~             $couleur += 1 * $bleu_coeur * 0x10000 ;cette ligne
;~          Else ;Pour l'auréole ;cette ligne
            $couleur += Min(Int($iteration/$maxiteration * $rouge_aura), 255) * 0x1 ;Ne pas dépasser 0x....FF (rouge)
            $couleur += Min(Int($iteration/$maxiteration * $vert_aura), 255) * 0x100 ;Ne pas dépasser 0x..FF.. (vert)
            $couleur += Min(Int($iteration/$maxiteration * $bleu_aura), 255) * 0x10000 ;Ne pas dépasser 0xFF.... (bleu)
;~          EndIf ;et cette ligne
         pix($dc, $couleur, $px, $py) ;C'est cette ligne qui affiche les pixels
      Next
   Next
EndFunc   ;==>Mandelbrot

Func Min($a, $b)
   If $a > $b Then Return $b
   Return $a
EndFunc

Possible de changer $maxiteration avec la valeur voulue, sachant que plus elle est élevée, et plus le rendu est précis, mais que dépasser 255 n'a aucun effet.
Changements : pas grand-chose. La fenêtre a une valeur qui peut être modifiée par $WinH (hauteur) et $WinL (largeur), limitation des couleurs qui ne peuvent pas dépasser la valeur 255 (Min(X,255)), limitation des couleurs qui ne peuvent pas influer sur les valeurs inférieures (Int(X)), possibilité de choisir les valeurs de l'aura avec des variables spécifiquement nommées, possibilité de choisir une autre couleur pour le coeur en décommentant du code et en changeant les valeurs associées.
Et j'ai viré la MsgBox de fin, car elle s'affichait directement sur la fenêtre, et supprimait une partie du résultat de manière indésirable.

Je cherche quelqu'un pour avoir d'autres formules de fractales intéressantes, il suffit certainement de changer quelques valeurs à l'affichage.



Visiter le site web du posteur
Message [R] Fractale de Mandelbrot 


Montrer les messages depuis:
Répondre au sujet Page 1 sur 1
  



Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation
Copyright 2008 - 2016 // Batch