01 · Problem
Wofür braucht man das?
Pflanzen, Fraktale und prozedurale Formen lassen sich kompakt als Axiom plus lokale Umschreibregeln beschreiben.
02 · Denkmodell
Das mentale Modell
Jede Generation liest ausschließlich die vorherige Symbolfolge und baut eine neue. Stochastische Regeln wählen pro Symbol eine Transformation aus einer validierten Gewichtsverteilung.
LSystem filtert Regeln pro Zeichen und wählt mit Math.random. Arrays von Transform-Symbolen werden per String-Coercion mit Kommas angehängt; Gewichte und exponentielles Wachstum sind unbegrenzt.
03 · Kontrollfluss
Was passiert in welcher Reihenfolge?
- Regeln einmal nach Ursprungssymbol gruppieren und Gewichte validieren.
- Für jede Iteration eine frische Ausgabefolge erzeugen.
- Für jedes Symbol eine Regel über injizierten Zufall wählen oder es unverändert übernehmen.
- Transformationssymbole einzeln anhängen und vor einem Größenlimit stoppen.
04 · Bauteile
Die entscheidenden Verträge
LSystem(axiom, rules)
Speichert Startfolge und stochastische Umschreibregeln.
generate(iterations)
Wendet Regeln generationenweise auf jedes Symbol an.
Rule / SymbolType
Beschreibt Ursprung, Transformation und Wahrscheinlichkeit.
05 · Build it yourself
Selbst implementieren
Nutze Symbolarrays statt impliziter String-Coercion und injiziere Zufall für reproduzierbare Generationen.
- Indiziere Regeln pro Symbol und normalisiere positive Gewichte.
- Erzeuge jede Generation aus einem unveränderten Snapshot der vorherigen.
- Begrenze Iterationen und maximale Symbolzahl vor unkontrolliertem Wachstum.
type Rule<S> = { weight: number; replacement: readonly S[] };
function expand<S>(
input: readonly S[],
rules: ReadonlyMap<S, readonly Rule<S>[]>,
random: () => number,
) {
const output: S[] = [];
for (const symbol of input) {
const rule = chooseWeighted(rules.get(symbol) ?? [], random());
output.push(...(rule?.replacement ?? [symbol]));
}
return output;
}06 · Verifizieren
Was du testen solltest
- Deterministischer RNG erzeugt erwartete Generationen und Randgewichte.
- Symbole ohne Regel bleiben erhalten; mehrere Ersatzsymbole enthalten keine Kommas.
- Ungültige Gewichte und Überschreiten des Größenlimits führen zu klaren Fehlern.
07 · Grenzen
Kompromisse und Stolperfallen
- Materialisierte Folgen können exponentiell wachsen; Streaming erschwert spätere Generationen.
- Stochastische Ergebnisse sind ohne Seed nicht reproduzierbar.
Die Transformationsfolge ist eine Sequenz, kein String-Zufallsprodukt. Datenrepräsentation und spätere Turtle-Interpretation sollten getrennt bleiben.
08 · Weiterdenken