Förfarandemässigt genereras träd (1 / 10 steg)
Steg 1: rekursion
Att införa rekursion
Vår fraktal-träd kommer att använda ett begrepp som kallas rekursion. Rekursion innebär i princip en funktion appeller sig själv, om och om igen, tills ett stoppvillkor uppfylls. Ett vanligt exempel på en rekursiv algoritm beräkningen av Fibonaccien ordnar. Fibonaccien ordnar går 0, 1, 1, 2, 3, 5, 8, 13... De två första delarna är 0 och 1, och då varje element efter som är summan av de två sista delarna. Så kan vi skriva en funktion Fib(n) där n är index (med C/Java syntax) som:
< p > int Fib(n) < br > {
tillbaka n < 2? n: Fib(n-1) + Fib(n-2);
} < /p >
Så kan säga vi vill hitta det femte elementet, Fib(5) kräver Fib(4) och Fib(3), och så vidare i den mode tills Fib(0) eller Fib(1) blir synad. Detta är "stoppvillkoret" där det bara returnerar 0 eller 1 istället för att ringa Fib() igen.
Sanna rekursion är inte möjligt i OpenSCAD, eftersom det inte är ett funktionellt programmeringsspråk. OpenSCAD använder moduler, som liknar funktioner eller metoder, men sammanställs på ett annat sätt. I traditionell programmering förvandlar kompilatorn din kod till en uppsättning instruktioner för datorn att utföra. I OpenSCAD vänder kompilatorn dina instruktioner till en 3D-modell.
När du skriver ett C-program, till exempel, som beräknar de första några delarna av Fibonaccien ordnar, det sammanställer ner till samma storlek som en som beräknar de första miljonen element av sekvensen. När du gör något sånt här i OpenSCAD, din produktion är en miljon gånger större, och tar en miljon gånger så lång tid att sammanställa.
Därför måste du vara mycket försiktig med att gå igenom för många iterationer!
I de flesta versioner av OpenSCAD kan det du inte sammanställa en modul som kallar sin egen direkt, så jag använder följande mönster för att komma runt det:
- Först skapa modul A, och generera några geometri inom it.
- Sedan i A, kalla modul B.
- Nu skapa modul B.
- Det gör ingenting förutom kallar modul A.
- A är nu en faktisk rekursiva modul. (Se till att ha ett stoppvillkor att undvika en oändlig loop.)