Sample0
to square :size
repeat 4 [forward :size right 90]
end
to sample0 :size
repeat 4 [square :size right 90]
left 45
repeat 4 [square :size * 0.7 right 90]
end
上記の2つのプログラをFileメニューから、New Editor
Windowを選択してからタイプするか、このページからコピー&ペーストしよう。
次にEditメニューからDefineを選択すれば準備完了である。
Listenerウィンドウで、sample
100とタイプしてリターンキーでプログラムが実行されます。
右の絵が描けたはずである。
どうしてこんな図形が、描けたのであろうか。
repeat 4 [square :size right 90]
squareを、4回呼び出しているから同じ所を、ぐるぐる回ると勘違いしそうですね。
しかしsquareを、呼び出した後に、更に90度右に方向を変えていますから、同じ所は回りません。
そして、4つ四角形を描いたら左に45度方向を変えて、少し小さい四角形を4回描きます。
おや、:sizeに0.7を掛算していますね。*この記号は、掛算の命令だったんですね。
100に0.7を掛けると当然70になります。タートルは70歩の大きさで四角形を描いてくれました。
Sample1
to sample1 :size
repeat 180 [square :size right 2]
end
Sample0より簡単な図形です。
四角形を、2度づつ傾けながら180回描いているだけです。
なぜ180回繰り返させたか判りますね。
判らなかったら、180を他の回数に変更してみましょう。
Sample2
to random.color15
setpc random 15
end
to square_side23draw :size
penup
forward :size
right 90
pendown
forward :size
right 90
forward :size
right 90
penup
forward :size
right 90
pendown
end
to square_side23 :size
repeat 180 [random.color15 square_side23draw :size right 2]
end
to sample2 :size
square_side23 :size
end
Sample2は、単にsquare_side23を呼び出しているだけです。
そして、square_side23は、random.color15とsquare_side23drawを、呼び出しているにすぎません。
Sample1のまん中の線を、描いていないだけですね。
square_side23drawは、描き始めの最初の辺と最後の辺を、描かない様にpenupとpendownを使っています。
線の色変更は、random命令を使い適当にやってみました。
Sample3
to square_side12draw :size
pendown
forward :size
right 90
forward :size
right 90
penup
forward :size
right 90
forward :size
right 90
pendown
end
to square_side2draw :size
local "angle
if (0 < :size) then make "angle [right 90] else make "angle [left 90]
penup
forward :size
run :angle
pendown
forward :size
run :angle
penup
forward :size
run :angle
forward :size
run :angle
pendown
end
to square_side12 :size
repeat 180 [random.color15 square_side12draw :size right 2]
end
to square_side02 :size
repeat 180 [random.color15 square_side2draw :size right 2]
end
to msgn :num
output * -1 :num
end
to sample3 :size :repetition
local "reduce
name 0.65 "reduce
if :repetition <= 1 [
square_side12 :size
square_side02 msgn :size
] [
square_side02 :size
square_side02 msgn :size
sample3 * :size :reduce (- :repetition 1)
]
end
どうしましょう。いちいち1行づつ説明していたら1冊の本が、書けそうですね。:-D
Sample2を数回描いたみたいな図形です。
Sample3は、sample3 100 4
とタイプして実行しています。
if文の] [
の後の3行の命令が、この図形の肝腎な部分です。
そして、sample3 * :size :reduce (- :repetition
1)と、自分自身を小さくして更に、繰り返す回数を徐々に減らしながら呼び出しています。
この方法は、よく使われるので今のうちに慣れておきましょう。
それと、数値の計算方法もSample0と比べると、ちょっと違います。
ポーランド記法と、言われている計算方法です。
:repetitionが1か、それ以下になったら真ん中の図形を描いてプログラムは終了します。
実際に、線を引くプログラム(正確には四角形の1部を描く)は、線の引き方を工夫しているだけで、大した事をしている分けではありません。
msgnのプログラムは、何をしているか、すぐに判ったでしょう。
そう、与えらた数値の符号を反転して、その結果をもどす関数になっています。
なぜマイナス値を四角形を描くプログラムに与えるかは、1行づつ追って行けば、どうなるかは、目で見てすぐに判りますね。
Sample4
to square_side2thirdsdraw :size
local "angle
if (0 < :size) then make "angle [right 90] else make "angle [left 90]
penup
forward :size
run :angle
forward / :size 3
forward / :size 3
pendown
forward / :size 3
run :angle
penup
forward :size
run :angle
forward :size
run :angle
pendown
end
to square_side02thirds60 :size
repeat 60 [square_side2thirdsdraw :size right 6]
end
to sample4.sub1 :size :loop
if ((remainder :loop 2) = 0) [
square_side02thirds60 :size
] [
square_side02thirds60 msgn :size
]
end
to sample4 :size :repetition
local "reduce
name 0.847 "reduce
for "loop 1 :repetition [
sample4.sub1 :size :loop
make "size (* :size :reduce)
]
end
sample4 100 8 とタイプして実行しました。
今度は、 for文で決められた回数だけ線分を描いています。
sample4.sub1のremainder関数で、奇数回の時に逆向きの線分を描いているのが、判りますね。
定数reduceの0.847は、プログラムを試しながら適当に、当りをつけたので、きちんと線と線が接していません。
でも、結構美しいパターンになりました。
もっと真面目に、やった方が良いのですが元来テキトーな性格なのでやりません。
みなさんは、真面目に作ってみて下さい。B-D
これくらいの図形なら、出来上がりが頭の中で想像できるのですが、プログラムが複雑になってくると、実行するまで判らない事も多々あります。
それも、ひとつの楽しみですね。
|