Fractalia - Terra dei Frattali

Fractalia - Cosa sono i frattali?

    Vediamo, adesso, gli elementi principali per creare una formula. Prima di tutto, avete bisogno di un'idea della vostra formula. Il mio consiglio è quello di scrivervi su un pezzo di carta la formula generale che volete usare. Guardandola appena per cinque minuti, sicuramente vi verranno in testa molte altre idee su cosa aggiungere.

    Una formula ha bisogno dei parametri e delle variabili: le seconde sono praticamente delle lettere a cui è assegnato un valore numerico, mentre le prime sono come le seconde, soltanto che siamo noi che modifichiamo il loro valore nei parametri,  perché sono i valori che appaiono nella finestra Formula del Layer Properties.

    Vediamo un esempio pratico: supponiamo che mi venga in mente di creare una funzione di terzo grado, di questo tipo:

z3+z2+z+c

    La guardo un attimo: benissimo, funziona, ma potrei renderla più interessante, più personalizzabile se ci mettessi anche qualche costante, ottenendo una cosa del seguente tipo:

a*z3+b*z2+c*z+d

   In questo caso, posso fare in modo che la persona che usa la formula sia in grado di cambiare questi valori, in modo da modificare la formula: vediamo come fare. Al solito, create una nuova formula, andando su File->New->Fractal Formula e poi cliccando sul pulsante Create New Formula , come prima; abbiamo adesso vari parametri:a, b, c, d.

    Per creare il frattale standard di Mandelbrot, abbiamo fatto in modo che la costante sia il pixel da iterare, ed è quello che faremo, quindi, con la costante d. Per quanto riguarda le altre, dovremo fare in modo che sia l'utilizzatore a poter scegliere.


 

VARIABILI

    Per poter usare una variabile, dovremo prima dichiararla, di solito nelle sezioni global: oppure init: il dove vanno collocate dipende da come si usano. Vediamolo ne nostro caso: abbiamo quattro variabili, a, b, c, d: le prime tre devono essere costanti, rimangono uguali per ogni pixel che noi iteriamo; sono costanti in tutto lo sviluppo computazionale della formula. Dato, quindi, che devono essere inizializzate (assegnare un valore per la prima volta) soltanto una volta e basta, possono stare nella sezione global.

    Nel caso della variabile d, invece, cambia ogni volta che iteriamo un pixel diverso dall'altro, perché rappresenta appunto il valore complesso corrispondente al pixel: dato che deve essere inizializzato  una volta per ogni pixel, andrà nella sezione init.

    Ovviamente, è possibile dichiarare le variabili che dovrebbero stare nella sezione global anche nella sezione init, mentre, come capite, non è corretto il contrario. Nelle versioni precedenti di Ultrafractal, la sezione global neanche esisteva, e tutte le variabili andavano inizializzate ogni volta che si cambiava pixel. Teoricamente non cambia niente, ma quando avete a che fare con formule contenenti 50 o più variabili (e capiterà se farete formule importanti e belle corpose), questo rallenta il calcolo, perché deve inizializzare 50 variabili ad ogni pixel, mentre basterebbe soltanto una volta.

    Dicevamo, quindi che dobbiamo dichiarare (cioè dire al programma che sto usando delle variabili) a, b, c nella sezione global, e d nella sezione init, così:

 

Quando noi scriviamo complex prima della variabile, dichiariamo il tipo della variabile, cioè esplicitiamo il tipo di numeri che può contenere. I tipi possibili sono:

complex (dichiara valori complessi)
float (dichiara valori reali)
int (dichiara valori interi)
bool (dichiara variabili logiche)
color (usato negli algoritmi di colorazione diretta)

    Dato che noi vogliamo che le variabili siano complesse, useremo il tipo complex. Se per caso ci scordassimo di dichiarare una variabile, ma la utilizziamo lo stesso, il programma crederà che quella variabile sia di tipo complesso. Creerà un messaggio di avvertimento nel Compiler Message, che dirà che la variabile non è stata dichiarata. A volte si crea malfunzionamenti del programma (non che si scassa, ma che non gira la formula), per cui il mio consiglio è sempre quello di dichiarare tutte le variabili che usate, e di far in modo che non appaiano avvertimenti nel Compiler Message.

    Ora che abbiamo le variabili, si tratta di assegnar loro un valore, e si fa con i parametri:


 

PARAMETRI

    I parametri (e le funzioni, quando le useremo), sono il punto di collegamento fra la formula e l'utente, che può personalizzarla. Il loro uso è leggermente diverso da quello delle variabili. non si dichiarano, ma il loro tipo può essere comunque definito (vedremo come), e prima del loro nome devono essere preceduti dal simbolo @.

    Per poter usare i parametri, devo descriverli nella sezione default: della formula: lì vediamo il tipo di valore che deve assumere e cosucce varie. Supponiamo di voler creare un parametro che contenga il valore della variabile a. Dovrei scrivere qualcosa del tipo:

In questo modo ho definito il parametro che si chiama para (ma si poteva chiamare anche peppino o xyzalfa).

Caption rappresenta l'etichetta del parametro che appare nella formula (la scritta nera a sinistra), che dovrebbe essere esplicativa oppure meno. Dipende da voi. Creerete il vostro stile in men che non si dica.

