Origami Fractalen Getaltheorie Betegelingen Programmeren Woordenboek Links Contact

 

 

 



 

programma: de Koch fractaal

vooraf nodig:

Voordat je een computerprogramma schrijft moet je natuurlijk een idee hebben hoe je, wat je wilt bereiken kan omzetten in een serie instructies, die in de programmeertaal beschikbaar zijn. Daartoe moet je vertrouwd zijn met (een deel) van deze instructies.

De instructies, die in het programma voorkomen zijn:

  • dim as
  • screen
  • cls
  • window
  • print
  • input
  • for do next
  • if then else endif
  • select case
  • mid
  • len
  • line en de zogenaamde
  • operatoren +,-,*,^,.,:

Toelichtingen en oefenmogelijkheden staan links onder instructie hulp. U kunt ze vooraf bekijken, maar ook oproepen tijdens het bekijken van onderstaand programma.

Opbouw van het programma

Het programma is gebaseerd op de zogenaamde "turtle graphics". Een principe met meerdere toepassingsmogelijkheden. We lichten dit eerst toe:

voorbeeld:


we geven het tekenen van een lijnstukje aan met de hoofdletter F, het draaien van de tekenrichting over 60 graden tegen de klok in met een + en een draaing van de tekenrichting met 60 graden met de klok mee met een -.

De lengte van de lijnstukjes doet er voorlopig niet van toe. Wel beteken F een steeds even lang lijnstuk.

.
We kunnen nu het tekenen van deze drie lijnstukjes symbolisch weergeven met F+F-F .


En een eerste orde Koch kromme kunnen we met F+F--F+F weergeven. De overgang van de nulde orde (een lijnstuk) naar de eerste orde Koch kromme gaat dus als F----> F+F--F+F

De symbolische weergave van de tweede orde Koch kromme krijgen we door elke F hierboven te vervangen door de hele reeks, dus door F+F--F+F. Dat wordt dus F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F. Voor een volgende orde vervangen we weer iedere F door F+F--F+F en zo kunnen we symbolische tekenreeksen maken voor iedere orde Koch kromme.

Van het hierbovenstaande wordt gebruikt gemaakt in het programma. Eerst wordt aan de gebruiker gevraagd welke orde hij wil laten tekenen, dan wordt de tekenreeks als hierboven opgebouwd. Tenslotte worden de lijnstukjes, één voor één, getekenend. Hiervoor worden de coördinaten van het eindpunt van ieder lijnstukje berekend. Daar is wat wiskunde voor nodig, namelijk de formule voor draaiingen in het platte vlak.

Hieronder het programma. Tekst op een regel, die begint met een ' is geen onderdeel van het programma, maar geeft toelichting.

Het programma

    
                    'programma 1:de Koch fractaal
                    
Dim As Double pi,x,y,h
Dim As Integer orde,n,i
'met deze regels worden geheugenplaatsen gereserveerd 
'onder de namen pi,x,y,h. Later kun je op deze plaatsen 
'een waarde neerzetten. Bijvoorbeeld door x=3 in
'je programma neer te zetten. We zeggen dat we aan de
'variabele x de waarde 3 toekennen. Het woord dim 
'betekent dus "reserveer", maar we zeggen meestal 
'"declareer". 
'"as double" betekent dat je voor pi,x,y en h alleen maar
'als waarden getallen mag opgeven.
'In de volgende regel is dit anders:

Dim As String axioma,produktieregel,weg, w,s,q,clearkey
'ook hier worden, door middel van het woord "dim" 
'variabelen gedeclareerd. Namelijk de variabelen met de 
'namen: axioma,produktieregel,weg, w, s en q.
'"as string" betekent "als string" en een string is een rij
'willekeurige tekens, die je met het toetsenbord kunt 
'maken. Voorbeeld: je kunt dus in je programma opnemen 
'axioma="a+s§!s()o" Let op: de aanhalingstekens doen niet 
'mee. Je zet deze altijd om een stringvariabele.

Print"toets ordegetal in, u kunt kiezen uit 0,1,....6"
'Met deze printopdracht wordt wat er achter "print" staat op
'het beeldscherm gezet, met weglating van de tekens ". 
'Deze moeten er wel omheen staan.

