L-System con Processing
Utilizzando un L-System è possibile descrivere un pattern evolutivo semplicemente specificando alcune regole di sostituzione; un esempio di queste grammatiche potrebbe essere riassunto nei seguenti predicati:
- Se incontro un carattere ‘A’ lo devo trasformare in ‘AB’;
- Se incontro un carattere ‘B’ lo devo trasformare in ‘A’.
Ipotizziamo ora di partire da una stringa ‘A’, alla prima iterazione otterremmo ‘AB’, poi ‘ABA’, quindi ‘ABAAB’ , ‘ABAABABA’ e via dicendo. Gli L-System sono molto interessanti in quanto ci consentono, con grammatiche un pò più complesse di quella appena osservata, di simulare la crescita di molti organismi appartenenti al mondo vegetale.
Per fare questo si associa ad ogni simbolo della grammatica un preciso significato (ad esempio potremmo dire che ‘A’ sta a significare ‘disegna una linea retta’ mentre ‘B’ potrebbe voler dire ‘ruota il cursore di 90 gradi’) e, dopo un certo numero di iterazioni, si scorre la stringa generata applicando ad ogni simbolo il significato pattuito.
Facciamo un esempio, supponiamo di voler sperimentare il famoso ‘Cantor Set‘, un prototipo di frattale che evidenzia un insieme di punti su di un segmento; ecco la definizione formale dell’L-System:
simboli : A B
assioma : A
regole : A → ABA, B → BBB
Associamo ora ai simboli il seguente significato:
- se trovo ‘A’ stampo una linea nera ( i punti fanno parte del set );
- se trovo ‘B’ ne stampo una rossa ( i punti non fanno parte del set );
Applicando iterativamente le regole partendo dalla stringa iniziale (formalmente detta assioma) ‘A’ e successivamente trasformando i simboli ottenuti nelle loro interpretazioni otteniamo il seguente risultato (una riga per ogni iterazione):
Per provare un pò di L-System ho sviluppato una piccolissima applicazione con Processing che non fa altro che applicare iterativamente delle regole del tipo appena visto dando poi la possibilità di specificare, di volta in volta, le interpretazioni necessarie ad ottenere risultati come quello illustrato qui sopra.
Il codice sorgente è, come al solito, disponibile sul mio account di github. Al prossimo appuntamento entreremo un pò più nel dettaglio delle varie famiglie di L-System ( indipendenti dal contesto/dipendenti dal contesto, deterministici o stocastici) e cercheremo di definire e sviluppare una grammatica che ci consenta di simulare la crescita di un’arbusto.
Tags: Engine, L-System, L0D-System, Processing.org