アルゴリズム入門 演習課題例:タートルグラフィックスでお絵かき

turtleライブラリ

turtleライブラリは、ペンをもった「カメ」を操作することで絵を書くためのライブラリです。このようなシステムは「タートルグラフィックス」と呼ばれ、プログラミングの入門教材として広く使われています。

プログラミング例

以下のプログラムは、その左にあるような星印を描きます。

star
import turtle
turtle.setup()
turtle.pendown()
for i in range(0,5):
    turtle.forward(100)
    turtle.right(144)
turtle.penup()

import turtleturtleライブラリの読み込みです。また、turtle.setup()はカメが動き回るキャンバスの起動です。この2行は1度だけ実行すれば大丈夫です。

注意:Google Colabを使っている人は、上記2行の代わりに以下の3行を実行してください。

!pip install ColabTurtle
import ColabTurtle.Turtle as turtle
turtle.initializeTurtle()

カメはペンをもっています。turtle.pendown()関数を呼ぶと、カメはペン先を紙につけます。以降、カメが動いた軌跡が描画されます。一方、turtle.penup()関数を呼ぶと、カメはペン先を紙から離します。

今回の例では、カメは「前へ100進む(turtle.forward(100))」と「144度右を向く(turtle.right(144))」を5回繰り返すことで、星を描いています。

turtleライブラリの主な機能

turtleライブラリの主な機能は以下のとおりです。もっと詳しい情報を知りたい場合、リファレンスマニュアルを見てください。

演習課題例

流れ星

流れ星を1つ描く関数を作り、それをfor文で何度も呼ぶことにより、下のような流れ星を描くプログラムを書け。

shooting star

うずまき

  1. 一辺の長さdの正n角形を描く関数polygon(d,n)をプログラムせよ。
  2. polygon(d,n)nを十分大きくすると円が描ける。これを利用して、半径rの円を描く関数circle(r)をプログラムせよ。
    ヒント:mathライブラリを利用しよう。
  3. circle(r)と同様にして、半径が徐々に小さくなるように描くと渦巻きになる。これをふまえ、下のような渦巻きを描くプログラムを作成せよ。
twiddle

フラクタル

  1. 正三角形を描くプログラムを作れ。
  2. 正三角形の各辺の中心に1/3の大きさの正三角形を付け加えたような、下左端の図形を描くプログラムを作れ。
  3. 同様に、各辺の中心にその辺の1/3の大きさの正三角形を付け加えることを繰り返し、下右のような図形を描くプログラムを作れ。
    ヒント:再帰関数を用いる。0段階目が正三角形、1段階目が(1)で作った図形……として段階を増やしてゆくことを考える。下図は右に進むに従い1段階ずつ段階が上がっている。このとき、n段階目の「一辺」は、n+1段階目の「一辺」を4つ組み合わせたものになる。
koch1 koch2 koch3 koch4

積分

関数fと数値hに対し「現在地点 (x, y) から (x + h, y + h × f(x)) まで移動しつつ線を引く」ことを繰り返すことを考える。hが小さければ、描かれる線は関数fを積分して得られる関数に対応すると思われる。これを以下のように実現せよ。
  1. (dx, dy) が与えられた時、現在地点を (x, y) として、現在地点から (x + dx, y + dy) へまっすぐカメを動かすプログラムを作れ。
    ヒント:カメが今どちらを向いているかに結果が影響されてはいけない。
  2. 常識的な関数の入力・出力の値はそのままカメの位置として使うには適していない。「関数の入出力値をscale倍した値がカメの座標」となるような変数scaleを適当に定めよ。
  3. 「現在地点 (x, y) から (x + scale × h, y + scale × h × f(x / scale)) まで移動しつつ線を引く」ことを繰り返すプログラムを作れ。なお、下図左上はcos関数を、左下はf(x) = 1/xを、右はf(x) = |x| / 4を、それぞれこの手法で積分した結果である。
  4. (発展課題)この手法での積分の精度を評価するため、厳密な積分結果が分かっている適当な関数(例えばf(x) = 1/x)についてこの手法を適用し、厳密な積分結果をプロットしたものと比較せよ。また、「h × f(x)」の部分を「h × (f(x) + f(x + h)) / 2」とするとどうなるかもためしてみよ。
integral1
integral2
integral3
戻る

東京大学教養学部 情報図形科学部会