int[][] blocks;
int num = 50;
int bsize = 10;
void setup(){
size(500, 500, P3D);
blocks = new int[num][num];
for(int x = 0; x < num; x++){
for(int y = 0; y < num; y++){
blocks[x][y] = 0;
}
}
noStroke();
stroke(128);
fill(255);
}
void draw(){
background(255);
lights();
translate(width / 2, height / 2, -200);
rotateX(PI / 3);
rotateZ(frameCount * 0.005);
for(int x = 0; x < num; x++){
for(int y = 0; y < num; y++){
for(int z = 0; z < blocks[x][y]; z++){
pushMatrix();
translate(x * bsize - width / 2, y * bsize - height / 2, z * bsize);
box(bsize);
popMatrix();
}
}
}
int sum = 0;
int[][] eachSum = new int[num][num];
for(int x = 0; x < num; x++){
for(int y = 0; y < num; y++){
int left = x != 0 ? x - 1: num - 1;
int right = x != num - 1 ? x + 1: 0;
int up = y != 0 ? y - 1: num - 1;
int down = y != num - 1 ? y + 1: 0;
int s = blocks[x][y] + blocks[left][y] + blocks[right][y]
+ blocks[x][up] + blocks[x][down] + 1;
sum += s;
eachSum[x][y] = s;
}
}
float rnd = random(1);
float prob = 0.0;
for(int x = 0; x < num; x++){
for(int y = 0; y < num; y++){
prob += float(eachSum[x][y]) / sum;
if(rnd < prob){
blocks[x][y] += 1;
return;
}
}
}
}