Daily Creative Coding

元「30 min. Processing」。毎日、Creative Codingします。

ブロックを積み上げて都市をつくる

/**
* city builder 
*
* @author aa_debdeb
* @date 2016/04/29
*/

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;
      }
    }
  }  
}