2010年7月20日火曜日

VideoCube

とにかくサンプルコードを見ていくことにした。まずはVideoCube

378行。1ファイル。VideoCube.fxしかない。378行しかない。空行もコメントも入れてだ。驚き。いまさら何を言う。

さてサンプルコードを見る目的は、体で覚えるためだ。よく移植した部位に宿った記憶にまつわるエピソードをTVでやってるが、両腕の肘下から手首にかけての腕の部分に見えないタトゥーを入れるつもりだ。

とりあえずimportは置いておく。

def startVideoURL = "http://webcast-west.sun.com/interactive/javafx/VideoCube.fxm";
def chooser = new JFileChooser();
def r = 100;
def d = r + r;

startVideoURLはおそらく実行すると1つだけ貼ってあるビデオのURLだろう。chooserはJFileChooserという名前からしてサイコロの面をclickしたときに表示されるファイルダイアログに違いない。J*を使うのは気が引ける気がしていたが、これだけ見るともの凄く簡単そうに見える。続くrとdをこの段階でdefしておく意味がわからない。追って分かるだろう。

class Point { .. } コードを全部書くと長いので省略。rotateX/Y/Zの3つの関数があり、それぞれcos,sinという名前からしてコサイン、サインをパラメータに貰う。数学も三角関数も苦手だ。
変数x,y,zを持ち、インスタンス生成時にセットされる。この値とrotateしたときに渡すサインコサインの値から、次の?Xならz,y、Yならz,x、Zならy,zを計算する(更新する)ようだ。そしてどこかにbindしているのか? しているようだ。

def z = bind ul.z + ur.z + lr.z + ll.z;

このul..llがPointなのだが、defしているzにbindというのが何ともイメージに合わない。一度しか代入出来ない=#defineライクなものというイメージ。それが確かに代入は一度とはいえ、bindすればころころ変わるはずだ。だがそうできる。ポインタ的なというか。

var ax = 0.002;
def cx = bind Math.cos(ax);
def sx = bind Math.sin(ax);
var ay = -0.006;
def cy = bind Math.cos(ay);
def sy = bind Math.sin(ay);

このbindは一体なんだ? Math.cos(ax);が返したインスタンスにbindというより、雰囲気的にaxにもbindしている予感。bindか・・・やはりこいつが難敵だ。ということで少しbindについて文献を漁ってみることにする。

と、なるほど関数をbindか。Math自体はJavaなのでbound function ...ではないが、できるのだろう。ちなみに[ナビゲート]-[ソースへ移動](shift+cmd+b)でMath.java、StrictMath.javaがちゃんと開いてくれる。おおーすごい。これが右クリックでなんでないか。つまりaxやayが変わると、bindが働くと。まあ要するにbindに出てきた変数が変わったら、そいつがbindされているものに関して軒並み評価し直されるということだと今のところ理解しておこう。だから例えば他にもdef hokanimo = bind ax;とあれば、cx,sx,hokanimoが更新されると。これは便利なのか? いやあもの凄く便利でしょう。誰が一体こんなことを考えたのか。最近何かと「折り畳まれている」について考えさせられるが、bindという4文字に秘められた力の大きさよ、という感じか。折り畳みとはちょっと違うのかもしれないが。

0 件のコメント:

コメントを投稿