2009年9月29日火曜日

TETRIS for GBA

以前(2年以上前)作成したモノの紹介.

TETRIS for GBA

TGM3を参考にして,GBA用に作った20Gモードのテトリスです.
ちなみに,GBAのソフトはC言語で作る事ができ,PC上でもエミュレータで動作させる事ができます.


Fig.1
タイトル画面.


Fig.2
ゲーム画面.背景以外は(TGM3を模倣したデザインで)全て自分でドット絵を打っています.

20Gモードですので,IRSや壁蹴り,回転規則の純粋な再現等,割と凝って作った記憶が思い出されます.
また,画像に関しても当時のレベルで出来る事を全てやったようです.

2009年9月26日土曜日

カオス #23 リヤプノフ・フラクタル

カオス久し振り.

リヤプノフ・フラクタル(Lyapunov fractal)
リヤプノフ・フラクタルとは,
L(x)=rx(1-x)
のrを2つの値a, b∈[0, 4]に切り替えることで得られる分岐的フラクタルです.

具体的には,L(x)についてのリヤプノフ数を計算します.
リヤプノフ数は以下の式で表されます.



rnの決め方
例えば,a=2, b=3.5,パラメータ文字列を"ABB"とした時,
r0, 3, 6, …=a=2
r1, 4, 7, …=b=3.5
r2, 5, 8, …=b=3.5
となります.

というわけで,作ってみました.画像では,
左上が(a, b)=(0, 0),
右下が(a, b)=(4, 4).

また,着色は以下のようにしてあります.
Λ>0 - 黒
Λ<0 - 絶対値が大きい程,白に近い(小さい時は青や赤)


Fig.1 A


Fig.2 B


Fig.3 AB


Fig.4 AAB


Fig.5 ABB


Fig.6 AAAB


Fig.7 AABB


Fig.8 ABBB


Fig.9 AAAAB


Fig.10 AAABB


Fig.11 AABAB


Fig.12 AABBB


Fig.13 ABABB


Fig.14 ABBBB

ちなみに,この画像は2048x2048で作った後,512x512に縮小しています(その方が結果的に綺麗).
だので,1画像に関して,サイズ12MB,製作時間9分となりました.

2009年9月20日日曜日

セルオートマトン #6 ルール4

ルール4
クラス1

時刻tでの状態■■■■■□■□■■□□□■■□■□□□■□□□
時刻t+1での状態


2個以上の■の塊は次の時刻には消滅します.
■の両脇に1つ以上の□がある時のみ生存し,その後は変化無し(周期1).


Fig.1 rule4

こんな感じ.

2009年9月19日土曜日

セルオートマトン #5 ルール3

ルール3
クラス2

時刻tでの状態■■■■■□■□■■□□□■■□■□□□■□□□
時刻t+1での状態


これは,ルール1,2を合わせた感じです.
ルール1の条件で白黒の条件が決まり,また,ルール2の様にシフトします(但し,2時刻かけて,右シフト).


Fig.1 rule3

こんな感じ.

2009年9月18日金曜日

プロコンシミュレータ

久しぶりにソフト製作.

第二十回全国高等専門学校プログラミングコンテスト
競技部門シミュレータ
何色? サッと見 発見伝

そのまんまの内容です.ルールは高専プロコン公式サイトをどうぞ.

コンセプトは「ミスマッチ」.



タイトル画面
文字が徐々に形を成していきます.


難易度選択画面
・とても簡単
・簡単
・普通
・難しい
・ノイマン先生専用
の5タイプ


こんな感じに操作できます.回す際は「がちゃン」というSEも入ります.


クリアすると祝福してくれます(BGM付き).
クリアした(上の)後は,(テレビの)砂嵐と共にwhite noiseが流れるようにすると,より良いかと思われます.

セルオートマトン #4 ルール2

ルール2
クラス2

時刻tでの状態■■■■■□■□■■□□□■■□■□□□■□□□
時刻t+1での状態


基本的には,セルが黒(=1)だった時,次の時刻では左にシフトすることが分かります.
ただし,黒がいくつか連なっているとき,あるいは黒の塊が2つ以上あり,その間には1つの白(=0)しかない時は,その左端だけがシフトし,他のセルは白となります.
□□■■■■□□
□■□□□□□□
■□□□□□□□
とか,
□□■■□■■■□□■■
□■□□□□□□□■□□
■□□□□□□□■□□□
など.


Fig.1 rule2

