Arte generativa con FreeBASIC

Tutti sanno che nell’ottobre del 1917 ci fu una rivoluzione.

Fu proprio in quel mese, infatti, che uscì il primo numero della rivista Lo stile intorno alla quale si sviluppò il movimento artistico del neoplasticismo. Movimento che nel campo della pittura si basava su principi astratti e geometrici. Proprio per questo si fa riferimento al neoplasticismo anche definendolo astrattismo geometrico.

Tra i fondatori della rivista e del movimento ci fu il pittore Piet Mondrian le cui opere più famose sono composizioni dove compaiono soltanto linee nere orizzontali o verticali che dividono la tela in figure geometriche rettangolari o quadrate, alcune delle quali – la minoranza – sono colorate utilizzando soltanto i colori primari (rosso, giallo e blu). Molte parti, quindi, rimangono bianche.

Ma questo blog non parla di coding e del linguaggio di programmazione FreeBASIC? Cosa c’entra dunque l’arte?

In realtà esiste un elemento in comune tra queste due forme di espressione umana: la creatività.

Sebbene la creatività interessi molte fasi del ciclo della produzione del software (per esempio quella relativa al problem solving), qui vorrei concentrarmi soltanto su uno specifico campo di applicazione dello sviluppo del codice che è quello della cosiddetta Arte generativa: ovvero scrivere del codice che in maniera autonoma, o semi-autonoma, generi delle opere d’arte.

Generatore di immagini in stile Mondrian

Questo blog ha un taglio molto pratico e quindi vediamo subito insieme un esempio di come creare un piccolo programma in FreeBASIC che generi in maniera casuale – e quindi autonoma – delle immagini che richiamino almeno in parte lo stile di Mondrian.

Algoritmo

Ecco in sintesi i passi del nostro algoritmo:

  • Creare una finestra con l’istruzione screenres.
  • Inserire all’interno di un ciclo do-loop il codice per raccogliere l’input dell’utente attraverso l’istruzione getkey e poi con la struttura di controllo select case discriminare la prosecuzione delle operazioni:
    • In un caso disegnare le figure con l’istruzione line le cui dimensioni e colore sono definiti in maniera aleatoria attraverso l’istruzione rnd che genera un numero pseudo-casuale basato sull’algoritmo Mersenne Twister.
    • Nell’altro uscire dal programma.

Codice sorgente

''project:     fb_mondrian.bas
''license:     GNU GPL v3
''version:     beta
''date:        September 20, 2020
''description: Mondrian style images generator
''author:      Luca Evangelisti
''web:         https://ciucoinformatico.home.blog/

dim as long key ''key entered

dim w as integer ''width of canvas
dim h as integer ''height of canvas

declare sub draw_image(w as integer, h as integer)

''canvas's size
w = 1000
h= 617

screenres w, h, 32
windowtitle("fb_mondrian.bas | Mondrian style images generator")

''color:
'' foreground: black
'' background: white
color(rgb(255,255,255),rgb(0,0,0))
cls

'menu
print "Press <Enter> to generate the image."
print "Press <Esc> to exit the programme."

''seeds the random number generator
randomize

do
  key = getkey

  select case key
    case 13 ''carriage return
      cls
      draw_image(w, h)
    case 27 '' quit
      exit do
    case else ''none
  end select

  ''to avoid unwanted or repeated characters,
  ''this loop works until the inkey buffer is empty
  while inkey <> "": wend
loop

''draws image
sub draw_image(w as integer, h as integer)
  dim free_w as integer '' free width
  dim free_h as integer ''free height
  dim as integer fill_color
  dim as integer x1, y1, x2, y2 = 0
  dim as integer margin = 10
  free_w = w
  free_h = h
  do
    y2 = int(rnd * h) + y1
    do
      x2 = int(rnd * w) + x1
      fill_color = int(rnd * 8) + 1
      select case fill_color
        case 1 ''yellow
          line(x1,y1)-(x2,y2),rgb(255,255,0),BF
        case 2 ''red
          line(x1,y1)-(x2,y2),rgb(255,0,0),BF
        case 3 ''blue
          line(x1,y1)-(x2,y2),rgb(0,0,255),BF
        case 4 to 8 ''white
          line(x1,y1)-(x2,y2),rgb(255,255,255),BF
        case else
      end select
      x1 = x2 + margin
    loop until x2 > w
    x1 = 0
    y1 = y2 + margin
  loop until y2 > h
end sub

Provate pure liberamente a modificarlo.

Ciao e al prossimo articolo. 🙂

FreeBASIC – la linea

Dopo aver visto come lavorare con il punto, con questo articolo vedremo come lavorare con un altro ente geometrico fondamentale di Euclide: la linea retta.

In realtà ciò che potremo effettivamente disegnare a video sarà soltanto una parte della linea retta: ovvero un segmento.

L’istruzione che utilizzeremo ci permetterà di costruire anche due figure geometriche: il quadrato e il rettangolo.

Istruzione line

