Mandelbrot

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
threedslider
Messages : 469
Inscription : dim. 01/juil./2018 22:38

Mandelbrot

Message par threedslider »

Sujet que je voulais faire approximativement le Fractal de Mandelbrot : https://fr.wikipedia.org/wiki/Ensemble_de_Mandelbrot

Basé sur le code en anglais : https://en.wikipedia.org/wiki/Mandelbrot_set

Voici le code :

Code : Tout sélectionner

;;; Inspired by Mandelbrot with Fractal and done with appromixation by threedslider in Purebasic 6.30 - 21/01/2026  ;;;

; Click ans select a region you want to zoom as infinitely, enjoy :D !

;::: KNOW ISSUE :::
; - Some in region doesn't look very well as true Fractal, sorry !


EnableExplicit

#W = 800
#H = 600
#MAXITER = 300

Global minX.d = -2.5
Global maxX.d =  1.0
Global minY.d = -1.5
Global maxY.d =  1.5

Global selecting = #False
Global sx, sy, ex, ey

Procedure.d MinD(a.d, b.d)
  If a < b : ProcedureReturn a : Else : ProcedureReturn b : EndIf
EndProcedure

Procedure.d MaxD(a.d, b.d)
  If a > b : ProcedureReturn a : Else : ProcedureReturn b : EndIf
EndProcedure

