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:
- Dibuixar tota la imatge dins del
setup()i deixar eldraw()buit. - Posar la instrucció
noLoop()dins delsetup(). Això farà que eldraw()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
- 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()! - 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.
- 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
arrayamb 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.