Author Archives: admin

Albero

Il classico albero frattale con angolo di 90° tra i rami

albero45

startshape ALBERO45
rule ALBERO45
{
    SQUARE { size 1 10 sat 1 b .3 }
    ALBERO45 { x -2 y +6.6 rotate +45 size 0.598 hue 15}
    ALBERO45 { x +2 y +6.6 rotate -45 size 0.598 hue 15}
}

Ripetizione

Quando si vuole ripetere la stessa figura più volte si può ripetere la chiamata, cambiando per esempio la proprietà x

cerchi1_41

startshape CERCHI4
rule CERCHI4
{
  CERCHI1{}
  CERCHI1{x +1}
  CERCHI1{x +2}
  CERCHI1{x +3}
}
rule CERCHI1
{
  CIRCLE{}
  CERCHI1{ s 0.75 b 0.2 }
}

Esiste la possibilità di indicare quante volte si vuole ripetere la chiamata e come cambiano le proprietà

startshape CERCHI4

rule CERCHI4
{
  4*{x +1}CERCHI1{}
}
rule CERCHI1
{
  CIRCLE{}
  CERCHI1{ s 0.75 b 0.2 }
}

Quando il numero di ripetizioni è elevato questa possibilità aiuta a non commettere errori!

tono

Confronta il codice seguente con l’originale!

startshape COLORE

rule COLORE
{
  24*{r 15 hue 15 }SQUARE{ x +1 size 0.3 sat 1 b 1 }
}

 

A questo punto conviene approfittare della ripetizione: 360 volte con angolo 

tono2

startshape COLORE

rule COLORE
{
  360*{r 1 hue 1 }SQUARE{ x 1.5 size 1 0.1 sat 1 b 1 }
}

 

La semplicità con cui si possono posizionare le figure su una circonferenza permette spunti interessanti

triangoliruotati_r

startshape RUOTARER
rule RUOTARER
{
    CIRCLE { size 4 b 0.55 }

    12*{r +30}TRIANGLE { x +2 size 0.66 1 }
}

Casualità

Se una regola compare definita più volte ContextFree sceglierà in modo casuale quale eseguire, quindi per ogni comando Render si otterrà una figura potenzialmente diversa.

Se c’è un numero tra il nome della regola e la parentesi graffa aperta questo sarà utilizzato come peso altrimenti il valore di default è 1 per tutte

startshape FIGURA
rule FIGURA 3
{
  SQUARE {}
}
rule FIGURA 1.5
{
  CIRCLE {} 
}
rule FIGURA 0.5
{
  TRIANGLE {}
}

In questo caso i pesi sono 31.5 e 0.5 per un totale di 5.
Il quadrato comparirà con probabilità 3/5 = 0.6 (… 0.3 per il cerchio e 0.1 per il triangolo)

Combinando ricorsione e casualità si ottengono delle figure molto interessanti…

figurerandom

Si tratta di due chiamate ricorsive alla regola FIGURERAND{} ma la FIGURA{} renderizzata può essere un cerchio o un quadrato

startshape FIGURERAND
rule FIGURERAND
{
  FIGURA{}
  FIGURERAND{ s 0.5 x -0.25 b 0.2 }
  FIGURERAND{ s 0.5 x +0.25 b 0.2 }
}
rule FIGURA{ CIRCLE{} }
rule FIGURA{ SQUARE{} }

Nota

Se una figura è interessante si può forzare ContextFree a generarla di nuovo utilizzando il tasto < nella barra degli strumenti.
In pratica per ogni rendering viene generato un codice di tre lettere che può essere trascritto per essere riutilizzato in seguito oppure può essere recuperato subito tramite i tasti < >.

Ricorsione

Una regola contiene a sua volta la chiamata di altre regole, ma se chiama se stessa?

cerchi1

Il primo cerchio nero, è seguito da un cerchio più piccolo e più chiaro, che a sua volta …