In freeBASIC per tracciare un segmento si usa l’istruzione line.

Vediamo in un semplice programma i diversi modi di utilizzo.

screen 19, 32

''primo piano nero, sfondo bianco
color (rgb(0,0,0),rgb(255,255,255))

cls

locate 1: print "Istruzione line"

''1) segmento rosso orizzontale continuo 
locate 3: print "1)"
line (25,40)-(500,40),rgb(255,0,0)

''2) segmento blu orizzontale con tratteggio irregolare 
locate 5: print "2)" 
line (25,70)-(300,70),rgb(0,0,255),,&b1110010011100100

''3) rettangolo verde vuoto con tratteggio regolare
locate 7: print "3)"
line (25,100)-(125,120),rgb(0,255,0),B,&b1111111100000000

''4) quadrato giallo pieno con le coordinate del
''   secondo vertice relative a quelle del primo vertice
''   e diagonale magenta tratteggiata
locate 9: print "4)"
line (25,130)-step(100,100),rgb(255,255,0),BF
line (25,130)-step(100,100),rgb(255,0,255),,&b1100110011001100

sleep

Il codice più sopra riportato si spiega in gran parte da sé, ma forse è bene chiarire il funzionamento di due argomenti di questa istruzione:

  • il primo riguarda il parametro B o BF: in pratica se si vuole disegnare soltanto il perimetro della figura si indica la lettera B che sta per box (scatola), mentre se si vuole colorare l’intera figura si indicano le lettere BF che stanno per box filled (scatola riempita);
  • il secondo è quello che specifica lo stile del segmento. Lo si fa scrivendo un letterale numerico intero in forma binaria con 16 bits. Questo valore rappresenta una maschera di bits (bitmask) dove al valore 1 corrisponde un pixel acceso e al valore 0 un pixel spento. La maschera viene ripetuta per tutta la lunghezza del segmento.

Bene. Per oggi ci fermiamo qui. Nel prossimo articolo vedremo come lavorare con il cerchio e l’ellisse. 🙂

FreeBASIC – colori

In questo nuovo articolo andremo alla scoperta di come si può lavorare con i colori in FreeBASIC.

Funzione color

La prima funzione che incontriamo è la funzione color che ci permette di fare tre cose:

  • impostare il colore del primo piano (foreground)
  • impostare il colore dello sfondo (background)
  • ottenere i colori correnti del primo piano e dello sfondo

Impostare i colori del primo piano e dello sfondo

L’impostazione del colore del primo piano e dello sfondo, oltre ad avere diretto effetto sullo schermo grafico, ha effetto anche sulle figure che vengono su questo disegnate, per esempio con le funzioni line o circle, se non si specifica con queste istruzioni l’attributo relativo al loro colore.

Definire un colore con la funzione rgb

La funzione rgb permette di valorizzare distintamente i tre colori primari percepiti dal nostro occhio per sintesi additiva: rosso (red), verde (green) e blu (blue).

Nel mondo dei computer si fa largo uso del modello di colori RGB.

Vediamo un esempio:

''imposta la risoluzione dello schermo e quella grafica
screen 19, 32

''imposta il colore rosso per il primo piano e
''il colore zafferano per lo sfondo
color(rgb(255,0,0), rgb(244,196,48))

''pulisce lo schermo per rendere visibile il
''colore dello sfondo appena impostato
cls

print "Cosa sono i colori?"

sleep

Su Wikipedia è disponibile una lista dei colori molto utile per il programmatore.

Definire un colore con la tavolozza dei colori predefinita

In FreeBASIC è disponibile una tavolozza dei colori predefinita (default pallettes) che raggruppa una serie di colori visualizzabili in base alla modalità grafica scelta.

Per impostare uno di questi colori basterà specificare il relativo valore associato.

screen 12
color(1, 5) ''primo piano blu e sfondo rosa
cls
print "ciao"
sleep

In FreeBASIC è anche possibile cambiare la tavolozza dei colori attraverso l’istruzione palette, ma questa possibilità non verrà esplorata in questo articolo.

Ottenere il colore del primo piano e dello sfondo

La funzione color restituisce un valore ulong (ovvero un valore di tipo long senza però il segno) che contiene l’informazione dei valori del primo piano e dello sfondo correnti:

dim c as ulong
c = color()
print "Colori della console:"
print "primo piano:"; loword(c)
print "sfondo:"; hiword(c)

Ottenere il colore di un pixel

Oltre al colore del primo piano e dello sfondo, potremmo essere interessati a conoscere il colore di uno specifico punto dello schermo (pixel).

Per fare questo possiamo utilizzare la funzione point:

screen 12
color(1, 5) ''primo piano blu e sfondo rosa 
cls
line(10,10)-(40,10), 2 ''disegna una linea verde
locate 4,1: print "colore dello sfondo:"; point(5,5)
locate 5,1: print "colore di un pixel della linea:"; point(20,10)
sleep

Bene! Come introduzione al mondo dei colori in FreeBASIC possiamo fermarci qui.

A presto. 🙂