[SBasic] 続・タートルグラフィック

2010年7月10日

 久々にフリーの休日を手に入れたので、中学の頃に作った利用券を携帯して市の図書館に行ってみた。
 なんでかというと、過去、中学校の図書館にはあった Logo の本とかないかなー?と。さすがに書店では絶滅しているので…

 で、結論から行くと、2冊の本を発掘しました。が、あまりおもしろいサンプルとかはなく、かなり残念。書籍中では「簡単簡単」と連呼している割に、やけに難しく、かつ、応用性がないなと感じるロジックが多かったです。こんなかったかなあ?

 唯一「おお」と思ったのは円の描き方。といっても先日紹介した四角形を描く方法を応用して多角形を描き近似する方法ですが、多の処理系ではわざわざこんな方法は用いませんよね、ということで紹介。

 コード

Turtle.Speed = 10
Turtle.X = 20
Turtle.Y = 80

For i=1 To 36
  Turtle.Move(10)
  Turtle.Turn(10)          ' 10°右に曲がれ!
EndFor

 結果

画像

 これを応用すると、WikipediaのLogoのエントリーで掲示されているような画像が描けます。
 コード

Turtle.Speed = 10
Turtle.X = 120
Turtle.Y = 120

a=30          '  円の数
b = 360 / a 

c=30          '  多角形の頂点の数(多いほど円に近い)
d = 360 / c

For x=1 To a
  For y=1 To c
    Turtle.Move(10)
    Turtle.Turn(d)
  EndFor
  Turtle.Turn(b)
EndFor

 結果

画像

 なんか、もうちっょとひねった画像が描けないかなあ。とか考えていたら、確かコッホ曲線とかあったよね。と思って描いてみた。

 コード

Turtle.Speed = 10
Turtle.X = 20
Turtle.Y = 100

MaxLevel = 4      '  操作の回数
LineLength = 4    '  辺の長さ

Turtle.Angle = 90 '  右水平方向に
CurrentLevel = 0

'  コッホ雪片を描く
For x=1 To 3
  Koch()
  Turtle.Turn(120)
endfor 

'  コッホ曲線を描く
'  # 線を引く→左60°→線を引く→右120°→線を引く→左60°→線を引く
Sub Koch
  CurrentLevel = CurrentLevel + 1

  If (CurrentLevel = MaxLevel) Then 
    Turtle.Move(LineLength)
  Else
    Koch() 
  Endif
  Turtle.Turn(-60)

  If (currentLevel = MaxLevel) Then 
    Turtle.Move(LineLength)
  Else
    Koch() 
  Endif
  Turtle.Turn(120)

  If (currentLevel = MaxLevel) Then 
    Turtle.Move(LineLength)
  Else
    Koch() 
  Endif
  Turtle.Turn(-60)

  If (CurrentLevel = MaxLevel) Then 
    Turtle.Move(LineLength)
  Else
    Koch() 
  Endif

  CurrentLevel = CurrentLevel - 1
EndSub

 結果

画像

 Logo入門といえばコッホ、みたいなイメージがあったんだけど、前述書籍でもぐぐっても出てこない。なんで?なにかの情報と入れ替わっているのかなあ?

 ともあれ、なんかひさびさに仕事と全く絡まないコードと戯れた一日となって、なんとなくノスタルジックでした。






カテゴリー: Program, Small Basic

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org