startshape CERCHI1
rule CERCHI1
{
  CIRCLE{}
  CERCHI1{ s 0.75 b 0.2 }
}

ContextFree smette di rincorrere le chiamate ricorsive quando la dimensione della figura non è più significativa, altrimenti il rendering richiederebbe tempi infiniti!

 

Le chiamate ricorsive possono essere due

cerchi2

startshape CERCHI2
rule CERCHI2
{
  CIRCLE{}
  CERCHI2{ s 0.5 x -0.25 b 0.2 }
  CERCHI2{ s 0.5 x +0.25 b 0.2 }
}

Quattro… ma il tempo di rendering aumenta notevolmente

cerchi4

startshape CERCHI4
rule CERCHI4
{
  CIRCLE{}
  CERCHI4{ s 0.45 x -0.25 b 0.2 }
  CERCHI4{ s 0.45 x +0.25 b 0.2 }
  CERCHI4{ s 0.45 y -0.25 b 0.2 }
  CERCHI4{ s 0.45 y +0.25 b 0.2 }
}

Si rende necessario ridurre size (basta già da 0.5 a 0.45…) per raggiungere prima la fine della ricorsione…

Parametri

Se la chiamata di una regola ha dei parametri allora le alterazioni si ripercuotono a catena sulle chiamate successive

trefigure4

Il cerchio ha la dimensione, size, ridotta al 75% di quella del quadrato, il triangolo al 75% di quella del cerchio, quindi al 56,25%di quella del quadrato… Analogamente per brightness aumenta la brillantezza del 33% ad ogni passo.

startshape FIGUREBASE
rule FIGUREBASE
{
  SQUARE{}
  FIGURA2{s 0.75 b 0.33}
}
rule FIGURA2
{
  CIRCLE{}
  FIGURA3{s 0.75 b 0.33}
}
rule FIGURA3
{
  TRIANGLE{}
}

In pratica

