Pages

2011年11月27日日曜日

[Processing] 紙を折る

突然、折り紙のシミュレートをしてみたくなった。
久しぶりのProcessingで、習作をつくってみることにする。

エラーとバージョンアップ

簡単なコードを書いて実行してみると、動くことは動くのだが、以下のようなエラー(Warning)がでた。
2011-11-26 21:34:34.011 java[1413:1c0f] *** CPerformer: ignoring exception 'Invalid parameter not satisfying: [self canBecomeMainWindow]' raised during perform of selector 'requestFocus:' on target 'FocusManager' with args '<AWTComponentSetFocusData: 0x11d980>'

Java関連のエラーのようだが、調査しても今一。Javaのバージョンアップをしてみよ、とか Lionのせいじゃないかとか。いろいろ試して、結果 Processingを最新版にするとエラーがでなくなった。
今まで使っていたのが、1.0.1 最新は、1.5.1 なので、随分とヴァージョンアップせずにほったらかしだったのね。

折たたみ、あるいは本をめくるような動作

つくってみたのは、以下のリンクからアプレットを動かしてみてください。

紙を折るような動作

結構不満。
* ワイヤー表示なので、重なりが透けてみえる。
* 面と裏の色をつけたい。
* 永遠におり続ける動作にしたい。
* 円軌道が、平面的で立体感がない。

プログラムの解説

Processingのプログラムの基礎として
* 最初にsetup()関数が実行され、draw()関数がループ実行される。
* グローバル変数は、最初に宣言しておく。

円座標の計算は
円の中心座標 (x0, y0)
角度 th (Radian) 注) 0度は、Y軸方向。つまり、右向き矢印は、90度、上向きは 180度。
半径 R

座標 x = x0 + R * sin(th)
座標 y = y0 + R * cos(th)

float sx; float sy; // 紙の上辺、真ん中の位置。 
int sh;             // 折り紙の高さ。
int sr;             // 折り紙の上辺の半分。折る場合の半径。
float rad;          // 折り曲げ角度。単位:度。

// 初期化
void setup(){
  size(200, 200);   // 画面の大きさ
  color(RGB,256);   // 色設定 processingは、数種類の色定義を使うことが出来る。
  
  background(255);  // 背景色
  frameRate(30);    // 描写速度 draw()の実行回数 / 秒
  
  // 初期化
  sx = 100; sy = 50; sh = 80; sr = 40;  
  rad = 270; //円軌道は、左端から始まり、右回転へ。
}

void draw(){
  background(255);  // 毎回画面を真っ白にする。そうしないと前の絵が残る。
  // 折り曲げを繰り返し。
  if(rad == 90) rad = 270;
  
  stroke(0);        // 黒で線を描く
  page(90);         // 90度の左半分 → つまり、折り紙の右半分。
  page(rad);        // 角度radの状態の左半分。
  
  rad = rad - 1;    // 右回り。
}

// 折り曲げ角度 r の 折り紙の左半分をワイヤーで描く
void page(float r){
  // 左上の位置を計算
  float x = sx + sr * sin(radians(r));
  float y = sy + sr * cos(radians(r));
  // ワイヤー
  line(x, y, sx, sy);           // 上辺
  line(x, y, x , y + sh);       // 左辺
  line(x, y + sh, sx, sy + sh); // 下辺
  line(sx, sy + sh, sx, sy);    // 右辺
}

ワイヤーでやってみたが、どうも平行四辺形を描く方法があるらしい。また、三次元で描いて視点を動かすことで、立体的に表現することもできそうだ。

また、最近のProccessing本では、画像描写以外に機器制御への利用も解説しているらしい。

Processing。侮れない言語になってきたのだなあ。