4. RNA から Fuun へ
人間と同様に、ふーん RNA はたんぱく質の合成を指示し、結果として生物の形を得ます。我々は生き物をアセンブルする能力を持っていないので、生き物のアセンブルを実行できるのは宇宙船 Arrow のみということになります。しかし幸いにも、我々は結果として生じる生物の形態と、その環境を示す画像にたどり着くことができます。このセクションでは、ふーん RNA を表示する方法について、我々が把握していることを説明します。
図2から、ふーん RNA がながーい命令のリストであることを思い出してください。それぞれのコマンドは7個の塩基からなる DNA 文字列によって表されますが、最後の RNA 命令だけは7個よりも少ない塩基で表されるかもしれません。ふーんを RNA からビルドする間、それぞれの RNA が処理され、内部の状態はアップデートされていくでしょう。結果として生じる画像は、その内部状態の一部に他なりません。
画像を表すデータ型を図17の中で説明します。「座標(Coord)」は、0 から 599 までの自然数であり、座標のペアは「位置(Pos)」を表します。「Component」は 0 から 255 までの自然数で、3個の component が組み合わさって、「RGB 値(RGB)」になります。「Transparency (もしくは alpha)」は component の1種であり、いくつかの色はあらかじめ定義されています。とりわけ重要なことは、黒は (0, 0, 0) に等しく、白は (255, 255, 255) に等しいということです。また、transparency が 0 であるということは色が完全に透明であることを意味し、transparency が 255 であることは色が完全に不透明であることを意味します。
Bitmap は pos によって索引付けられる配列であり、(0, 0) から (599, 599) までのそれぞれの要素が Pixel になっています。pixel は RGB と transparency のペアからなり、位置 (0, 0) は画像の左上を、位置 (599, 599) は画像の右下を表します。bitmap b の pos p にある pixel について言及するために、我々は b@p という表記を用います。
ふーんをアセンブルする処理はまた、Bucket という一連の Color によって定義付けられるデータを利用します。ここで、Color は RGB 値(postfix rgb によって表される)または transparency 値(postfix α によって表される)のどちらかで表されます。さらに、我々は方向(Dir)というデータ型を必要とします。dir は北(N)、東(E)、南(S)、西(W)のいずれかの値をとります。
4.1. 状態
RNA を解釈する間、かなりの量の内部状態を表す変数が利用されます。状態を構成するそれぞれの要素は、グローバル変数に保存されます。図18にそれぞれの構成要素の初期値を示します。
一連の color を保存する変数 bucket は空の状態で初期化されます。この bucket がどのように動くかについてはセクション3.4で説明します。変数 position は現在処理している RNA の位置を意味し、ちょうど左上の角にあたる (0, 0) の位置で初期化されます。位置を示す変数としてはもうひとつ、mark と呼ばれるものがあり、これもまた (0, 0) の位置で初期化されます。現在の方向を示す変数 dir は東(E)で初期化されます。この変数はビルド・プロセスの焦点が次にどの方向へ変わるかを表します。
position とmark、そして dir は移動と描画に関する RNA コマンド(それぞれセクション4.4, 4.5で記述される)で使用されます。
そして、一連のビットマップが変数 bitmaps に保存されます。bitmaps は完全に透明なビットマップをひとつ含みます。完全に透明なビットマップとはすなわち、すべての正常な位置オブジェクト p において、transparentBitmap@p = (black, transparent) を満たすようなビットマップのことです。セクション4.6では、一連のビットマップがどのように使われるかについて説明します。
(図17. 座標, 色, ビットマップ)
(図18. ふーんアセンブルにおける状態の初期化)
4.2. RNA の処理
RNA を処理するフェイズにおける主な関数を図19に示します。その構造は単純です。最初に、入力として rna を読み込みます。このとき、グローバル変数 rna は、前のチャプタのプログラムによって出力された RNA 命令を含んでいるでしょう。
一連の RNA 命令は、左から右へ読み込まれます。我々は順番にそれぞれの命令 r を分析します。Arrow は我々に、ふーんアセンブルに不可欠であるらしい 20 の RNA コードに関する情報を提供してくれました。命令 r がそれら既知の RNA コードのうちのひとつであるならば、我々は状態を更新するなんらかの処理を行います。もし命令 r が未知のものであるならば、我々はそれを無視して次に進みます。
(図19. RNA からふーんをビルドする)
処理の終わりに、我々は一連の bitmaps から最初のひとつに注目し、それを画像として描きます。結果として生じる画像は bitmaps[0] に含まれる RGB値 によって決定されます。bitmaps[0] に含まれる Trancparency値 は無視され、画像の描画においては完全に不透明なもの(255)として処理されます。
既知の RNA 命令は、4つのグループに分類することができます。そのグループとは、bucket に影響を及ぼすもの、焦点を変えるもの、画像を描画するもの、そして bitmaps に影響を及ぼすものです。それぞれの命令のグループに関する詳細を、以下のセクションに示します。
4.3. Bucket コマンド
既定の8個の color と2個の transparency 値のために、既定の Color を bucket の先頭に追加する命令が存在します。この命令は図20に示す addColor 関数を使用します。また、命令 'PIIPICP' は bucket を空にします。
bucket は pixel に関する情報をエンコードします。ここで、pixel とは現在の color と transparency 値を意味します。addColor と共に図20に示される関数 currentPixel は、この Pixel の値を決定するために使用されます。
(図20. 色バケツ)
(図21. currentPixel のためのサンプル)
現在のアルファ値 a_c は bucket のすべての transparency 値の平均です。もし bucket に transparency 値が存在しなければ、アルファ値 a_c は不透明なピクセル(255)と見なされます。
それぞれの color component は、現在 bucket の中にある color components の値の平均となります。そして、それらの color component は現在の transparency 値によってノーマライズされます。変数 bucket が空のとき、currentPixel 関数は (black, opaque) という黒くて不透明な pixel を返すことに注意してください。
currentPixel は、bucket に含まれる一連の Component の平均を計算するために average 関数を使用します。もし Components が空であれば、この関数はデフォルトの値を返すでしょう。さもなければ、average 関数はそれぞれの component を合計し、さらに components の個数で割り、切り捨てたあとの値を返します。図21に currentPixel の呼び出し例を4つ示します。それぞれの例は異なった bucket を生成するでしょう。
(図22. 焦点の移動)
4.4. 移動コマンド
命令 'PIIIIIP' は dir の現在の値に応じて位置を変更します。現在の位置と方向があれば、図22に示される関数 move は新たな位置を返します。例えば、もし方向が東で、現在の位置が (324, 210) であったならば、新たな位置は (325, 210) になります。もし新たな位置が不正であるならば(ビットマップの領域外にあるならば)、我々は新たな位置を逆側に設定します。例えば、(100, 0) の位置から北に移動する場合、新たな位置は (100, 599) として与えられます。
RNA コード 'PCCCCCP' は方向を反時計回りに回転させます。この回転のために関数 turnCounterClockwise が使用されます。例えば、現在の移動方向が南であるならば、新たな方向は東になります。
RNA コード 'PFFFFFP' は方向を時計回りに回転させます。この回転のために関数 turnClockwise が使用されます。turnClockwise はちょうど turnCounterClockwise の逆の動作をします。例えば、現在の移動方向が南であるならば、新しい方向は西になります。
4.5. Draw commands
4.6. Bitmap commands
最終更新:2008年05月19日 01:28