venerdì 8 gennaio 2010

Context Free Art

Ho scoperto Context Free Art e mi piace moltissimo!
CFDG è un simpatico programma open source che permette di generare immagini da algoritmi descritti in maniera molto semplice, senza la complessa sintassi tipica dei linguaggi di programmazione a cui siamo abituati. Ciò è reso possibile grazie all'utilizzo di una grammatica libera dal contesto, che è una forma di grammatica formale.




Una grammatica formale è qualcosa di diverso dalla grammatica dei linguaggi naturali, le sue regole sono regole matematiche e astratte, e per definizione deve essere costituita da:
  • Un insieme finito di simboli terminali (in pratica lettere).
  • Un insieme finito di simboli non terminali.
  • Un insieme finito di regole di produzione.
  • Un simbolo iniziale.
Con questi elementi è possibile generare un certo numero di stringhe che sono le parole che nel loro insieme formano il linguaggio formale.

Noam Chomsky è stato il pioniere che durante gli anni 50 studiò i vari tipi di grammatiche formali e fu il primo a descriverne una gerarchia in base al loro potere generativo. La sua ricerca era orientata verso la comprensione delle strutture dei linguaggi naturali, quelli parlati da noi umani, ma i principi da lui esposti possono essere utilizzati anche per altri scopi.

Chris Coyne è quello che ha scritto CFDG e per farlo si è basato su questi principi, solo che il suo programma usa come simboli terminali forme anzichè lettere. Quest'approccio permette di generare forme complesse a partire da forme semplici quali quadrati, triangoli e cerchi.


Per dare un'idea del potenziale di questo fantastico software pubblico qui sotto qualche immagine che ho generato in questi giorni accompagnate dai rispettivi codici. Vedrete come poche righe bastino per avere risultati complessi.
Siccome mi trovo a Crotone, terra di Pitagora, ho cominciato generando un semplice albero pitagorico:
startshape ALBEROPITAGORICO

rule ALBEROPITAGORICO {
 SQUARE {}
 ALBEROPITAGORICO {y 1 x -0.5 r 45 s 0.7}
 ALBEROPITAGORICO {y 1 x 0.5 r -45 s 0.7}
}



È immediatamente evidente come sia semplice creare un'iterazione.
startshape è la prima istruzione obbligatoria, e indica la forma base, in questo caso ALBEROPITAGORICO. ALBEROPITAGORICO è la prima e unica regola, crea un quadrato e poi chiama se stessa due volte, ma con qualche variazione. In entrambi i casi crea un quadrato più piccolo, pari al 70% del primo, ma mentre nel primo caso il quadrato è ruotato di 45°, nel secondo invece è ruotato di -45°. Anche la posizione rispetto all'asse x è diversa nei due quadrati "figli", poichè sono posizionati ognuno su un lato diverso, mentre quella rispetto all'asse y è uguale nei due casi, perchè entrambi sono sopra il quadrato "padre".
Tale operazione viene ripetuta per ogni quadrato figlio (iterazione) generando il frattale qui sopra.

Poichè parliamo di Pitagora e poichè da poco so cos'è un coseno ho deciso di generare un'altro albero simile al primo ma con le proporzioni dei quadrati figli diverse, in modo da avere un triangolo rettangolo tra i quadrati.
Poichè un angolo deve essere di 90° ho ruotato i quadrati figli di 60° e 30°, e per la grandezza ho dato il valore di sin(30) al più piccolo e di cos(30) al più grande. Qualche aggiustamento agli assi x e y et voilà:

startshape ALBEROPITAGORICO_RETTANGOLO

rule ALBEROPITAGORICO_RETTANGOLO {
 SQUARE{}
 ALBEROPITAGORICO_RETTANGOLO {y 1.1 x 0.34 r -30 s 0.87}
 ALBEROPITAGORICO_RETTANGOLO {y 0.85 x -0.6 r 60 s 0.5}
}


Infine ho preso questo bel ramo a spirale e l'ho ruotato 7 volte di 45° in modo da avere una forma circolare composta da 8 rami che mi ricorda un cavolo, ecco dunque, senza ulteriori indugi, il cavolo pitagorico:
startshape CAVOLO_PITAGORICO

rule RAMO {
 SQUARE{}
 SQUARE{s 0.9 b 1}
 RAMO {y 1.1 x 0.34 r -30 s 0.87}
 RAMO {y 0.85 x -0.6 r 60 s 0.5}
}

rule CAVOLO_PITAGORICO {
 RAMO {}
 RAMO {r 45}
 RAMO {r 90}
 RAMO {r 135}
 RAMO {r 180}
 RAMO {r 225}
 RAMO {r 270}
 RAMO {r 315}
} 



Questa volta ho dovuto aggiungere un quadrato bianco più piccolo sopra ogni quadrato nero di base, per ottenere solo i bordi dei quadrati, in modo da non avere come risultato un'immagine troppo confusa.


Questo è quello che fin'ora ho fatto con CFDG, e sopratutto solo quello che ho capito del suo funzionamento. Per chi volesse approfondire, oltre ai tutorial sul sito ufficiale e alle varie pagine di wikipedia già linkate, consiglio un'ottimo articolo chiamato "Structural Synthesis using a Context-Free Grammar Approach" scaricabile in pdf da questo post, e le lezioni del corso "DECO2013: Generative Design Systems" consultabili qui. Essenziale è il pdf "Context Free in a Nutshell" che sta qui.

Nessun commento:

Posta un commento