ルービックキューブ
ルービックキューブの動きをプログラム的に実現することを考えます。 まずは、 六
面ある立体図形を3D的に描画してみます(図1参照)。各面の色は、赤・黄・白・緑
・紫・青の六色です。
<θ=45度、φ=60度の方向から見た図>
(図1、十進BASICによる3Dグラフィックス)
また、別な方向から見た図も示します(図2参照)。
<θ=210度、φ=150度の方向から見た図>
(図2、十進BASICによる3Dグラフィックス)
各面の方向(面に垂直な方向)は次のように取っています。
赤の面 → Z軸の+方向(φ=0度)
黄の面 → X軸の+方向(θ=0度、φ=90度)
白の面 → Y軸の+方向(θ=90度、φ=90度)
緑の面 → X軸の−方向(θ=180度、φ=90度)
紫の面 → Y軸の−方向(θ=270度、φ=90度)
青の面 → Z軸の−方向(φ=180度)
図1及び図2を描画するプログラムは、
<推奨値: YOS=−100、YOVP=2000>
です。 メインプログラムで各パネルの中心座標値とコーナー座標値を計算してい
ます。 これらのコーナー座標値を回転変換そして投影して3D描画しています。 パ
ネルを3D描画する外部副プログラムでは、 見る方向によって描画させるパネルを
切り替えています。 つまり、SINθ・COSθ・COSφの値を利用しています。
次のステップとして、各パネルに数字を割り当てることを考えます。ルービックキュー
ブを回転させる動作は各パネルが持つ色情報を上の数字に基づいて移動させるこ
とで実現できます(図3〜図5を参照)。
<パネルのナンバーリング(その1)>
(図3、十進BASICによる3Dグラフィックス)
<パネルのナンバーリング(その2)>
(図4、十進BASICによる3Dグラフィックス)
<パネルのナンバーリング(その3)>
(図5、十進BASICによる3Dグラフィックス)
54枚あるパネルのナンバーリングに特に規則はありません。 数字は自由に割り当
てて構いません。但し、これらの数字は配列の数字と一対一対応になっています。
それでは、具体的にパネルを移動させる方法を説明します。 Z軸の+方向から見て
、下から数えて三段目のパネルを時計方向に90度だけ回転させてみます。 パネル
の数字でいうと 19・20・21をそれぞれ 16・13・10 の位置に移動させることを意
味します。 色で言えば、 黄色のパネルを白色にし、白色のパネルを緑色に変えれ
ば良いことになります。この時、上面にある赤色のパネルも同時に動いていることに
注意してください(図3参照)。 すなわち、パネルの回転移動はパネルの数字を固定
したまま、そのパネルが持つ色情報を変化させても実現できることが判ります。二段
目については、側面にあるパネルのみを、 そして、一段目については側面と下面に
あるパネルを同様に処理することになります。反時計方向の回転は逆の操作になり
ます。
X軸の+方向から見た場合の回転やY軸の+方向から見た場合の回転も、上とやり
方は同じになるので説明は省略します。 以下に、 パネルの回転に関する外部副プ
ログラム名をリストアップしました。
<Z軸に関して>
Z3CROTATION(三段目のパネルを時計方向に90度回転)
Z3AROTATION(三段目のパネルを反時計方向に90度回転)
Z2CROTATION(二段目のパネルを時計方向に90度回転)
Z2AROTATION(二段目のパネルを反時計方向に90度回転)
Z1CROTATION(一段目のパネルを時計方向に90度回転)
Z1AROTATION(一段目のパネルを反時計方向に90度回転)
<X軸に関して>
X3CROTATION(三段目のパネルを時計方向に90度回転)
X3AROTATION(三段目のパネルを反時計方向に90度回転)
X2CROTATION(二段目のパネルを時計方向に90度回転)
X2AROTATION(二段目のパネルを反時計方向に90度回転)
X1CROTATION(一段目のパネルを時計方向に90度回転)
X1AROTATION(一段目のパネルを反時計方向に90度回転)
<Y軸に関して>
Y3CROTATION(三段目のパネルを時計方向に90度回転)
Y3AROTATION(三段目のパネルを反時計方向に90度回転)
Y2CROTATION(二段目のパネルを時計方向に90度回転)
Y2AROTATION(二段目のパネルを反時計方向に90度回転)
Y1CROTATION(一段目のパネルを時計方向に90度回転)
Y1AROTATION(一段目のパネルを反時計方向に90度回転)
例えば、X2AROTATIONを一度適用した後、Z3CROTATIONを適用すれば図
6のようなパネル配置になります。
<図1のパネル配置からの回転動作>
(図6、十進BASICによる3Dグラフィックス)
上記の外部副プログラムなどを追加して、 メインプログラムをさらに機能アップした
ものを次のリンクに示します。
課題(その1)
上記のルービックキューブは3X3X6の例ですが、4X4X6 そして5X5X6 のルー
ービックキューブの3D図を描画させるプログラムを作成してください。
課題(その2)
正六面体ではなく、他の正多面体を使って同様のゲームをすることは可能ですか。
課題(その3)
パネルの物理的な回転動作を模擬するアニメーションプログラムを作成してください
。まずは、Z軸の+方向から見て三段目のパネルを動かしてください。
課題(その4)
マウスのポインターを使ってパネルを回転動作できるプログラムを作ってください。