▶ 実 行
▶ 実行
クリア
一次元セル・オートマトン
by てぃふと@うぇいく
# 一次元セル・オートマトン # 一次元オートマトンのルールを定義する番号 ルール番号は184 # セルの初期状態の設定方法 # 幅全体を等分にn分割した際のそれぞれの場所の設定方法。 # 何分割するかは配列の要素数をいくつにするかに依る。 # 分割した個々の初期化方法は以下のいずれかを設定する。 # 「なし」:範囲内は全て0。数値0と同じ。 # 「全て」:範囲内は全て1。数値100と同じ。 # 「中央」:範囲内の中央の1点のみ1で他は0。 # 「左端」:範囲内の左端の1点のみ1で他は0。 # 「右端」:範囲内の右端の1点のみ1で他は0。 # 数値:範囲内の個々のセルを1にする確率。 セル初期化方法は[40,70] # 世代更新時に左端のセルを1として扱う確率 左端セル率は20 # 世代更新時に右端のセルを1として扱う確率 右端セル率は0 # 1セルの表示サイズ。2ならば2pixel*2pixel 表示倍率は2 色リストは[ [ 0, 0, 0], [ 0,255, 0] ] # [ 0, 0, 0], # [255, 0, 0], # [ 0,255, 0], # [ 0, 0,255], # [255,255, 0], # [255, 0,255], # [255,255,255] 表示起点は[0,0] 画像位置は[0,0] # 現在の世界のセルの状態 # X+Y*幅数の一次元配列 # 0=死/1>=生 セル配列は[] # 世代更新時の生成・消滅ルールを表すよう要素8個の配列 ルールは[] セル横数は((描画中キャンバス["width"]-画像位置[0])÷表示倍率)の整数部分 セル縦数は((描画中キャンバス["height"]-画像位置[1])÷表示倍率)の整数部分 画像データ幅はセル横数×表示倍率 画像データ高はセル縦数×表示倍率 # ワークエリア。高速化のため最初に確保して使いまわす イメージは空 開始する。 # 指定されたセル配列に次の世代を生成して定する # Global:セル横数,左端セル率,右端セル率 ●(セル配列の現世代行から次世代行へ)次世代生成とは TLは0 もし、(100の乱数)<左端セル率ならば、 TLは1 ここまで (セル横数)回繰り返す Xは回数-1 Iは(現世代行*セル横数+X) Jは(次世代行*セル横数+X) TTはセル配列[I] もしX<セル横数-1ならば、 TRはセル配列[I+1] 違えば、 もし、(100の乱数)<右端セル率ならば、 TRは1 違えば TRは0 ここまで ここまで 計はTL*4+TT*2+TR セル配列[J]はルール[計] TLはTT ここまで ここまで # セル配列の内容を画像として生成する # Global:セル配列,表示起点,表示倍率,イメージ,画像位置 ●全世代描画とは セル配列を表示起点から表示倍率でイメージに画像化する イメージを画像位置にイメージデータ設定 ここまで # セル配列の0世代目から残りの世代を全て生成する # Global:セル縦数,セル配列 ●全世代生成とは 現世代行は0 (セル縦数-1)回繰り返す 次世代行は(現世代行+1)%セル縦数 セル配列の現世代行から次世代行へ次世代生成する 現世代行は次世代行 ここまで ここまで # 指定した配列の指定した行に設定に従い0世代目を設定する # Global:セル横数 ●(新セル配列の初期行に設定で)初期世代作成とは 設定リストは設定 もし、(設定の変数型確認)=「string」または(設定の変数型確認)=「number」ならば、 設定リストは[] 設定リストに設定を配列追加する ここまで 分割数は設定リストの配列要素数 Jは-1 境界は-1 設定位置は-1 設定率は0 Yは初期行 (セル横数)回繰り返す Xは回数-1 もし、X>境界ならば、 JはJ+1 現設定は設定リスト[J] 設定位置は-1 設定率は0 次境界は(セル横数÷分割数×(J+1))の整数部分 もし、(現設定の変数型確認)が「number」ならば、 設定率は現設定 違えば、 現設定で条件分岐する 「全て」ならば 設定率は100 ここまで 「全部」ならば 設定率は100 ここまで 「左端」ならば 設定位置はX ここまで 「右端」ならば 設定位置は次境界 ここまで 「中央」ならば 設定位置は(境界+(次境界-境界)/2)の整数部分 ここまで ここまで ここまで 境界は次境界 ここまで Iは(Y*セル横数+X) データは0 もし、Xが設定位置ならば、 データは1 設定位置は-1 違えば もし、(100の乱数)<設定率ならば、 データは1 ここまで ここまで 新セル配列[I]はデータ ここまで ここまで # セル横数×セル縦数のサイズを設定に従い初期化したセル配列を返す # Global:セル横数,セル縦数 ●(設定で)初期セル配列生成とは 新セル配列は[] 新セル配列["length"]はセル横数×セル縦数 新セル配列の0に設定で初期世代作成する (セル縦数-1)回繰り返す Yは回数 (セル横数)回繰り返す Xは回数-1 Iは(Y*セル横数+X) 新セル配列[I]は0 ここまで ここまで 新セル配列で戻る ここまで # 番号で指定されているルールをbitに分解して配列で返す # Globa:- ●(ルール番号を)ルール分解とは ルールは空配列 Jはルール番号 8回繰り返す Iは回数-1 ルール[I]はJ%2 Jは(Jを2で割る)の整数部分 ここまで ルールで戻る ここまで # 指定されたセル配列の内容を表示用にイメージデータに設定する # Global:セル横数,セル縦数,画像データ高,画像データ幅,色リスト ●(セル配列をイメージデータに表示起点から表示倍率で)画像化とは Yは(表示起点[1]+セル縦数)%セル縦数 YIは表示倍率 (画像データ高)回繰り返す GYは回数-1 Xは(表示起点[0]+セル横数)%セル横数 XIは表示倍率 (画像データ幅)回繰り返す GXは回数-1 IはY*セル横数+X データはセル配列[I] Jは(GY*画像データ幅+GX)*4 もし、データ>0ならば、 もし、データ≧(色リストの配列要素数)ならば、 データは(色リストの配列要素数)-1 ここまで イメージデータ["data"][J ]は色リスト[データ][0] イメージデータ["data"][J+1]は色リスト[データ][1] イメージデータ["data"][J+2]は色リスト[データ][2] イメージデータ["data"][J+3]は255 違えば、 イメージデータ["data"][J ]は色リスト[0][0] イメージデータ["data"][J+1]は色リスト[0][1] イメージデータ["data"][J+2]は色リスト[0][2] イメージデータ["data"][J+3]は0 ここまで XIはXI-1 もし、XI≦0ならば、 XIは表示倍率 Xは(X+1)%セル横数 ここまで ここまで YIはYI-1 もし、YI≦0ならば、 YIは表示倍率 Yは(Y+1)%セル縦数 ここまで ここまで イメージデータで戻る ここまで # 環境の準備して設定に従い生成・表示を行う # Global:セル配列,セル初期化方法,ルール,ルール番号,イメージ,画像データ幅,画像データ高 ●開始とは # 「死」のセルは透明なので背景を黒にする 描画中キャンバスの"背景色"に黒色をDOMスタイル設定 イメージは[画像データ幅, 画像データ高]のイメージデータ作成 # 準備 セル配列はセル初期化方法で初期セル配列生成する ルールはルール番号をルール分解する # 完成状態表示 全世代生成する 全世代描画する ここまで # イメージデータ操作関数 # 全ピクセルが0x00000000(黒の完全透明)のイメージデータを新たに作成して返す # PARAMに、[幅,高]の配列を指定すると、指定したサイズのイメージデータを作成する # PARAMに、[イメージデータ]を指定すると、指定したイメージデータと同じサイズのイメージデータを作成する # Globa:- ●(PARAMの)イメージデータ作成とは 描画中コンテキストの"createImageData"をPARAMでJSメソッド実行で戻る ここまで # 現在のキャンバスにイメージデータを指定した座標にputImageDataにて描画する # DrawImageとイメージデータの画像で「置き換える」。描くより高速。 # Globa:- ●(イメージをXYに)イメージデータ設定とは 描画中コンテキストの"putImageData"を[イメージ,(XY[0]),(XY[1])]でJSメソッド実行 ここまで
d40e828d4435185f454b3e8730f40cc3
1800