以前(2年以上前)作成したモノの紹介.
TETRIS for GBA
TGM3を参考にして,GBA用に作った20Gモードのテトリスです.
ちなみに,GBAのソフトはC言語で作る事ができ,PC上でもエミュレータで動作させる事ができます.
Fig.1
タイトル画面.
Fig.2
ゲーム画面.背景以外は(TGM3を模倣したデザインで)全て自分でドット絵を打っています.
20Gモードですので,IRSや壁蹴り,回転規則の純粋な再現等,割と凝って作った記憶が思い出されます.
また,画像に関しても当時のレベルで出来る事を全てやったようです.
2009年9月29日火曜日
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分となりました.
リヤプノフ・フラクタル(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
2009年9月19日土曜日
セルオートマトン #5 ルール3
2009年9月18日金曜日
プロコンシミュレータ
セルオートマトン #4 ルール2
ルール2
クラス2
基本的には,セルが黒(=1)だった時,次の時刻では左にシフトすることが分かります.
ただし,黒がいくつか連なっているとき,あるいは黒の塊が2つ以上あり,その間には1つの白(=0)しかない時は,その左端だけがシフトし,他のセルは白となります.
□□■■■■□□
□■□□□□□□
■□□□□□□□
とか,
□□■■□■■■□□■■
□■□□□□□□□■□□
■□□□□□□□■□□□
など.
Fig.1 rule2
こんな感じ.
左端と右端はつながっています.
また,t>0で,周期はセルの長さ(ここでは,横幅256)です.
クラス2
時刻tでの状態 | ■■■ | ■■□ | ■□■ | ■□□ | □■■ | □■□ | □□■ | □□□ |
時刻t+1での状態 | □ | □ | □ | □ | □ | □ | ■ | □ |
基本的には,セルが黒(=1)だった時,次の時刻では左にシフトすることが分かります.
ただし,黒がいくつか連なっているとき,あるいは黒の塊が2つ以上あり,その間には1つの白(=0)しかない時は,その左端だけがシフトし,他のセルは白となります.
□□■■■■□□
□■□□□□□□
■□□□□□□□
とか,
□□■■□■■■□□■■
□■□□□□□□□■□□
■□□□□□□□■□□□
など.
Fig.1 rule2
こんな感じ.
左端と右端はつながっています.
また,t>0で,周期はセルの長さ(ここでは,横幅256)です.
2009年9月16日水曜日
セルオートマトン #3 ルール1
2009年9月11日金曜日
セルオートマトン #2 ルール0
ルール0
クラス1
ルール0は次の状態が,前の状態如何に関わらず0(=□)です.
詰まる所,具体例を示すと…
このようになります.
t=0を初期状態として始めると,t=1には全てのセルが0になります.
t=0 … CAハジマタ\(^o^)/
t=1 … CAオワタ\(^o^)/
t=2 … CAオワテル\(^o^)/
t=3 … CAオワテル\(^o^)/
…
クラス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 ルンゲ・クッタ法
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は例えば下のようなものです.
同じですが以下のようにも書けます.
このような“ルール”を各セルに適用します.
例:
□■□■■■□□
とりあえず,両端は考えない事にします.その内側のみを更新します.
□■□ → ■
■□■ → □
□■■ → ■
■■■ → □
■■□ → □
■□□ → ■
なので,
□■□■□□■□
となります.
これを繰り返していくだけです.
この“ルール”の数は,
左,中央,右の3セルが作る状態数=8,
1つの状態に対する,次のセルの状態数=2,
であるので,
28=256通りとなります.
具体的には,
□=0,■=1なので,“ルール30”とかいったら,30を2進数(=00011110)に直せばいいわけです.
以上で,このモデルの説明は終わりです.
さてさて,セルオートマトンは,その振る舞いから,以下の4クラスに分類されます.
クラス1 - セル全体が同じ状態になり,変化しなくなる.:秩序状態
クラス2 - セルの時間発展につれ,最終的に周期的な変化になる.:秩序状態
クラス3 - セル全体がランダムな変化を続ける.:カオス状態
クラス4 - 規則的なパターンとランダムなパターンが共存し,複雑なパターンを形成する.
クラス1,2は単純過ぎ(簡単に予測できる),クラス3はカオス過ぎ,クラス4が丁度良い,つまり,現実世界で起こる現象に近いのではないか,と考えられたみたいです.
というわけで,全ルールを(出来れば)紹介していきます.
セルオートマトンで有名なのは,ライフゲーム(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) | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 |
同じですが以下のようにも書けます.
時刻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階偏微分すると,
となります.
こんな方法があるのでした.
彼の自伝(「ご冗談でしょう、ファインマンさん」)の中にこんな文章がありました.
ウッズの本には積分記号の中で係数を微分する方法もでていたが、あれだって一種の演算だ。ところが大学ではこれをあんまり教えないし、強調もしない。僕はウッズの本のおかげでその方法の使い方を覚え、それからもずっと馬鹿の一つ覚えみたいに、あれを繰り返し役に立ててきた。何しろ本を読んで覚えた自己流だから、僕のはずいぶんへんてこな積分法だったと思う。
というわけですが,この「積分記号の中で微分する」というのが暫くどういった方法か分かりませんでした.最近になって調べ直した所,解析概論の中に例を含めて載っているとのことなので,早速見てみました
解析概論
第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は,e1,e2に垂直となるようにします.
具体的には,
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=v1・e1
w1y=v1・e2
w1z=v1・e3
w2x=v2・e1
w2y=v2・e2
w2z=v2・e3
だから,
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次元と拡張する場合は,基底の取り方に注意すれば後は同じです.
シミューレーションすると,これもまた感動です.
球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は,e1,e2に垂直となるようにします.
具体的には,
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=v1・e1
w1y=v1・e2
w1z=v1・e3
w2x=v2・e1
w2y=v2・e2
w2z=v2・e3
だから,
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次元と拡張する場合は,基底の取り方に注意すれば後は同じです.
シミューレーションすると,これもまた感動です.
登録:
投稿 (Atom)