こんな感じ.
左端と右端はつながっています.
また,t>0で,周期はセルの長さ(ここでは,横幅256)です.

2009年9月16日水曜日

セルオートマトン #3 ルール1

ルール1
クラス2

時刻tでの状態■■■■■□■□■■□□□■■□■□□□■□□□
時刻t+1での状態


これを適用するとどのようになるかというと,
1.奇数時刻で白,偶数時刻で黒.
2.奇数時刻で黒,偶数時刻で白.
3.奇数時刻で白,偶数時刻で白.
(但し,t>0)
の3種類に分かれます.

自分が黒,もしくは,黒の塊と黒の塊の間が2セル以下の白は1.に,
自分と両脇が白のセルは2.に,
そうでないセルは,3.になります.


Fig.1 rule1

このようになります.
t>0では周期2に落ち着きます.

2009年9月11日金曜日

セルオートマトン #2 ルール0

ルール0
クラス1

時刻tでの状態■■■■■□■□■■□□□■■□■□□□■□□□
時刻t+1での状態


ルール0は次の状態が,前の状態如何に関わらず0(=□)です.
詰まる所,具体例を示すと…



時刻0□■□□■■□□□■■■■□■□
時刻1□□□□□□□□□□□□□□□□


このようになります.
t=0を初期状態として始めると,t=1には全てのセルが0になります.

t=0 … CAハジマタ\(^o^)/
t=1 … CAオワタ\(^o^)/
t=2 … CAオワテル\(^o^)/
t=3 … CAオワテル\(^o^)/

2009年9月8日火曜日

数学 #10 数値解析 #3 ルンゲ・クッタ法

先日紹介したオイラー法.今回は,それよりも精度の高いルンゲ・クッタ法を紹介したいと思います.上には上がいるものです.

ルンゲ・クッタ法(Runge-Kutta method)

初期値を,



とすると,(hは刻み幅)







となります.

一般化したりできますが,省略します.

オイラー法の様にしてこれを計算すると,非常に精度良く数値解を求める事が出来ます.

2009年9月7日月曜日

セルオートマトン #1 イントロダクション

こんばんは.今回はセルオートマトンについて.
セルオートマトンで有名なのは,ライフゲーム(Game of Life)ですが,今回は違います.

1次元セルオートマトン(Cellular automaton)

1次元セルオートマトンは,最もシンプルなセルオートマトンです.
セルは1次元に並んでいて,あるセルに2つのセルが隣接しています.
また,セルの種類は“0”,“1”の2つのみです.ここでは0を□,1を■とします.

□■□■■■□□
例えばある時刻tでは,こんな感じ.

そして,

akt+1=f(ak-1t, akt, ak+1t)

という式により,セルを更新します.
aktは時刻tにおける,k番目のセルの状態であり,
ak-1tはその左隣,
ak+1tはその右隣
を表します.
つまり,時刻t+1(次の時刻)のセルの状態は,時刻t(現在)のセルとその両脇のセルの状態によって決まるわけです.

更新に使うfは例えば下のようなものです.




時刻tでの状態
(ak-1t, akt, ak+1t)
(1, 1, 1)(1, 1, 0)(1, 0, 1)(1, 0, 0)(0, 1, 1)(0, 1, 0)(0, 0, 1)(0, 0, 0)
時刻t+1での状態
akt+1=f(ak-1t, akt, ak+1t)
00011110


同じですが以下のようにも書けます.




時刻tでの状態(左,中央,右)■■■■■□■□■■□□□■■□■□□□■□□□
時刻t+1での状態(中央)


このような“ルール”を各セルに適用します.

例:
□■□■■■□□
とりあえず,両端は考えない事にします.その内側のみを更新します.
□■□ → ■
■□■ → □
□■■ → ■
■■■ → □
■■□ → □
■□□ → ■
なので,
□■□■□□■□
となります.

これを繰り返していくだけです.

この“ルール”の数は,
左,中央,右の3セルが作る状態数=8,
1つの状態に対する,次のセルの状態数=2,
であるので,
28=256通りとなります.

具体的には,




時刻tでの状態■■■■■□■□■■□□□■■□■□□□■□□□
ルール0
ルール1
ルール2
ルール3
ルール252
ルール253
ルール254
ルール255


□=0,■=1なので,“ルール30”とかいったら,30を2進数(=00011110)に直せばいいわけです.

以上で,このモデルの説明は終わりです.

さてさて,セルオートマトンは,その振る舞いから,以下の4クラスに分類されます.

