Pythonにはタートルグラフィックスというものがあり、プログラミングを子供向けに紹介するのによく使われているもので、Pythonの入門書でも扱われているものがあります。
画面に表示される亀の形をしたポイントを、プログラミングで動きを指定して動かすことで、図形などを描いて行きます。
ここでは、このturtleモジュールを使って、簡単かグラフィックスを描いてみましょう。
turtleで図形を描いてみる
turtleを使ってPythonで図を描画するには、turtleモジュールをインポートしてつかいます。
from turtle import *
turtleの機能をここで全部扱うには無理があるので、詳細は公式ドキュメントを見てもらう必要があります。ここではどんな動きをするのかその触りだけ見て行こうと思います。
まず線を引くにはforward()関数に引数で進む距離を与えて実行します。
from turtle import *
forward(100)
done()
100進む線を引くコードになっています。ターミナルのシェルでPythonを使っている場合はこのforward()まででもいいです。
Pythonファイルにコードを書いて実行する場合は、スクリーンイベントを利用する関数done()を記述します。
これを実行すると別ウィンドウで描画されます。
右に直線が引かれています。
この線を使って、正三角形を描くとすると、この線の終点から後2つ線を描く必要があります。この直線の方向の終点から左に120度回転して同じ距離を進み、そこから再度120度左に回転して同じ距離を進むと正三角形が描けるはずです。
左に回転する関数はleft()となり、これに角度を引数として与えて描きます。
上のコードに加えると次のようになります。
from turtle import *
forward(100)
left(120)
forward(120)
left(120)
forward(100)
done()
実行するとこうなります。
他にも、丸を書いたり、線に色をつけたり、線の太さを変えたりすることができます。
このコードに続けて、color()を使って線を赤色にし、pensize()で線の太さを変え、circle()で半径100を与えて記述しています。left(30)も加えて、先ほど描いた正三角形が描く円に接するようにコードを次のように書いてみました。
from turtle import *
forward(100)
left(120)
forward(100)
left(120)
forward(100)
color('red')
pensize(10)
left(30)
circle(100)
done()
実行するとこうなります。
公式ドキュメントにある関数を使って、色々と描いてみるのもいいでしょう。図の位置関係などを理解する練習にもなります。
コードを書き換えてみよう!
このコードを使ってもうちょっと遊んでみます。
今度は先に描画を示します。
先ほどのコードと関数で書き換えることができますので、ちょっとやってみてください。
出発点を軸に正三角形を書くのは同じです。回転させながら6回正三角形を書きます。
そして最後の正三角形を書き終えて円で囲むにはどこへ移動させればいいのかを考えます。
色々、描き方はあると思いますが、とりあえずこんなコードを書いてみました。
from turtle import *
for _ in range(6):
forward(100)
left(120)
forward(100)
left(120)
forward(100)
left(180)
forward(100)
color('red')
pensize(10)
left(90)
circle(100)
done()
6回正三角形を繰り返して書くところをfor文でまとめてみました。他にも描き方のコードは考えられますので色々やってみてください。
イデのゲージを描いてみよう!
ではもう1つ。このマークを描いてみましょう。伝説巨人イデオンに出てくるイデのゲージの印ですね。
これ、直線の長さを計算するのにルート計算が必要になるので、そこを手計算すればこれまでの関数だけでもコードを書くことはできますが、どこまで桁数を使うかで精度が変わるので、ここはmathモジュールをインポートして計算に使ってみました。
スマートな描き方では無いですが、力技で強引にコードを書くとこうなりました。
from turtle import *
import math
speed()
bgcolor("#49b716")
pensize(10)
pencolor("white")
hideturtle()
left(90)
forward(200)
left(90)
circle(200)
left(90)
forward(400)
left(180)
forward(200)
left(150)
forward(200)
left(120)
forward(200)
left(120)
forward(400)
left(150)
forward(math.sqrt(3)*200)
left(90)
forward(200)
left(90)
forward(math.sqrt(3)*200)
done()
このコードでこれまで使って無いものと言えば、mathモジュールとbgcolor() での背景の色付け、 hideturtle()でペン先の表示を消したというところですね。
何も考えずに、とりあえず作ってみた感じ。もっとスマートなコードでも書けると思うので、いろいろと試してみてください。なんかイデオンをDVDで見たくなってきました(笑)
turtleで再帰プログラミングのグラフィックに挑戦
先ほど、繰り返しの描画をしてみましたが、試しに四角を描いて回転しながら徐々に大きくなるという再帰性のあるプログラミングを書いてみました。
from turtle import *
n = 150
length = 4
angle = 15
speed(0)
color('red', 'yellow')
begin_fill()
for _ in range(n):
for _ in range(4):
forward(length)
left(90)
left(angle)
length = length*1.03
end_fill()
done()
nは繰り返す回数、lengthは最初の長さ、angleは角度として初期値を与えています。
speed()は描画のスピードで0が一番早いモードになっています。color()で色を指定して、begin_fill()、end_fill()でコードを囲むことで塗りつぶしています。
n回繰り返すわけですが、その中で、range(4)で線を描いて90度回転させて四角を描き、angleで角度を変更して、length*1.03で長さを変更し、再度四角を描くということになっています。
実行すると次のような図が描けます。
線の長さや角度、回数などを変えるとまた違った図柄になります。
ネットにはいろんな描き方が紹介されていますし、Pythonのturtleno中にもデモスクリプトがあります。
turtleのデモスクリプトを見る
turtleのデモスクリプトは付属のデモビューアを使用して実行および表示することができます。
デモビューアはターミナルシェルから次のコマンドで見ることができます。
$ python -m turtledemo
次のビューワーが起動します。
メニューのExamplesからfractalcurvesというものを選んで実行してみましょう。ちょっと見えにくいですが、ビューワーの下側にSTART、STOP、CLEARとあるので、STARTで実行します。
左側にコードが表示されるので、コードを読んでみるのもいいでしょう。STARTをクリックすると、右側のスペースに描画が始まります。
完成図柄はこちらになります。
他のデモもExamplesから選んで色々と見てみましょう。
まとめ
Pythonにはタートルグラフィックスというものがあり、turtleモジュールをインポートして簡単に図形を描いて楽しむことができます。
turtleは、プログラミングを子供向けに紹介するのにもよく使われています。
なお、ここではお絵描きグラフィックでしたが、GUIアプリを作るtkinterパッケージにも目を向けてみるのもいいと思います。
色々触ってみることで、プログラミングでやっていることの理解の助けになります。サンプルコードなどを読み解いたり、コードのパラメーターを変更するなどしてみるのも有益だと思います。