Input "orde=",orde
'de opdracht "input" wordt gebruikt om degene, die het 
'programma uitvoert, de mogelijk te bieden iets in te tikken. 

Screen 19

'Er wordt een grafisch venster klaargezet.


Window(-4,-3)-(4,3)
'Om een plek op het beeldscherm te kunnen bepalen worden
'met dit commando coördinaten ingevoerd. 

Cls

'mocht er iets op het beeldscherm staan, dan wordt dat 
'door dit commando gewist cls in een afkorting voor clear 
'screen.


pi=4*Atn(1)
'hier wordt met behulp van een wiskunde formule een 
'waarde van pi berekent en deze waarde wordt aan de
'gedeclareerde pi gegeven.


x=-3:y=.5:h=6/3^orde
'x en y worden gebruikt om aan te geven waar er moet 
'worden begonnen met tekenen op het beeldscherm. Hier 
'wordt dus gezegd: begin te tekenen op de plek met 
'coördinaten (-3,0.5). h wordt gebruikt om de lengte van
'ieder lijnstukje te bepalen. Er staat h= 6 gedeeld door 3
'tot de macht orde. De waarde van orde is door de gebruiker
'hierboven opgegeven. Heeft de gebruiker bijvoorbeeld
'4 ingetikt dan staat er dus h is 6 gedeeld door 3 tot de 
'macht 4. Let op: machtverheffen gaat voor delen h is dus
'6 gedeeld door 81.

'na de voorbereidingen wordt in het volgende deel een string
'gemaakt, waarin alle lijnstukjes, die getekend moeten 
'worden, worden opgeslagen en tevens wanneer en 
'hoe er van richting moet worden veranderd.

axioma="F"
'F staat voor "teken een lijnstukje"

produktieregel="F+F--F+F"
'+ staat voor draai de tekenrichting 60 graden tegen de klok
'in, - staat voor draai de tekenrichting -60 graden met de 
'klok mee. De produktieregel geeft aan hoe ieder
'lijnstukje F bij een order, die 1 groter is dan de vorige
'moet worden veranderd.

weg=axioma
'in de stringvariabele "weg" wordt de gehele te tekenen weg
'opgeslagen als een rij symbolen +, - en F.


For n=1 To orde
    w=""
    For i=1 To Len(weg)
        s=Mid$(weg,i,1)
        If s="F" Then q=produktieregel Else q=s
        w=w+q
    Next i
    weg=w
Next n

'de symbolen in de string weg worden één voor één bekeken
'Als er een F staat dan word de F vervangen door 
'F+F--F+F, en toegevoegd, via de variabele q aan w, anders
'wordt de + of de - toegevoegd. Tenslotte wordt alle in de 
'variabele weg gezet. 


Dim As Double a,b,p1,q1,p2,q2
a=Cos(pi/3):b=Sin(pi/3)
'a en b bepalen de richting waarin er getekend moet worden

p1=1:q1=0:Pset(x,y)
'p1 en q1 bepalen de tekenrichting bij de start, nl horizontaal
'en naar rechts. Er wordt een eerst punt gezet. De waarde
'van x en y zijn hierboven al gedeclareerd.

For i=1 To Len(weg)
    s=Mid$(weg,i,1)
    Select Case s
    Case "+"
        p2=a*p1-b*q1
        q2=b*p1+a*q1
        p1=p2:q1=q2
    Case "-"
        p2=a*p1+b*q1
        q2=-b*p1+a*q1
        p1=p2:q1=q2
    Case "F"
        x=x+h*p1:y=y+h*q1
        Line -(x,y)
    End Select

Next i
'één voor één worden de tekens uit "weg" bekeken. Bij + en
'- wordt de richting veranderd m.b.v een wiskunde formule
'voor rotatie. Deze richting wordt in p1 en q1 opgeslagen.
'In het geval F wordt het volgende te tekenen
'lijnstuk berekend, waarbij h de lengte bepaald ( h
'hangt af van de orde, zie boven)
        


Sleep

naar begin pagina

©jos hendriks, 2008-2010