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
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
Code: Selecteer alles
RX = 1.5 / 1000
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
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
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)
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
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
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
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)
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
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
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!!