2005年10月07日

prototype.js でフェーダーを作る

test - Fader

Yellow Fade Technique のためのクラスを、prototype.js を使って定義してみました。

gengo - 元号・西暦変換 で行っているのと同様に、フェードの途中で繰り返しフェードをかけてもチカチカと点滅しないようにしています。

副産物として、Array の map, zip, fold メソッドを書いたら、コードがますます Scheme ライクに。

色のデータをもつ RGB というクラスを書いているのですが、それの equal メソッドはこんな感じです。

    compare: function(f, other) {
	return (this.value.zip(other.value)).map(function(x) {
	    return f(x[0], x[1]);
	}).fold(function(a, b) {
	    return a && b;
	}, true);
    },
    equal: function(other) {
	return this.compare(function(x, y) { return x == y; }, other);
    },

(2005-10-11 追記: equal メソッドの return を忘れていました。)

Posted by Hiroyuki KUROSAKI at 2005年10月07日 10:13 このエントリーを含むはてなブックマーク
この記事の TrackBack URL:
http://noir.s7.xrea.com/mt/mt-tb.cgi/199
Comments

フェードが完了してもインターバルタイマが止まらないバグがあったので、直しました。

Posted by: noir123 on 2005年10月11日 08:01

Array.prototype.map の効率アップを図りました。

ヒントになったのは Perl Best Practices (Damian Conway著、O'Reilly刊、2005) の "Use map instead of for when generating new lists from old." (p.110) という節です。

配列の各要素に対する計算結果を新しい配列に格納していくとき、forループを使って新しい配列にpushしていくのは、毎回配列のためのメモリ確保をやり直すので効率が悪い。古い配列から、新しい配列に必要なサイズはあらかじめ分かっているのだから、その分だけ確保しておいて新しい配列の要素に計算結果を入れていくほうがよい、map はそういう実装になっている、ということです。

なるほど、と思い、Array のコンストラクタで配列のサイズを指定しておき、pushではなくインデックスによる要素参照で計算結果を代入するように変更しました。

Posted by: noir123 on 2005年11月10日 00:20
Post a comment

サイン・インを確認しました、 さん。コメントしてください。 (サイン・アウト)

(いままで、ここでコメントしたとがないときは、コメントを表示する前にこのウェブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)


情報を登録する?