Mandelbrot (fractal) maken

Heb je een leuke tutorial, een duidelijke uitleg van een bepaald onderwerp, een interessante minicursus of heb je een leuk trucje gevonden, post het hier.
Gebruikersavatar
Marco
Beheerder
Beheerder
Berichten: 831
Lid geworden op: 19 feb 2005, 12:50
Locatie: Leeuwarden
Contacteer:

Mandelbrot (fractal) maken

Bericht door Marco » 21 mar 2005, 09:53

Tutorial voor het maken van de Mandelbrot

Programmeertaal: Visual Basic 6 (VB)

Benodigdheden: Microsoft Visual Basic 6

Voorkennis: Overweg kunnen met visual basic, als je wilt weten wat je doet is het ook handig om wat te weten over fractals. Je kunt de kennis ook opdoen door dit programmaatje goed te bestuderen.

Variabelen defineren
Als je een programma maakt moet je altijd de variabelen defineren. Dut kun je het handigst doen in Option Explicit. Zet deze code helemaal bovenaan:

Code: Selecteer alles

Option Explicit
Dim Y As Double
Dim X As Double
Dim A As Integer
Dim RX As Double
Dim XX As Double
Dim YY As Double
Dim XXX As Double
Dim D As Double
Dim C As Double
Dim AA As Integer
Later in deze tutorial wordt duidelijk waar deze variabelen voor dienen.

Het begin
Als je een fractal wilt gaan tekenen dan moet je het ergens in tekenen, dit kan in VB heel makkelijk in een picturebox. Om te beginnen moet je dus eerst een picture box van ongeveer 450 bij 450 pixels tekenen. Zorg ervoor dat de box ongeveer vierkant is. Laat de naam gewoon Picture1.
Dan moet je een knopje maken. Het maakt niet uit wat je er op zet of hoe je hem noemt. Als je op dit knopje klikt wordt de Mandelbrot getekend.
Als je op de knop klikt dan moet eerst het plaatje goed worden geschaald. Dit kun je doen door dit in de code te zetten onder de knop:

Code: Selecteer alles

Picture1.ScaleHeight = 1800
Picture1.ScaleWidth = 1800
Dan moet je één variabele instellen:

Code: Selecteer alles

RX = 1.5 / 1000
De loop (Engels, spreek uit als 'loep')
Bij de Mandelbrot moet je voor elk punt wat je tekent in de picturebox kijken of het punt op of buiten de Mandelbrot ligt. Je moet dus elk punt bij langs gaan. Dit kun je het handigst doen met een For functie:

Code: Selecteer alles

For X = -900 To 900 Step 3.8
For Y = -900 To 0 Step 3.8
Zoals je ziet maakt de x een verschil van 1800. Dit is ook de geschaalde breedte van je picturebox. De y maakt maar een verschil van 900. Dit is omdat de Mandelbrot symmetrisch is, daarom hoef je maar de helft te berekenen. De andere helft kun je er dan zo bij tekenen.
De step 3.8 is om te zorgen dat je niet te veel tekent. Als je later gaat inzoomen dan kun je deze step verlagen.

Variabelen instellen
Zodra je de for-functie bent begonnen moet je weer variabelen gaan instellen. Met deze variabelen ga je itereren:

Code: Selecteer alles

XX = RX * -X - 0.75
YY = Y * RX
C = XX
D = YY
A = 0
XX en YY zijn de x en de y op de assen van de Mandelbrot. C en D vormen samen de C in de Mandelbrot formule.
De A is het aantal iteraties.

Het itereren
Nou komt het belangrijkste deel van het Mandelbrot programma; het itereren zelf.
VB kan niet werken met complexe getallen. Daarom kun je niet werken met één formule. Je kunt de formule Z = Z^2 + C omschrijven tot twee formules:

Code: Selecteer alles

