Tema 5

Randomització controlada

Generació d'art aleatori amb paràmetres limitats. Descobreix com donar varietat i un toc orgànic a les teves obres sense caure en el caos visual absolut.

L'atzar pur vs l'atzar limitat

La funció random() és una de les més utilitzades en art generatiu. Ens permet generar números impredictibles. Tot i això, si la fem servir de manera absolutament lliure en tots els paràmetres (mida, color RGB, posició), el resultat acostuma a semblar un televisor espatllat.

La clau de l'estètica generativa és restringir els paràmetres de l'atzar.

  • random() (sense arguments): retorna un valor entre 0 i 1.
  • random(max): retorna un valor entre 0 i el número màxim.
  • random(min, max): retorna un valor dins d'un rang específic (Molt útil!).

Aturar l'epilèpsia: noLoop()

Per defecte, la funció draw() s'executa 60 vegades per segon. Si hi poses un random(), la pantalla parpellejarà frenèticament. Per generar una imatge fixa aleatòria, tenim dues opcions:

  1. Dibuixar tota la imatge dins del setup() i deixar el draw() buit.
  2. Posar la instrucció noLoop() dins del setup(). Això farà que el draw() s'executi només una vegada.

Exemple: Bosc de línies (Atzar limitat al rang Y)

function setup() {
  createCanvas(400, 200);
  noLoop(); // Dibuixa només un cop!
}

function draw() {
  background(245);
  stroke(0, 50);
  strokeWeight(2);
  
  for(let i = 0; i < 300; i++) {
    let x = random(width);
    let y1 = random(height/2, height); // Comença sempre a la meitat inferior
    let y2 = y1 - random(20, 80);      // Longitud controlada
    line(x, y1, x, y2);
  }
}

Limitar els colors amb Llistes (Arrays)

La millor manera de tenir atzar en el color sense crear "fang" visual és crear una paleta tancada. Podem fer-ho utilitzant un Array (una llista entre claudàtors []). Si li passem una llista al random(), escollirà un element a l'atzar.

// Definim una paleta de colors (en format hexadecimal)
let paleta = ['#FF595E', '#FFCA3A', '#8AC926', '#1982C4', '#6A4C93'];

function setup() {
  createCanvas(320, 200);
  noLoop();
  noStroke();
}

function draw() {
  background(30);
  for(let x = 20; x < width; x += 40) {
    for(let y = 20; y < height; y += 40) {
      fill(random(paleta)); // Tria un color de la llista
      let mida = random(10, 35); // Mida entre 10 i 35 píxels
      circle(x, y, mida);
    }
  }
}

Atzar orgànic: noise()

Mentre que random() fa salts completament impredictibles, p5.js ens ofereix la funció noise() (Perlin Noise). Aquesta funció genera números aleatoris però que estan suaument connectats entre ells. És ideal per simular fenòmens naturals com el contorn de les muntanyes, l'onatge o la textura de la fusta.

random() : Salts bruscos

noise() : Transició suau

// Codi per generar el terreny amb noise()
let temps = 0; // Variable per avançar pel 'paisatge' de noise

for(let x = 0; x < width; x += 5) {
  // noise() sempre retorna un valor entre 0 i 1. 
  // Fem servir map() per convertir-ho al rang d'alçada (50 a 150)
  let y = map(noise(temps), 0, 1, 50, 150);
  rect(x, y, 4, height - y);
  
  temps += 0.08; // Si puges aquest número, el terreny serà més abrupte
}

Exercicis per practicar

  1. Pluja: Dibuixa 100 petites línies blaves verticals aleatòries, però restringeix el seu gruix perquè sigui entre 1 i 3, i la seva llargada entre 10 i 30. No oblidis el noLoop()!
  2. Mondrian aleatori: Dibuixa un grid (graella) de rectangles. Utilitza un array amb els colors de Mondrian (Vermell, Blau, Groc, Blanc) i pinta'ls a l'atzar.
  3. Paisatge de muntanyes: Dibuixa 3 capes diferents de terreny utilitzant noise(). Fes que les muntanyes del fons siguin més clares i menys abruptes (augmentant l'increment de la variable 'temps' molt poquet, per ex. 0.02), i les de davant més fosques.

Reflexió artística

La programació creativa requereix un equilibri constant entre el control absolut i el caos total. Si programes cada posició exacta d'un gràfic, el resultat pot ser rígid i avorrit. Si ho deixes tot a l'atzar, la imatge pot no tenir sentit. Com a "artista-programador", el teu rol no és tant dibuixar la línia final, sinó dissenyar les regles i els límits dins els quals la màquina pot jugar i sorprendre't.

Mini-projecte: Generador de Cartells Abstractes

Crea un "generador" que cada cop que recarreguis la pàgina produeixi un disseny geomètric harmònic diferent.

  • Defineix un array amb una paleta de 4 o 5 colors ben triats (pots buscar-los a webs com Coolors).
  • Fes servir un bucle gran per dibuixar 20 o 30 formes grans (cercles, rectangles o línies gruixudes).
  • Utilitza random() per triar el color, la posició (x, y) i la mida, però sempre dins d'uns límits raonables perquè es vegi estètic.
  • Afegeix una mica de transparència als colors per aconseguir mescles de to interessants.
  • Opcional: Fes servir random([true, false]) per decidir si dibuixes un cercle o un quadrat a cada iteració del bucle.