FIGUREBASE{} => SQUARE{} | (s 0.75 b 0.33)FIGURA2{}
             => SQUARE{} | (s 0.75 b 0.33)(CIRCLE{} | (s 0.75 b 0.33)FIGURA3{})
             => SQUARE{} | (s 0.75 b 0.33)(CIRCLE{} | (s 0.75 b 0.33)(s 0.75 b 0.33)FIGURA3{}
             => SQUARE{} | (s 0.75 b 0.33)(CIRCLE{} | (s 0.75 b 0.33)(s 0.75 b 0.33)TRIANGLE{}

Il triangolo subisce gli effetti di due trasformazioni

(s 0.75 b 0.33)(s 0.75 b 0.33)

Si può ottenere lo stesso risultato con il codice seguente

startshape FIGUREBASE
rule FIGUREBASE
{
  SQUARE{}
  CIRCLE{s 0.75 b 0.33}
  TRIANGLE{s 0.5625 b 0.44} // da controllare...
}

dove le alterazioni sono state applicate direttamente.

Sostituzione

Una regola

rule FIGUREBASE{ /* ... */ }

specifica un elenco di nomi di figure primitive, eventualmente con parametri

startshape FIGUREBASE
rule FIGUREBASE
{
  SQUARE{}
  CIRCLE{x -1}
  TRIANGLE{x +1}
}

trefigure1
oppure un elenco di regole, eventualmente con parametri

startshape FIGUREBASE
rule FIGUREBASE
{
  FIGURA1{}
  FIGURA2{}
  FIGURA3{}
}
rule FIGURA1
{
  SQUARE{}
}
rule FIGURA2
{
  CIRCLE{x -1}
}
rule FIGURA3
{
  TRIANGLE{x +1}
}

oppure sia nomi di figure che regole

startshape FIGUREBASE
rule FIGUREBASE
{
  SQUARE{}
  FIGURA2{}
}
rule FIGURA2
{
  CIRCLE{x -1}
  FIGURA3{}
}
rule FIGURA3
{
  TRIANGLE{x +1}
}

I tre codici precedenti producono la stessa immagine…

ContextFree segue il percorso delle regole, a partire da quella specificata con startshape, e effettuando una sorta di sostituzione di ogni regola con la definizione corrispondente, continua finché ottiene una sequenza di specifiche di figure primitive che costituiscono il risultato finale.

Nel primo caso

FIGUREBASE{} ==> SQUARE{} | CIRCLE{x -1} | TRIANGLE{x +1}

Nel secondo

FIGUREBASE{} ==> FIGURA1{} | FIGURA2{} | FIGURA3{}
             ==> SQUARE{} | CIRCLE{x -1} | TRIANGLE{x +1}

Nel terzo

FIGUREBASE{} ==> SQUARE{} | FIGURA2{}
             ==> SQUARE{} | CIRCLE{x -1} | FIGURA3{}
             ==> SQUARE{} | CIRCLE{x -1} | TRIANGLE{x +1}

Figure primitive

Le figure primitive che possono essere disegnate da CFDG sono SQUARECIRCLE e TRIANGLE cioè quadrato, cerchio e triangolo

trefigure1

startshape FIGUREBASE1

rule FIGUREBASE1
{
  SQUARE{}
  CIRCLE{x -1}
  TRIANGLE{x 1}
}

Il cerchio è traslato verso sinistra e il triangolo verso destra tramite il parametro x.

 

Si possono alterare altri parametri, come brightness

trefigure2

startshape FIGUREBASE2

rule FIGUREBASE2
{
  SQUARE{}
  CIRCLE{x -1 b .33}
  TRIANGLE{x 1 b .66}
}

Se non si specificano i parametri essi assumono i valori di default segeuenti

size 1 1
rotation 0
skew 0 0
flip // non applicato
hue 0
saturation 0
brightness 0
alpha 1

 

Per confrontare le dimensioni delle figure è possibile sovrapporle

trefigure3

startshape FIGUREBASE3

rule FIGUREBASE3
{
  SQUARE{b 0.0}
  CIRCLE{b 0.33}
  TRIANGLE{b 0.66}
}

La figure primitive, senza alterazioni dei parametri, sono disegnate con

  • colore nero opaco
  • diametro del cerchio, lato del quadrato e lato del triangolo uguali
  • centri coincidenti.

Background

Con la direttiva background si specifica il colore dello sfondo per l’immagine. È facoltativa.

La forma più complessa prevede tutti i parametri per il colore

background { hue ... saturation ... brightness ... alpha ... }

Altrimenti sono applicati i valori di default che producono bianco opaco.

Alcuni valori sono di uso più frequente

background { brightness -1 } // nero opaco
background { alpha -1 }      // trasparente

Include

Con la direttiva include si specifica il nome di un file CFDG il cui codice sarà incluso nel file attuale. È facoltativa.

include sorgente.cfdg

In questo modo è possibile utilizzare regole già specificate in altri file senza doverle riscrivere.

La regola polygon5sided{} è specificata nel file i_polygons.cfdg.

pentagono

include i_polygons.cfdg
startshape PENTAGONO
rule PENTAGONO { polygon5sided{} }

In Context Free sono già presenti tre librerie di regole: i_curvesi_pixi_polygons.
Ogni libreria ha la sua direttiva startshape che permette di testare tutte le regole presenti.
Quando la libreria sarà inclusa in un altro file sarà la prima direttiva startshape presente a decidere quale regola sarà eseguita per prima.

Startshape

Con la direttiva startshape si indica a CFDG quale regola deve essere utilizzata per prima nella generazione dell’immagine.
È obbligatoria.

startshape REGOLAX
rule REGOLAA { /* ... */ }
rule REGOLAB { /* ... */ }
// ...
rule REGOLAX { /* ... */ }
// ...
rule REGOLAZ { /* ... */ }

Quindi in presenza delle regole REGOLAAREGOLAB, …, REGOLAX, …, REGOLAZ, la prima ad essere eseguita sarà REGOLAX perché specificata dalla direttiva startshape.