Fractals zelf doen:
Banen van Henon's kwadratisch systeem
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 HENON (pag. 153 van het boek) gebruikt. Dit programma tekent Banen van Henon's kwadratisch systeem (pag. 104). Klik HIER voor een preview (Let op: de berekening duurt lang).
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),MMAX (Aantal banen, = 32) en NMAX (Aantal stappen per baan, = 600). Verder is er de
parameter A (= .24, dit is de cosinus van een hoek α = 76.11345964°). 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 …!
De bij A behorende sinus wordt intern opgeslagen in een variabele B = √(1 - A2).
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 Henon(), die de resultaten (middelpunten van de cirkeltjes waarmee de puntjes worden getekend) aflevert in de arrays X[ ] en Y[ ].
- De lengte van de arrays X[ ] en Y[ ] hangt af van het aantal banen MMAX en het aantal rekenstappen
NMAX. Het is dynamisch geïmplementeerd, zodat de beschikbare geheugenruimte in principe bepalend is voor de maximale
waarden van MMAX en NMAX.
De praktijk is echter iets weerbarstiger. - Het rekenproces is erg traag. In het voorbeeld worden maximaal 32 × 1000 = maximaal 32 000 punten uitgerekend. Dat kan tijd vragen. Een en ander is getest op mijn Windows-PC (64-bits, 8 GB geheugen, beeldscherm 1920 × 1080). Op een tablet (Android, 32-bits, 3 GB geheugen, beeldscherm 1280 × 800) zijn de parameters uit het voorbeeld wel het maximum haalbare.
- Soms wordt de plot heel klein op het scherm gezet. Dat lijkt een fout, maar de buitenste baan ligt dan heel ver buiten de andere banen.
- Het afbreekcriterium voor de lus over NMAX (|XX| + |YY| > 10) is hard geprogrammeerd. Daarmee wordt voorkomen dat de plot heel groot wordt er er daardoor het midden van de plot dichtloopt.
- Zodra de berekeningen klaar zijn, start SVGpunten(). Deze function schaalt de punten (lees: de hele plot) op naar de 90% van de afmetingen van de SVG-viewport. Daarna wordt de oorsprong van de plot verplaatst van de oorsprong van de viewport (daar rekent BASIC mee) naar de linker bovenhoek (daar rekent SVG mee).
- De function SVGtrailer() zet als laatste een melding boven de plot met daarin de parameters MMAXi> en NMAX.
- 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 henon.htm door er op
te klikken, gebruik zo nodig een lokale webserver. Je hebt meteen een werkend programma.
Als je met de parameters gaat spelen, zul je vaak de variabelen ShX en ShY moeten aanpassen om de plot in de
viewport te houden.
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: voorb715.zip, 2044 bytes.
Opmerking:
In het oorspronkelijke BASIC programma krijg je steeds hetzelfde resultaat. Dat komt doordat de random-generator bij elke run
van het programma dezelfde startwaarde heeft (RANDOMIZE 11). Dit heet het seed-getal.
Het is niet mogelijk om bij de random generator van JavaScript (Math.random()) een seed-getal op te geven.
De ECMA-specificatie is er nogal onduidelijk over hoe de random-generator moet worden gestart. Daardoor doet elke browser-motor
het anders. Vermoedelijk wordt het seed-getal ontleend aan de systeemklok, maar daar heb ik geen bewijs voor gevonden.