Axiom
April 2nd, 2010
HyperCube - GC Mingati
Viste le considerazioni degli ultimi mesi in materia di grafica generativa con Processing, e sperimentazione sulla possibile ramificazione degli alberi 3D, non potevo non affrontare lo studio degli L-Systems che poi, sono niente di più che un sistema ricorsivo di riscrittura di stringhe. Ah bene, chissà che mi credevo. Si, ma richiedono moltissima sperimentazione anche se a prima vista appaiono semplici.
In questo breve primo post sugli L-Systems voglio solo annotare alcuni concetti di base nel solito monologo - non necessariamente chiaro e comprensbile - atto a tener traccia dei miei progressi, se di progressi posso parlare; tutti gli L-System, come già visto per gli automi, funzionano richiamando sempre una stessa funzione - sono ricorsivi - che implementa determinate regole e possono essere realizzati con questi elementi:
- Una grammatica generativa (assioma, regole, processo di sostituzione)
- Un parser (di stringhe)
La grammatica generativa.
Per grammatica di un sistema semplice si intende un set di 3 simboli come F+-
I simboli si differenziano in terminali e non-terminali; i simboli terminali (+-) servono, per esempio, a ‘girare’ entro un certo angolo un oggetto disegnato; i simboli non-terminali (F) servono a disegnare un nuovo oggetto. Questi simboli sono convenzioni, si posso usare tutti i simboli che si vuole, ma é sempre meglio attenersi alle convenzioni, per praticità.
All’inizio del processo viene letto un assioma e cioé un simbolo (o più simboli) del linguaggio predefinito (F ma anche F+F o più lunga) a partire dal quale inizia il processo di sostituzione ricorsiva; potremmo definirlo il ’seme’ del processo. A seguire viene applicata la regola, scritta con un qualsiasi elemento del linguaggio predefinito, come per esempio: F+-F–F+F. Ogni volta che il parser incontra un carattere F (non-terminale), genera una nuova forma e rigenera per intero la regola, una volta per ogni simbolo non-terminale; ogni volta che il parser incontra un simbolo terminale (+-) ruota il sistema di coordinate prima di generarla. Voilà, ecco il branching? Non proprio, le piante crescono in un contesto tridimensionale e quindi non basta girare su un asse soltanto. Vanno perciò introdotti altri simboli per effettuare il push ed il pop del matrix stack; per convenzione sono []<>^&
In un contesto bidimensionale però sono sufficienti i set di caratteri di base F+- per creare il Koch snowflake e lo Sierpinski triangle, che sono ritenuti un tipo di frattale.
Il parser.
Questo é il cuore di un L-System, é la funzione ricorsiva che applica la regola iniziale (assioma) e da il via alla generazione della nuova stringa. Ad ogni loop - o generazione - la stringa viene analizzata carattere-per-carattere e genera una nuova stringa, più grande, fino all’infinito. Il solo limite é la potenza del computer sul quale gira il sistema.


L-System test
Axiom: F
Rule: F-<[F>-^-<F]>+F
Insomma, c’è molto da sperimentare perchè le cose si fanno davvero complicate quando si cerca di controllare la complessità/caoticità proprie degli L-Systems; l’appeal estetico di questi sistemi (queste due immagini non sono appealing, ma rendolo l’idea della rapidità di crescita e caoticità di forma ottenibili in sole 6-7 generazioni) risiede nella imprevedibilità delle forme che si possono creare. La tentazione di creare ‘arte’ generativa con questi sistemi é forte, ma c’è un ma: essi sono ricorsivi e deterministici, cioè si ottiene - a fronte di una certa regola - sempre la stessa forma, per quanto inaspetattamente stravagante; per questo esiste la possibilità di complicare ulteriormente la faccenda con sistemi randomici, parametrici, dipendenti dal contesto e/o da altri fattori. Di queste amenità continuerò l’esplorazione, chissà che non mi esca qualcosa di interessante.
