5.6 繰り返し実行とループ
5.6.3 渦巻き
12
内接多角形の発展形として渦巻きを作ることができます。
13
渦巻きは、ペンが原点の周りを回るときにその回転半径が変化して行く図形です。半径が回転 に比例して増えるならば、式(5.1)を以下のように修正すればよいでしょう。ここにαが比例定数
(a)半径100の正11角形の描画プログラム
(b)実行結果
図5.24: 内接多角形の描画 です。
(xi, yi) = (ricosθi, risinθi), (5.2) ただし ri = α·i,
θi = (360
n )
i
この式に基づくScratchのプログラムと実行結果は図5.25の通りです。ただし、α= 1.1としまし
1
た。また、n= 50と大きな数に設定したため、多角形の角はほとんど目立たず、滑らかな曲線に
2
見えます。
3
多角形の場合には1回転分だけペンを動かせば十分でしたが、渦巻きの場合には原点の回りに
4
何周分もペンを動かす必要があります。そこで、可能な限り広い範囲に描画することを意図し、図
5
5.25のプログラムでは以下のブロックを用いました。
6
7
この制御ブロックは、処理を固定回数だけ繰り返すのではなく、スプライトが⟨[端]に触れた⟩と
8
いう条件が成り立つまで繰り返すブロックです。条件⟨...⟩の部分は他の真偽値ブロックに置き換
9
えることができますから、繰り返しの終了を柔軟に制御できるようになっています。
10
(a)渦巻きの描画プログラム
(b)実行結果
図5.25: 渦巻きのプログラム
ほとんど全てのプログラミング言語では(もちろんC++でも)、固定回数繰り返す機能とある
1
条件が成り立つまで繰り返す機能(あるいはある条件が成り立っている間、繰り返す機能)が装備
2
されており、プログラムの内容に応じて使い分けられています。
3
さらに改造を加えます。複数の渦巻きを重ねて多重渦巻きを作りましょう。
4
多重度をmとするとき、式(5.2)に360/m度毎に異なる位相ϕj(j= 0,1, ..., m−1)を追加 します。
(xi,j, yi,j) = (ricos(θi+ϕj), risin(θi+ϕj), (5.3) ただし ri = α·i,
θi = (360
n )
i, ϕj =
(360 m
) j
この式に基づくScratchのプログラムは図5.26の通りです。ただし、m= 3とし、3重化しまし
5
た。繰り返し処理が
入れ子
になっていることに注意してください。6
考察 次のような動作をするプログラムをScratchで作りなさい。
7
(a) 3重渦巻きの描画プログラム
(b)実行結果
図5.26: 3重渦巻きのプログラム 螺旋(らせん)の描画プログラム
緑の旗をクリックすると猫が図5.27のような2重螺旋を描画するプログラムを作りなさい。
なお、螺旋はその中心位置が少しずつ移動していく円と考えることができます。図5.27の場合、螺 旋はx軸方向へ移動していますから、以下のような式で記述できます。ここにβは定数です。
(xi,j, yi,j) = (ricos(θi) +β·i, risin(θi)), (5.4) ただし ri = α·i,
θi = (360
n )
i
2重螺旋を描くにはさらに位相の異なる螺旋を重ねる必要があります。
1
図 5.27: 2重螺旋