Stap 1: De technologie
Invoering van recursie
Onze fractal-tree gaat gebruiken een concept genaamd recursie. Recursie betekent in feite dat een functie zichzelf aanroept, over en weer, totdat een stop-voorwaarde is voldaan. Een bekend voorbeeld van een recursieve algoritme berekent de Fibonacci-reeks. De Fibonacci-reeks gaat 0, 1, 1, 2, 3, 5, 8, 13... De eerste twee elementen zijn 0 en 1, en vervolgens elk element na dat is de som van de laatste twee elementen. Zo kunnen we schrijven een functie Fib(n), waarbij n staat voor de index (met behulp van C/Java syntaxis) als:
int Fib(n)
{
n < 2 retourneren? n: Fib(n-1) + Fib(n-2);
}
Dus laat zeggen we willen vinden het vijfde element, Fib(5) roept Fib(4) en Fib(3), enzovoort in dat mode tot Fib(0) of Fib(1) worden genoemd. Dit is de "stop-voorwaarde", waarin het alleen geeft als resultaat 0 of 1 in plaats van roepen Fib() weer.
Ware recursie is niet mogelijk in OpenSCAD, want het is niet een functionele programmeertaal. OpenSCAD maakt gebruik van Modules, die vergelijkbaar zijn met functies of methoden, maar op een andere manier worden gecompileerd. In de traditionele programmering verandert de compiler uw code in een reeks instructies voor de computer uit te voeren. In OpenSCAD draait de compiler uw instructies in een 3D-model.
Wanneer u een C-programma schrijven, bijvoorbeeld, dat de eerste paar elementen van de Fibonacci-reeks wordt berekend, gecompileerd tot dezelfde grootte als die de eerste miljoen elementen van de sequentie berekent. Wanneer je zoiets als dit in OpenSCAD, uw output is een miljoen keer groter, en een miljoen keer zo lang duurt om te compileren.
Om deze reden moet je heel voorzichtig zijn niet te gaan door middel van teveel iteraties!
In de meeste versies van OpenSCAD laat het je niet compileert een module die haar zelf rechtstreeks roept, dus ik gebruik het volgende patroon te omzeilen:
- Eerst Maak module A en sommige geometrie binnen het genereren.
- Vervolgens binnenkant van A, noemen module B.
- Nu maak module B.
- Daarbinnen, niets behalve bellen module A.
- Is nu een feitelijke recursieve module. (Zorg ervoor om een stop-voorwaarde om te voorkomen dat een oneindige lus).