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:     mondrian.bas
''license:     GNU GPL v3
''version:     beta
''date:        September 20, 2020
''description: Mondrian style images generator
''author:      ciuco informatico
''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 – lavorare con i files [4]

Nel precedente articolo abbiamo visto la modalità di accesso binary per lavorare con i files binari.

Oggi vedremo come creare un database: ovvero un file binario contenente dati organizzati in records.

Possiamo immaginare un record come una singola riga di una tabella contenente una o più di queste righe. Un record è composto a sua volta da uno o più campi che contengono ciascuno uno specifico tipo di dato (stringa, intero, ecc.). I records devono avere una lunghezza in bytes predefinita.

Per accedere ai campi dei singoli records si utilizza la modalità di accesso random.

Prima però di aprire un file binario in modalità random, è necessario definire il tipo di dato che rappresenterà il nostro record . Abbiamo già visto come farlo nell’articolo che trattava appunto il tipo di dato definito dall’utente.

Vediamo un esempio:

'definizione del tipo di dato (record)
type persona
nome as string * 10
cognome as string * 20
anno_di_nascita as integer
patente as boolean
end type

'dimensionamento e creazione della variabile associata al record
dim p1 as persona
dim p2 as persona
dim px as persona

'valorizzazione dei dati
p1.nome = "Mario"
p1.cognome = "Rossi"
p1.anno_di_nascita = 1977
p1.patente = false
p2.nome = "Maria"
p2.cognome = "Bianchi"
p2.anno_di_nascita = 1985
p2.patente = true

'crea il file
open "mio_db.dat" for random as #1 len=sizeof(persona)
put #1, 1, p1
put #1, 2, p2
close #1

'apri il file e leggi un dato
open "mio_db.dat" for random as #1 len=sizeof(persona)
get #1, 2, px
close #1

'stampa i dati del record 2
print "Nome: "; px.nome
print "Cognome: "; px.cognome
print "Anno di nascita: "; px.anno_di_nascita
print "Patente: "; px.patente

Come avrete notato è stato necessario, sia in fase di creazione che di lettura del file binario, specificare la lunghezza in byte del record. Per farlo si è utilizzata la funzione sizeof().

Bene. Con i files per adesso possiamo fermarci qui.

Nei prossimi articoli inizieremo a creare le nostre prime finestre grafiche. 🙂