Fractals zelf doen:
H-fractal
In zijn boek "Fractals. Meetkundige figuren in eindeloze herhaling" geeft Prof. Hans Lauwerier (1923 - 1997) computercode om zelf met fractals bezig te zijn op een thuiscomputer. Deze code is 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.
Bron:
Hans Lauwerier: Fractals. Meetkundige figuren in eindeloze herhaling.
5e druk 1992, Uitg. Aramith, Bloemendaal,
ISBN: 90-6834-115-4.
Op deze pagina wordt programma BOOMH1 (pag. 146 van het boek) gebruikt. Dit programma tekent de H-fractal (pag. 13), 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, = 9, = aantal herhalingen van het Axioma dat wordt berekend en
getekend) en A (de verkortingsfactor in elke stap in de berekening, = 1/√2).
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 SVG-code waarmee de figuur wordt gemaakt wordt opgeslagen in de variabele str.
- 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 BoomH1(), die de resultaten (begin- en eindpunten van
de lijnstukken) aflevert in de arrays X[ ] en Y[ ]. De lengte van X[ ] en Y[ ] 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 hogere waarden van P (vanaf 15) raakt mijn tablet (32 bits, 3 GB geheugen) in de problemen. De berekeningen
duren erg lang, maar er verschijnt wel nog een complete plot. In het voorbeeld staan de lijntjes nu zo dicht op elkaar dat
het scherm ze niet goed meer kan weergeven. Wel ontstaat er daardoor een mooi dendrieten-patroon.
Bij P = 16 verschijnt er nog maar een halve plot en loopt het programma vast. Bij P = 17 gebeurt er niks meer.
op mijn Windows 11-PC (64 bits, 8 GB geheugen) is het niet veel beter: problemen bij P = 16, halve plot bij P = 17 en een vastloper bij P = 18.
De oorzaak volgt later. Voor de goede orde: dit treedt op met Edge en Chrome. Met FireFox kun je verder gaan, hoewel de mogelijkheden daar ook beperkt zijn. - 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 plot gespiegeld in de X-as en 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 elk paar coördinaten (X[i], Y[i]) en (X[i+1], Y[i+1]). Elke line-tag wordt toegevoegd aan str. En daardoor kunnen problemen ontstaan. Browsers beperken nl. de maximale lengte van een string, waardoor er maar een beperkt aantal line-tags gemaakt kan worden. Zie ook het item Over de maximale lengte van strings in JavaScript. - Als laatste wordt de melding (P, A) boven de plot gezet, wordt een melding toegevoegd voor browsers die niet met SVG overweg
kunnen en wordt de </svg>-tag aan str toegevoegd.
Als allerlaatste wordt de complete <svg>-tag in het document gezet. Deze laatste acties worden gedaan door de function SVGtrailer(). - 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 boomh1.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: voorb683.zip, 2016 bytes.