Procedure DrawMandelbrot()
  Protected x, y, i
  Protected zx.d, zy.d, cx.d, cy.d
  Protected dx.d = (maxX - minX) / #W
  Protected dy.d = (maxY - minY) / #H

  StartDrawing(CanvasOutput(0))
  Box(0,0,#W,#H,0)

  For y = 0 To #H-1
    cy = minY + y * dy
    For x = 0 To #W-1
      cx = minX + x * dx
      zx = 0 : zy = 0 : i = 0

      While zx*zx + zy*zy < 4 And i < #MAXITER
        Protected t.d = zx*zx - zy*zy + cx
        zy = 2*zx*zy + cy
        zx = t
        i + 1
      Wend

      If i < #MAXITER
        Plot(x, y, RGB(i*4, i*6, i*3))
      EndIf
    Next
  Next

  StopDrawing()
EndProcedure

; --------- UI ---------
OpenWindow(0, 0, 0, #W/DesktopResolutionX(), #H/DesktopResolutionY(), "Mandelbrot - Zoom souris", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(0, 0, 0, #W, #H)

DrawMandelbrot()

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break

    Case #PB_Event_Gadget
      If EventGadget() = 0
        Select EventType()
          Case #PB_EventType_LeftButtonDown
            sx = GetGadgetAttribute(0, #PB_Canvas_MouseX)
            sy = GetGadgetAttribute(0, #PB_Canvas_MouseY)
            selecting = #True

          Case #PB_EventType_MouseMove
            If selecting
              ex = GetGadgetAttribute(0, #PB_Canvas_MouseX)
              ey = GetGadgetAttribute(0, #PB_Canvas_MouseY)

              DrawMandelbrot()
              StartDrawing(CanvasOutput(0))
              DrawingMode(#PB_2DDrawing_Outlined)
              Box(sx, sy, ex-sx, ey-sy, RGB(255,255,255))
              StopDrawing()
            EndIf

          Case #PB_EventType_LeftButtonUp
            If selecting
              selecting = #False
              ex = GetGadgetAttribute(0, #PB_Canvas_MouseX)
              ey = GetGadgetAttribute(0, #PB_Canvas_MouseY)

              If Abs(ex-sx) > 10 And Abs(ey-sy) > 10
                Define nx1.d = minX + (sx/#W)*(maxX-minX)
                Define nx2.d = minX + (ex/#W)*(maxX-minX)
                Define ny1.d = minY + (sy/#H)*(maxY-minY)
                Define ny2.d = minY + (ey/#H)*(maxY-minY)

                minX = MinD(nx1,nx2)
                maxX = MaxD(nx1,nx2)
                minY = MinD(ny1,ny2)
                maxY = MaxD(ny1,ny2)

                DrawMandelbrot()
              EndIf
            EndIf
        EndSelect
      EndIf
  EndSelect
ForEver
Amusez vous bien ! :wink:
Avatar de l’utilisateur
venom
Messages : 3183
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Re: Mandelbrot

Message par venom »

Merci du partage threedslider je testerai a l'occasion :wink:






@++
Windows 10 x64, PureBasic 6.30 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
Jacobus
Messages : 1613
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Mandelbrot

Message par Jacobus »

C'est toujours de superbes images générées, j'aime beaucoup. 8)
Dommage que ce soit si lent. Entre 20 et 30 secondes pour voir l'action de la souris 8O

Image
Image
Image
Image
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Guillot
Messages : 742
Inscription : jeu. 25/juin/2015 16:18

Re: Mandelbrot

Message par Guillot »

enleve le debogueur
et compile en c avec optimaisation
Avatar de l’utilisateur
Jacobus
Messages : 1613
Inscription : mar. 06/avr./2004 10:35
Contact :

Re: Mandelbrot

Message par Jacobus »

Merci Guillot, ça fonctionne effectivement beaucoup mieux ainsi. :D
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
Kwai chang caine
Messages : 7027
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Mandelbrot

Message par Kwai chang caine »

Jolies images, merci du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel
Avatar de l’utilisateur
Syntax Horror
Messages : 10
Inscription : jeu. 29/janv./2026 11:32

Re: Mandelbrot

Message par Syntax Horror »

J'ai toujours aimé les fractals mais je n'ai jamais compris comment en programmer.
Avatar de l’utilisateur
threedslider
Messages : 469
Inscription : dim. 01/juil./2018 22:38

Re: Mandelbrot

Message par threedslider »

Merci à tous de tester mon code :D

Content que ce soit utile pour vous !
Avatar de l’utilisateur
threedslider
Messages : 469
Inscription : dim. 01/juil./2018 22:38

Re: Mandelbrot

Message par threedslider »

Syntax Horror a écrit : jeu. 26/févr./2026 10:29 J'ai toujours aimé les fractals mais je n'ai jamais compris comment en programmer.
Y'a une explication ici en tutoriel pour Fractal de Mandelbrot ;) : https://zestedesavoir.com/tutoriels/329 ... andelbrot/

J'espère que cela t'aidera aussi bien :)
Avatar de l’utilisateur
Shadow
Messages : 1439
Inscription : mer. 04/nov./2015 17:39

Re: Mandelbrot

Message par Shadow »

La vie n'est qu'une fractale parmi tant d'autres !
Très sympas les couleurs et les motifs. :wink:
AMD Ryzen 9 5950X (16 cœurs, 32 threads, Socket AM4)
Gigabyte RTX 5090 WINDFORCE OC (32 Go GDDR7)
ASUS TUF GAMING B550-PRO (AM4, 4 slots RAM)
64 GB DDR4 3200 Mhz
Asus 24 Pouces: 1920 x 1080.
Système: Windows 10 64 Bits.

PureBasic: 6.30 beta 4 x64 Bits.
Avatar de l’utilisateur
threedslider
Messages : 469
Inscription : dim. 01/juil./2018 22:38

Re: Mandelbrot

Message par threedslider »

Shadow a écrit : lun. 02/mars/2026 0:23 La vie n'est qu'une fractale parmi tant d'autres !
Oui dans certaine mesure où ya dans cette Terre la nature a une forme de fractale mais dans l'univers non je crois pas car la fractale de Mandelbrot a une forme irregulière en 2D or que dans l'univers c'est la 3D voire même 4D et en dehors de l'univers cela pourrait être la 5D ou plus :D ... L'ensemble de multiples d'univers c'est des formes spiral et sphérique qui englobe une hiérarchisation mais j'ai aucune idée ce que pourrait être la 5D ou plus encore 8O
Shadow a écrit : lun. 02/mars/2026 0:23 Très sympas les couleurs et les motifs. :wink:
Merci beaucoup :D
Répondre