Pythonのturtleというものを使って遊んでみた成果をざっくり紹介します。
細かいプログラムの解説とかはしないですが、turtleはむっちゃ簡単なのでちょっと調べればだれでも使えるので遊んでみると面白いです。
turtle(Turtle graphics)とは…
成果物
いきなりですが、自分の作ったものを紹介していきたいと思います。
蜂の巣やトーナメント表っぽいのを描いてみた。
千葉県を描いてみた。
[地図データ] 以下から引用させていただきました。国土地理院発行の数値地図
ESRIジャパン: http://www.esrij.com/products/japan-shp/
turtleを使うと、こんな感じに図形がかけます。すげー(棒
ざっくり解説
turtleを用いて作った上の2つについて、メモ書き程度に解説を残しておきます。
環境
- Mac OS 10.12.2 Sierra
- Python 3.4.1 :: Anaconda 2.1.0 (x86_64)
- pyenvで導入したものです。
解説
蜂の巣っぽいの。
# turtle で六角形を書く。 from turtle import * length = 50 def branch(d): if d < 0: return; forward(length) left(60) branch(d-1) right(120) branch(d-1) left(60) forward(-length) def turtle_init(): speed(7) if __name__ == "__main__": turtle_init() branch(5) input()
このプログラムでは再帰を用いて深さdまで同じ図形を描いていきます。left(60)やright(60)で向きを変え、forward(length)でlength分だけ移動し、線を書きます。
turtle_init関数のspeedは移動する際の速さを調整する事ができます。
(動画の途中から移動が早くなるのはプログラムではなく動画の編集で行っていますw
最後にinput()で入力待ち状態になっています。これがないとプログラムが終了してしまい、描画した画面が閉じてしまいます。
turtleの説明としては、こんなかんじ。どうでしょう?むっちゃ簡単だと思います!
トーナメント
# turtle でトーナメント表を書く from turtle import * h = 20 def branch(l): if l < 3: return; # 左側の木 left(90); forward(l) right(90); forward(h) branch(l*1/2); forward(-h) # 右側の木 right(90); forward(l*2) left(90); forward(h) branch(l*1/2); forward(-h) # 最初の位置に戻る left(90); forward(l) right(90) def turtle_init(): speed(10) if __name__ == "__main__": turtle_init() # 右側 forward(h) branch(150) # 左側 right(180) forward(h*2) branch(150) # 優勝 right(180) forward(h) left(90) forward(h) input()
ちょっとプログラムが長くなりましたが、たいしたことはしていません。
branch関数の引数 l はトーナメントを作る際の高さの幅です。これが3より小さくなるまでループを繰り返します。
turtleでトーナメント表のプログラムを描いた際の注意点としては、branch関数が終わる際にはきちんと最初の位置に戻るようにすることです。
そうしないと、再帰を繰り返すごとに明後日の方向へ飛んでいってしまいます。
千葉県を書く。
これについては、プログラムが(汚いため)長くなるのでGitHubのGistにコードを掲載しました。
takunoko/write_turtle_chiba.py – GitHub Gist
[地図データ] 以下から引用させていただきました。国土地理院発行の数値地図
ESRIジャパン: http://www.esrij.com/products/japan-shp/
地図データはシェープファイル(.shp)を利用しました。シェープファイルを読み込む際にpyshpのshapefileというモジュールを利用しました。
利用方法としては、githubのpyshpのページをcloneしてpython setup.py installを実行するだけです。詳しくは[Python モジュールのインストール — Python 2.7.x ドキュメント]あたりを参考にしてください。
データを扱う際にpandasを利用しています。pandasとは、Pythonでデータ解析とかをするときに便利なライブラリです。プログラムの下の方(94行目)では’KEN’が千葉県のデータを取得する際にこんな感じに簡単に取得できたりします。あと、内部での処理がCやCythonで書かれているため高速だとか… (Pandas – Wikipedia)
jp_data_escape関数では、もとものbyte型で与えられる市町村の名前などを日本語に戻しています。この際に政令指定都市や郡とかだと区分けが異なって値が無しになる場合があって、その際には変換がエラーとなるのでしないように…みがいな処理が3項演算子で書かれてます。
その他、自作関数に関してはコメントのとおりです。シェープファイルの扱いがちょっと手間取ったのと、描画する範囲に緯度・経度を対応させる計算が微妙にわかりずらいですが、やってることは大した事ないですw
まとめ
Pythonでturtleなるものを知ってからゴニョゴニョ遊んで地図を書くまで1日。やっぱりPythonはやりたい事・目的に対してパパっと実装できるのがいいですね。成果がすぐに見える形になって楽しいですね^^。
本当にザクっとした説明?にもなっていない感じですが「Pythonは便利だなぁ。」って記事でした。
関連記事
Pythonで遊んでみる -part1- (OpenCVで顔認識)
Pythonで遊んでみる -part2- (NFCを使ってみる)