Hit Enter to regenerate the scene. The resulting images wrap, so if you make them smaller, you can tile with them.
int framesToDraw = 120;
int rectSize = 1;
int nSets = 7;
// set stringiness from 0.0 to 1.0
// higher gives more variation, but creates more isolated islands
float stringiness = 0.3;
boolean showBorders = false;
float seed;
int nWide, nHigh, nCells;
int[] cells;
int[] front;
int[] age;
int nFront;
int[] next;
int stepsPerFrame;
int choices[] = new int[4];
void drawCell( int ic, int iSet, int iAge ) {
if( iSet == 0 )
fill( 0, 0, 1 );
else
fill( ( iSet*0.618+seed+iAge/2724.0) % 1.0,
((iSet*0.7173) % 1.0) * 0.5 + 0.5,
(((iSet*0.8143+2.*seed) % 1.0) * 0.6 + 0.7) * (((iAge/(356.0*log(iSet+1)))%0.7)+0.3) );
rect( (ic % nWide) * rectSize, (ic / nWide) * rectSize, rectSize, rectSize );
}
void setup() {
size(1920,1080);
// fullScreen( P2D, SPAN );
doIt();
}
void doIt() {
seed = random(1.0);
background(0);
colorMode( HSB, 1, 1, 1 );
noStroke();
nWide = width/rectSize;
nHigh = height/rectSize;
nCells = nWide*nHigh;
stepsPerFrame = nCells / framesToDraw;
cells = new int[nCells];
front = new int[nCells];
age = new int[nCells];
next = new int[] { 1, nWide, nCells-1, nCells-nWide };
// find nSets count of unique starting cells
front[0] = (int)random(nCells);
cells[ front[0] ] = 1;
age[ front[0] ] = 0;
drawCell( front[0], 1, 0 );
for( int iSet=1; iSet<nSets; iSet++ ) {
do {
front[iSet] = (int)random(nCells);
} while( cells[ front[iSet] ] != 0 );
cells[ front[iSet] ] = iSet + 1;
age[ front[iSet] ] = 0;
drawCell( front[iSet], iSet+1, 0 );
}
nFront = nSets;
}
void draw() {
for( int iStep=0; nFront > 0 && iStep < stepsPerFrame; iStep++ ) {
int iFront = nFront - 1;
int s = 1;
if( random(1.0) >= stringiness ) {
float r = random(1.0);
iFront = (int)(nFront*r*r*r*r);
s = 3;
}
int iCell = front[ iFront ];
int nChoices = 0;
for( int iDir=0; iDir<4; iDir++ ) {
int ioc = (iCell + next[iDir]) % nCells;
if( cells[ ioc ] == 0 )
choices[ nChoices++ ] = ioc;
else if( showBorders && (iDir == 0 || iDir == 1) &&
cells[ ioc ] != cells[ iCell ] ) {
drawCell( ioc, 0, 0 );
}
}
if( nChoices > 0 ) {
int ioc = choices[ (int)random(nChoices) ];
cells[ ioc ] = cells[ iCell ];
age[ ioc ] = age[ iCell ] + s;
front[ nFront++ ] = ioc;
drawCell( ioc, cells[ioc], age[ioc] );
}
if( nChoices < 2 ) {
front[ iFront ] = front[ nFront-1 ];
nFront--;
}
}
}
void keyPressed() {
if( key == ESC ) exit();
if( key == ENTER ) doIt();
}