前回はJavaScriptでルーレットを作りましたが、今回は円形のルーレットをつくります。

扇形に内接する正方形を求める

円形のルーレットをつくる場合、扇形に内接する正方形の座標を考えなければなりません。半径(R)と中心角(θ)が与えられている場合、扇形に内接する正方形の一辺の長さ(L)と頂点の座標を知るにはどうすればいいでしょうか?

上下対称なので上半分だけ考えます。三角形OBDを考えます。OBの長さはR、BDはL/2、あとはODの長さが分かれば三平方の定理より方程式を作って求めることができそうです。

CDの長さはLです。ではOCの長さはどうなるでしょうか? tan(θ/2)= AC / OCであり、AC = L / 2 なので、OC = L / 2 / tan(θ/2)です(上半分だけ考えているので中心角はθの半分)。

OB^2 = BD^2 + OD^2
R^2 = (L / 2)^2 + (L + L / 2 / tan(θ / 2)) ^ 2

あとはLの方程式を解くだけです。Lの値がわかればOCの長さもわかります。

L = R × √(1/A) * Aは 1 / 4 + {1 + 1 / 2 / tan(θ / 2)}^2
OCの長さ = L / 2 / tan(θ / 2)

ではコーディングしていきましょう。

HTML部分

HTML部分を示します。

style.css

グローバル変数と定数

グローバル変数と定数を示します。

index.js

ページが読み込まれたときの処理

画像ファイルはimagesフォルダのなかに0.png~6.pngという名前をつけて保存されています。これらを読み出してイメージを配列に格納します。それから回転が始まっていないのに停止ボタンを選択できるのはおかしいので、これを非表示にします。

index.js

更新処理

扇形を描画してその内部を塗りつぶし、そのなかに画像を描画します。扇形の中心角だけ回転させながらこれを繰り返せば円形のルーレットを描画することができます。そして右側にルーレットのどの部分を指しているかがわかるように三角形の図形を描画します。

ルーレットを回転させる

回転ボタンをクリックしたときの処理を示します。

speedを0からMAX_SPEEDに変更することで、更新処理時にルーレットが回転しているように見えるようになります。

ルーレットを停止させる

停止ボタンをクリックしたたときの処理を示します。

回転速度を低下させていき、最低速度を下回ったら停止させます。