Proce55ing サンプル

Processing(検索する人のために Proce55ing とするのがいい、らしい)で、地味なサンプルを作ってみた。
イメージとしては、大規模な計算機環境で動いている処理を可視化するもの。今のところ箱を沢山書いているだけで内容は無い。

感想。簡単に「かっこいい」プログラムが書けるツールとしてなかなか良いなあ。
ひまなときに、TreeMap だとか平安京ビューだとかのより美しい可視化を試したい。Processing くらい描画が簡単だと、いろいろと楽しめそうだ。

// box coord
// sample to draw many boxes. 
// 

int W = 800;
int H = 200;
int D = 100; // size of middle box
int DD = 10; // size of small box
int maxSmallBox = (D/DD)*(D/DD); // max size of small box in middle box

void draw() {
  init_grid();
  
  int totalSmallBox = 0;
  pushMatrix();
    
  for (int i=0; i <= height/D; i++) {
    pushMatrix();
    for (int j=0; j <= width/D; j++) {
//      int n = maxSmallBox;
      int n = int(random(1, maxSmallBox));
      draw_box(n, DD);
      totalSmallBox+= n;
      translate(D, 0);
    }
    popMatrix();  
    translate(0, D);
  }
  popMatrix();
  
}

void setup() {
  size(W,H);
  background(0);
  colorMode(RGB,255,255,255,255);
  frameRate(1);
  init_grid();
}

void init_grid() {
  rect(0,0,width,height);
  fill(255);
  stroke(200);
  for (int i=0; i<= height/D; i++) {
    for (int j=0; j<= width/D; j++) {
        rect(j*D,i*D,D,D);
    }
  }
}

void draw_box(int n, int r) {
  // n: number of small box
  // r: size of middle box
  stroke(200);
  fill(255);

  int xmax, ymax;
  xmax = ceil(sqrt(n));  
  if (xmax * (xmax -1) >= n) {
    ymax = xmax - 1;
  } else {
    ymax = xmax;
  }
  
  // draw small boxes
  int cnt=0;

  for (int j=0; j< ymax; j++) {
    if (cnt == n) break;
    for (int i=0; i< xmax; i++) {
      if (cnt == n) break;
      fill(0, random(255), 0);
      stroke(0);
      rect(i*r, j*r, r, r);
      cnt++;
    }
  }
  
  // draw region includes small boxes
  stroke(0);
  noFill();
  rect(0, 0, xmax * r, ymax * r);
}