クラス1 - セル全体が同じ状態になり,変化しなくなる.:秩序状態
クラス2 - セルの時間発展につれ,最終的に周期的な変化になる.:秩序状態
クラス3 - セル全体がランダムな変化を続ける.:カオス状態
クラス4 - 規則的なパターンとランダムなパターンが共存し,複雑なパターンを形成する.

クラス1,2は単純過ぎ(簡単に予測できる),クラス3はカオス過ぎ,クラス4が丁度良い,つまり,現実世界で起こる現象に近いのではないか,と考えられたみたいです.

というわけで,全ルールを(出来れば)紹介していきます.

2009年9月4日金曜日

数学 #9 積分記号下での微分

私淑する物理学者の中に,ファインマンという人がいます.

彼の自伝(「ご冗談でしょう、ファインマンさん」)の中にこんな文章がありました.

ウッズの本には積分記号の中で係数を微分する方法もでていたが、あれだって一種の演算だ。ところが大学ではこれをあんまり教えないし、強調もしない。僕はウッズの本のおかげでその方法の使い方を覚え、それからもずっと馬鹿の一つ覚えみたいに、あれを繰り返し役に立ててきた。何しろ本を読んで覚えた自己流だから、僕のはずいぶんへんてこな積分法だったと思う。

というわけですが,この「積分記号の中で微分する」というのが暫くどういった方法か分かりませんでした.最近になって調べ直した所,解析概論の中に例を含めて載っているとのことなので,早速見てみました

解析概論
第4章 無限級数 一様収束
48. 連続的変数に関する一様収束 積分記号下での微分積分

仮定,条件は素っ飛ばすので厳密は微塵もなくなりますが,つまりは,


ということです.

例1:
下の定積分は直ぐに求められます.


ここで,両辺をαで偏微分すると,




となります.
同様にすると,n階偏微分の時


という公式が出来ます.

例2:
下の定積分も頑張れば求められます.


そして,

と改め,αでn階偏微分すると,




となります.

こんな方法があるのでした.

2009年9月1日火曜日

物理 #3 衝突(3次元)

最終的には3次元.

球A:
位置:r1=(x1, y1, z1)T
衝突前速度:v1=(v1x, v1y, v1z)T
衝突後速度:v1'=(v1x', v1y', v1z')T
質量:m1
反発係数:e1

球B:
位置:r2=(x2, y2, z2)T
衝突前速度:v2=(v2x, v2y, v2z)T
衝突後速度:v2'=(v2x', v2y', v2z')T
質量:m2
反発係数:e2

重要なのは,正規直交基底の取り方ですが,
1つ目e1は,r2-r1を正規化したもの,
2つ目e2は,e1に垂直になるようにし,
3つ目e3は,e1e2に垂直となるようにします.

具体的には,

e1=(x, y, z)T
とします.次に
e2として,
(0, z, -y)T/|e2|
(y, -x, 0)T/|e2|
の内,計算可能なものを選びます.
そして,
e3=e1×e2
とします(“×”は外積).

このようにすると,
e1 - 1次元での衝突
e2 - 速度は不変
e3 - 速度は不変
となります.

あとは2次元の時と同様に

v1=w1xe1+w1ye2+w1ze3
v2=w2xe1+w2ye2+w2ze3

と表した時,

w1x=v1e1
w1y=v1e2
w1z=v1e3
w2x=v2e1
w2y=v2e2
w2z=v2e3

だから,

w1x'=(m1w1x+m2w2x)/(m1+m2)+e(w2x-w1x)m2/(m1+m2)
w1y'=w1y
w1z'=w1z
w2x'=(m1w1x+m2w2x)/(m1+m2)+e(w1x-w2x)m1/(m1+m2)
w2y'=w2y
w2z'=w2z

となり,

v1x'=w1x'e1x+w1y'e2x+w1z'e3x
v1y'=w1x'e1y+w1y'e2y+w1z'e3y
v1z'=w1x'e1z+w1y'e2z+w1z'e3z
v2x'=w2x'e1x+w2y'e2x+w2z'e3x
v2y'=w2x'e1y+w2y'e2y+w2z'e3y
v2z'=w2x'e1z+w2y'e2z+w2z'e3z

衝突条件は勿論,

(x2-x1)2+(y2-y1)2+(z2-z1)2≦(r1+r2)2

(rはそれぞれの球の半径です)

これで終わりです.4次元,5次元と拡張する場合は,基底の取り方に注意すれば後は同じです.



シミューレーションすると,これもまた感動です.