Default è, per l'appunto, il valore di default che avrete non appena aprite la formula. E' qua che dichiarate, implicitamente, il tipo della formula: da come scrivete il valore. se lo scrivete come un numero complesso, come nel nostro caso, avrete un parametro complesso, se lo scrivete, ad esempio, 4.0, sarà un valore reale: scritto 4 sarà intero. Se scrivete True o False al posto del valore, sarà una variabile logica, e se gli assegnate vari valori, sarà di tipo enumerato. Questi ultimi due li vedremo più avanti. Ignorateli per ora.

Hint rappresenta un testo esplicativo che potete (ma anche no) mettere. Apparirà quando uno cliccherà prima nel punto interrogativo in alto a destra della finestra, e poi sopra il parametro. Provatelo anche quando usate altre formule: se sono scritte bene, conterranno sempre aiuti che vi potranno servire per comprendere meglio le formule e l'uso di ogni parametro.

   Altre cose più avanzate (come la visibilità ecc), saranno trattate più avanti. E' un argomento lungo, quello della scrittura delle formule, ma d'altronde devo essere esplicativo, e farvelo capire, specialmente per quelli che non hanno mai scritto programmi.

   Allo stesso modo, userò altri parametri, parb e parc:

Adesso, si tratta di assegnare questi valori alle variabili; si possono inizializzare (ed anzi, è sempre buona cosa farlo), direttamente quando vengono dichiarate: avrò, allora, una cosa del seguente tipo:

Ve lo ricordate, vero, che bisogna far precedere i valori dei parametri dal simbolo @?

   Comunque, adesso, abbiamo inizializzato tutte le variabili che ci servono (davvero? o manca qualcosa? vediamo se ci arrivate prima che lo dica io): andiamo nella sezione loop, e scriviamo la formula:

A questo punto, alcuni intelligenti fra di voi (gli altri lo sono pure, ma avranno programmato o per niente o per gioco), mi faranno una giustissima obiezione: non potevamo direttamente scrivere qualcosa del tipo:


invece di tutto quello di prima?

   Ovviamente sì, ed alcuni lo fanno, effettivamente, ma io preferisco sempre dichiarare variabili quando posso per i seguenti motivi:

  1. Mi secca dover scrivere @ ogni volta
  2. Dichiarando tutte le variabili prima vedo meglio se manca qualcosa nel programma.
  3. E' più elegante
  4. Nel dichiarare le variabili posso utilizzare istruzioni come If ecc (vedremo dopo, come sempre)
  5. Non posso modificare i valori dei parametri, mentre posso modificare quelli delle variabili
  6. Mi secca dover scrivere @ ogni volta
  7. Mi secca dover scrivere @ ogni volta

   Altri motivi vi verranno in mente a voi: state attenti a non prendere per oro colato quello che dico: a parte la condizione 4, infatti, tutte le altre sono condizioni di stile. Con la pratica deciderete voi stessi come scrivere al meglio e vostre formule

   Oddio, è vero che usare direttamente i parametri è leggermente più efficiente che usare variabili (questo, per chi sa programmare, vale perché le variabili sono trattate come tali,mentre i parametri sono trattati come costanti), ma non si nota tale efficienza se non in formule molto grosse, e sopratutto in cicli interni che si iterano molte volte (programmatori capire ora, altri capire dopo, AUGH!).

   Arrivati a questo punto, abbiamo la formula pronta. oppure no? Ormai avete capito cosa manca: il valore di bailout, per cui adesso andremo a prendere il valore di bailout e lo andremo a mettere nella rispettiva sezione. Scriveremo, quindi:

 

    Oppure create una nuova variabile, e assegnatele il valore. Scrivete da soli la sezione relativa a questa variabile in Default, stando attenti che stavolta si tratta di un valore reale, non più complesso; qua sotto c'è la formula completa che abbiamo ottenuto con questa parte di tutorial (amplieremo ancora la formula):

 

    E' importante, anche se non ai fini della formula, commentare le vostre funzioni, per capire cosa faccia una determinata sezione. Non è facile vedere a cosa serve una cosa, in formule più interessanti (cioè più grosse): I commenti si introducono mettendo il punto e virgola all'inizio della riga, o dopo la fine della riga, per aggiungere un commento nella stessa riga:

;questo è un commento

z = @para    ;commento dopo l'istruzione

    Non crediate che non servano i commenti, magari perchè, scrivendole voi, sapete bene cosa state facendo: se scrivete formule di tre pagine, e vi capiterà, e le riprenderete dopo una settimana, difficilmente caprete subito tutto quello che avete scritto, perchè non vi ricorderete tutto esattamente. I commenti sono anche utili per altre persone, che vogliono esaminare le vostre formule e capire come funzionano, magari perchè piacciono e vogliono trarne ispirazione.

    Adesso che abbiamo creato la formula, salvatela (vi consiglio nello stesso file dove avete messo la prima formula: se l'avete fatto in una diversa basta copiare ed incollare l'intera formula), giocateci quanto volete e dopo andate alla sezione successiva del tutorial, perché possiamo fare ancora molto con questa formula.

 

Cercate sempre di capire quali variabili potete
mettere nella sezione global: e quali
nella sezione init:
In questo modo riuscirete a velocizzare la formula
Assegnare il giusto tipo ad una variabile
è una cosa fondamentale: cercate sempre
di capire con quali valori volete avere a che
fare.
Hint è un comando importante, specialmente
se la vostra formula si basa su qualcosa di specifico.
Cercate di dare descrizioni chiare e coincise
dei parametri che rappresentano.
L'indentazione nella scrittura delle formule non è
necessaria, ma è importante per la chiarezza:
loop:
    z = ...
    If (...)
        z = ....
    Endif
Immagine ottenuta con la nostra formula.