takashi42332007-05-13


Rubyチュートリアルはクロシージャが意味分かんないから,ちょっとお勉強中.
その間に,ProcessingのCode Readingを続けてみる.

今回で,Example -> Colorはおしまい.今回は,RelativityとSaturationのCodeを読みます.先ずは「Relativity」からです.コードを読む前に,左の図を見てください.この図,上の方が繰り返しが少ない感じがしませんか?

でもね,実際は垂直バーの数は同じなんです.こういうのを目の錯覚(錯視)といいます.次のリンク先に面白い物がたくさんあるので見てください.

#結構重いので注意!!
錯視から探る脳機能 (生存科学研究所 「脳科学と芸術 第1回シンポジウム」)

こっちは,お手軽版
サービス提供終了のお知らせ


さて,それじゃぁ本当にバーの数が同じなのかどうか,Code Readingをして試してみましょう.

color a, b, c, d, e;

最初に5つの色変数を定義します

void setup() {
  size(200, 200);
  noStroke();
  a = color(165, 167, 20);
  b = color(77, 86, 59);
  c = color(42, 106, 105);
  d = color(165, 89, 20);
  e = color(146, 150, 127);
  // 繰り返し描画する必要がない場合は,noLoop()をsetup内で呼んでおく.
  // 動きがありdrawメソッドを繰り返し呼んで欲しい場合は場合は,Loop()メソッドを呼ぶ
  noLoop();
}

次にsetupメソッドで,ウィンドウのサイズを指定し,noStrokeで枠なしで今後扱うと決定,次にa,b,c,d,eの5色を具体的に設定し,noLoop()でdrawメソッドを何度も呼ばないと指定します.このnoLoopについては,旧バージョンから大きく変わっているみたいなので,近々ちゃんとまとめようと思います.

感覚としては,描画を繰り返して欲しいプログラム(以前紹介した「Brightness」の様にカーソルの位置で明度が変化したりするもの)の場合,Loop()メソッドを呼んでdraw関数を繰り返し描画すると指定します.因に,その描画のフレームレートも指定する事が出来ますが,取り敢えず今日はここまで.最後に,draw()とdrawBand()メソッドをまとめて読みます.

void draw() {
  // 色の並べ方が違う.
  drawBand(a, b, c, d, e, 0, 4);
  drawBand(c, a, d, b, e, height/2, 4);
}

/*
 *引数は,5つの色と描画を始めるy座標の位置,バーの太さの7つです.
 */
void drawBand(color v, color w, color x, color y, color z, int ypos, int barWidth) {
  //色の種類の数
  int num = 5;
  //配列に格納
  color[] colorOrder = { v, w, x, y, z };

  for(int i=0; i < width; i += barWidth * num) {
    for(int j=0; j < num; j++) {
      fill(colorOrder[j]);
      rect(i+j*barWidth, ypos, barWidth, height/2);
    }
  }
}

ね,使っている色も垂直バーの数も一緒でしょ?なのに,こんなに違う見え方がするってのは不思議だよね.



次にSaturation(彩度)について
彩度とは色の鮮やかさを,もっと言うと色の強さや純度を表現する指標です.彩度が低いと色は明度だけになるので灰色の成分が多くなります.以下のプログラムは,BrightnessとかHueとほぼ一緒だから,解説は省略.

int barWidth = 5;
int[] saturation = new int[200/barWidth];

void setup() 
{
  size(200, 200);
  colorMode(HSB, 360, height, height);  
}

void draw() 
{
  int j = 0;
  for (int i=0; i<=(width-barWidth); i+=barWidth) {  
    //縁なし設定
    noStroke();
    //ウィンドウ上でカーソルがどのバーの上にあるか?
    if ((mouseX > i) && (mouseX < i+barWidth)) {
      //カーソルの垂直座標を彩度にする,
      saturation[j] = mouseY;
    }
    fill(i, saturation[j], height/1.5);
    rect(i, 0, barWidth, height);  
    j++;
  }
}