E.7 - Generatività

Obiettivo
Far generare un'immagine grafica o un'animazione definendo il comportamento e le modalità di visualizzazione di qualche centinaio di agenti autonomi.
Modalità
- definire la classe di un agente autonomo con proprietà e metodi che ne consentano un uso grafico;
- creare e riempire (nel
setup()o progressivamente) un array di agenti autonomi basati sulla classe definita; - creare il codice che permetta l'evoluzione degli agenti e disegni immagini dipendenti dalle loro proprietà.
Il canvas dovrà avere una risoluzione di almeno 600x600 pixel e potrà essere anche rettangolare.
Il codice base potrebbe essere strutturato in questo modo:
// DEFINIZIONE DELLA CLASSE
function Agente( partenza ) {
// proprietà
this.pos = partenza.copy();
this.vel = p5.Vector.random2D();
// metodi
this.display = function() { // disegna agente
ellipse( this.pos.x,this.pos.y, 9,9 );
};
this.update = function() { // aggiorna proprietà
if (this.pos.dist(centro) > 290) {
this.vel.mult( -1 );
}
if (random() < 0.33) {
this.vel.rotate( random(-0.4,0.4) );
}
this.pos.add( this.vel );
};
}
// DATI GLOBALI
var agenti = []; // array degli agenti
var agentiMax = 500; // numero massimo di agenti
var centro;
// INIZIALIZZAZIONI
function setup() {
createCanvas(600, 600);
centro = createVector(width/2, height/2);
}
// DISEGNO DEI FOTOGRAMMI
function draw() {
// aggiunta progressiva degli agenti
if (random() < 0.2) {
agenti.push( new Agente(centro) );
if (agenti.length > agentiMax) {
agenti.shift();
}
}
// aggiornamento e disegno
for (var i=0; i<agenti.length; ++i) {
agenti[i].update();
agenti[i].display();
}
}
- possono essere aggiunti o modificati sia le proprietà (se servono dati associati a ogni agente) che i metodi; si sconsiglia di eliminare i due metodi di base (
display()eupdate()); - possono essere definite liberamente variabili globali con valori utili a tutti gli agenti ma l'array
agentideve, ovviamente, rimanere; - oltre a eventuali nuove inizializzazioni, nel
setup()può essere prevista la creazione dell'array ma gli agenti possono essere aggiunti anche progressivamente [vedidraw()]; - il
draw()dell'esempio genera l'immagine disegnando i singoli agenti ma il "disegno" può essere creato usando liberamente le prorietà degli agenti che, al limite, possono anche non essere disegnati.
Su OpenProcessing si possono trovare uno sketch di base e due varianti:
- variante E.7b - con creazione iniziale degli agenti, rimbalzo sui lati del canvas, disegno di linee fra gli agenti e dissolvenza dei fotogrammi precedenti;
- variante E.7c - con creazione iniziale degli agenti, uso di caratteri e simboli tipografici orientati, rientro degli agenti dal lato opposto a quello di uscita e confronto fra le proprietà di tutti gli agenti.
Consegna
L'esercitazione andrà caricata nel gruppo "Esercitazione 7" della classroom: openprocessing.org/class/57250
Per maggiori informazioni sul caricamento delle esercitazioni si può consultare la pagina sull'uso di OpenProcessing.