Axiom

genarch02

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.

lsys01
lsys02
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.