Fractals zelf doen:
Zeef van Sierpinski
In zijn boek "Fractals. Meetkundige figuren in eindeloze herhaling" beschrijft Prof. Hans Lauwerier (1923 - 1997) een aantal fractals. Hierbij zijn programmaatjes beschikbaar die zijn geschreven in een variant van BASIC, die vandaag de dag niet meer wordt gebruikt. Omdat de code te leuk is om te worden vergeten heb ik die omgezet in JavaScript.
Op deze pagina wordt programma SIER (pag. 147 van het boek) gebruikt. Dit programma tekent de Zeef van Sierpinski (pag. 23), klik HIER voor een preview.
Onderstaande uitleg bevat wat jargon. Dat komt aan de orde op mijn
site over fractals.
Belangrijke parameters van het programma zijn: svgW en svgH (afmetingen van de figuur, in het voorbeeld 760
× 570 beeldpunten), P (Orde van de fractal, = 4, = aantal herhalingen van het Axioma dat wordt berekend). De
verkortingsfactor in elke stap in de berekening is hard geprogrammeerd, = 0.5. De factor A is gelijk aan √3.
Deze parameters kun je wijzigen om de invloed op de uitkomst te onderzoeken. Maar probeer ook eens om op andere plaatsen in
de code te wijzigen …!
Het oorspronkelijke BASIC-programma gebruikt 'default-initialisatie' van variabelen. Als er geen waarde is toegekend wordt
er een nul in gezet. De kracht van BASIC is onder meer dat je je bijna volledig kunt concentreren op het probleem. Dat geeft
korte programma's.
De JavaScript-versie vraagt meer inspanning, onder andere doordat JavaScript standaard geen voorzieningen heeft om te plotten.
Zaken als het initialiseren van variabelen, het passend maken van de figuur in de viewport en het daadwerkelijk zichtbaar
maken van de figuur moet je zelf regelen, waar BASIC dat doet met een enkele opdracht.
Het JavaScript-programma is als volgt opgebouwd:
- De function SVGleader() zet de (openings-)<svg>-tag in elkaar. De variabelen svgW en svgH bepalen de grootte van de plot.
- Vervolgens gaat het programma rekenen. Dat doet de function Sier(), die de resultaten (begin- en eindpunten van de lijnstukken) aflevert in de arrays X[ ], U1[ ], V1[ ], U2[ ] en v2[ ]. De array X[ ] is hierbij een gedeeltelijke kopie van U1[ ].
- De lengte van de vijf arrays hangt af van de orde P, maar is dynamisch geïmplementeerd, zodat de beschikbare
geheugenruimte in principe bepalend is voor de maximale waarde van P.
De praktijk is echter iets weerbarstiger. - Bij de berekening wordt uitgegaan van een eenheidslengte, dat is de lengte van het eerste lijnstuk (= 1). Bij hogere orde wordt dat steeds minder: ½, ¼, ⅛, … Op enig moment wordt de lengte van de lijnstukjes zo klein dat er underflow optreedt: De opeenvolgende punten X[i] en Y[i] gaan samenvallen. SVG kan daar niet goed tegen, waardoor er er geen plot verschijnt.
- In de praktijk kun je gaan tot P = 6. Dat is getest op mijn PC met Windows 11 (64 bits, 8 GB geheugen). Op een tablet (32 bits, 3 GB geheugen) moet je niet hoger gaan dan P = 5.
- Het axioma begint met het berekenen van de hoekpunten van de grote driehoek (met de punt naar beneden) die midden in de figuur staat. Daarna worden de kleinere driehoeken berekend. Dat gebeurt met een backtracking methode.
- Als laatste wordt de driehoek rond de hele figuur getekend (het oorspronkelijke BASIC-programma doet dat niet). Aangetoond kan worden dat, er van uitgaande dat het zwaartepunt van de grote driehoek op (0,0) ligt, de top van de driehoek de coördinaten (0,-2) heeft. De andere twee hoekpunten hebben de coördinaten (&plusmin;√3, 1);
- Zodra de berekeningen klaar zijn, start SVGlijnen(). Deze function schaalt de coördinaten van de lijnstukken
(lees: de hele plot) op naar de 95% van de afmetingen van de SVG-viewport. Daarna wordt de oorsprong van de plot verplaatst
van het middelpunt van de viewport (daar rekent BASIC mee) naar de linker bovenhoek (daar rekent SVG mee).
Vervolgens worden line-tags gemaakt voor elke set coördinaten [(U1[i], V1[i]) en (X[i], V2[i])], [(X[i], V2[i]) en (U2[i], V1[i])] en [(U2[i], V1[i]) en (U1[i], V1[i])].
N.B.: De plot wordt niet gespiegeld in de X-as. Daardoor staat de top van de driehoek in de plot naar boven. - De function SVGtrailer() zet als laatste een melding boven de plot met daarin de orde P.
- Bovengenoemde JavaScript-functions worden achter elkaar uitgevoerd door de function toonFiguur(), die automatisch wordt gestart bij het laden van de pagina, via window.onload.
- Merk op dat het programma geen enkele voorziening heeft om fouten op te vangen.
Gebruiken:
Om met de code te spelen moet je deze downloaden naar je eigen computer en uitpakken. Start sier.htm door er op
te klikken, gebruik zo nodig een lokale webserver. Je hebt meteen een werkend programma.
Raadpleeg het item Een workflow voor het ontwikkelen van JavaScript, in het bijzonder
de opmerkingen over hoe je lokaal kunt werken (dus zonder steeds te hoeven uploaden naar de servers van je webhost).
Vereiste schermgrootte is 800 × 710 pixels. De toepassing op deze site maakt SVG-code aan, die wordt getoond
door de inhoud van een <svg>-tag aan te passen.
Downloaden:
Druk op de knop:
File: voorb688.zip, 2270 bytes.