z = (x + yi)^2 + c = x^2 – y^2 + 2ixy + c 
x = x^2 - y^2 + Re(c) 
y = 2xy + Im(c)
De twee onderste formules werken wel in VB.
Itereren is ook een loop, maar hier kun je beter until gebruiken omdat je ook nog tussentijds moet testen of het punt niet buiten de Mandelbrot ligt.
Het itereren moet stoppen zodra de ingevulde punt buiten een cirkel van twee komen, want dan ligt het originele punt buiten de Mandelbrot. Het itereren moet ook stoppen als je het punt vaak genoeg hebt ingevuld, bijvoorbeeld 50 keer. De until wordt dan:

Code: Selecteer alles

Do Until XX * XX + YY * YY > 4 Or A > 50
Je gaat dus net zolang itereren totdat x^2 + Y^2 = 2^2. Of totdat het aantal iteraties de 50 heeft gehaald.
Hierna moet je de formules gaan invullen:

Code: Selecteer alles

A = A + 1
XXX = XX
XX = XX * XX - YY * YY + C
YY = 2 * XXX * YY + D
Eerst wordt bij de A een opgeteld, want het aantal iteraties wordt een hoger. Dan wordt een extra x aangemaakt, want je moet niet de nieuwe x in de y-formule invullen.
Als laatste komen dus de twee formules, precies zoals ze hierboven zijn berekent. Re(c) is gewoon het x-coördinaat van het beginpunt.
De until moet je natuurlijk afsluiten:

Code: Selecteer alles

Loop
De punten tekenen en kleuren
Punt kun je in VB zetten met Pset. Hier achter zet je de x en de y coördinaat en de kleur.
Het is het mooist om een kleurige Mandelbrot te krijgen. Dit gaat het makkelijkst met QBcolor. De kan 16 verschillende waardes hebben (tussen de 0 en 15). Je kunt verschil in kleur krijgen door het aantal iteraties te gebruiken. De code wordt dan:

Code: Selecteer alles

AA = 14 - Int(A / 50 * 13)
Picture1.PSet (900 - X, Y + 900), QBColor(AA)
Picture1.PSet (900 - X, 900 - Y), QBColor(AA)
Voor AA wordt een getal gemaakt tussen de 1 en 14. Door de 0 en de 15 niet gebruiken, krijg je geen zwart en wit.
Omdat de Mandelbrot symmetrisch hoef je de helft van de punten maar te bereken, maar je moet dan wel alles dubbel tekenen. Daarom staat er twee keer Pset.

Laatste tags
Als laatste moet je nog de for-functie afsluiten:

Code: Selecteer alles

Next Y
Next X
De complete code
Hieronder staat de complete code van de Mandelbrot (niet de option explicit)

Code: Selecteer alles

Private Sub Command1_Click()
 Picture1.ScaleHeight = 1800
 Picture1.ScaleWidth = 1800
 AA = 0
 RX = 1.5 / 1000
 For X = -900 To 900 Step 3.8
   For Y = -900 To 0 Step 3.8
      XX = RX * -X - 0.75
      YY = Y * RX
      C = XX
      D = YY
      A = 0
      Do Until XX * XX + YY * YY > 4 Or A > 50
         A = A + 1
         XXX = XX
         XX = XX * XX - YY * YY + C
         YY = 2 * XXX * YY + D
      Loop
      AA = 14 - Int(A / 50 * 13)
      Picture1.PSet (900 - X, Y + 900), QBColor(AA)
      Picture1.PSet (900 - X, 900 - Y), QBColor(AA)
   Next Y
 Next X
End Sub
Uitbereiden
Je kunt dit programma erg uitbereiden, bijvoorbeeld door een inzoom functie er in te bouwen, of zelfs dat het programma ook Julia's kan tekenen. Een erg (zelf gemaakte) uitgebreide versie is hier te downloaden. De source is op aanvraag (pm) beschikbaar.

Tot slot
Ik heb erg veel plezier aan gehad aan het maken van dit programma. Ik hoop dat jullie er iets aan hebben.
Je mag dit programma vrij gebruiken, maar als je het gebruikt plaats dan wel een link naar deze site.

Veel succes!!
Groeten, Marco

Plaats reactie