Python Google ColaboratoryでColabTurtleを使う

Python学習【365日チャレンジ!】307日目のマスターU(@Udemy11)です。

ネットショップでは福袋のシーズンに突入し、魅力的なアイテムが詰まった福袋がたくさん販売されていますが、どれもいまいち決め手を欠くんですよね。

福袋を物色していると、入っている商品の値段にお買い得感があって、さらに抽選で高額商品が当たるくじが入っている興味をひかれる福袋を見つけて購入しました。

昨日その福袋が届いたので、中身を確認すると、残念ながらくじは外れてしまいました。

お得にものを買えたということで、良しとしましょうか。

それでは今日も、Python学習を始めましょう。

昨日の復習

昨日は、大人も楽しめるturtleを使った幾何学模様の描写方法を学習しました。

forループを使って角度や長さを変えながら直線を描くことで、いろいろとおもしろい幾何学図形を描くことができました。

コードを描きながら、どんな図形になるのか想像しながら実行すると、意外な図形になったり、思っていたような図形になったりするので、楽しみながらコードを理解することができました。

くわしくは昨日の記事をごらんください。

今日は、turtleをGoogle Colaboratoryで使う方法を学習し、複雑な図形を描いてます。

Google Colaboratoryの準備

Google Colaboratoryを使う方法は、こちらの記事で紹介ししているので、導入がまだの方はこちらの記事からどうぞ。

Googleのアカウントを持っていれば、すぐにでも使えるので、アカウントの準備ができていれば、新規ファイルを作成します。

Google Colaboratoryは、Pythonの標準ライブラリであるturtleが使えないので、pipインストールでColabTurtleをインストールした後、ライブラリをインポートします。

!pip3 install ColabTurtle
from ColabTurtle.Turtle import *

まずは、上記のコードを記述して実行すれば、turtleとは少し使えるメソッドが違いますが、turtleと同じようにグラフィックの描写ができるようになります。

イチョウの葉っぱ

まずは、ツリー状の枝のようにイチョウの葉を描いてみます。

initializeTurtle(initial_speed=10)
color('yellow')
bgcolor('white')

min_length=15

def draw_branch(l, w):
    left(15)
    draw_stick(l, w)
    right(30)
    draw_stick(l, w)
    left(15)
  
def draw_stick(l, w):
    width(w)
    forward(l)
    if min_length < l:
        draw_branch(math.ceil(l*0.8), math.ceil(w*0.7))
    backward(l)

draw_branch(40, 15)

最初にイニシャライズが必要で、引数の描写のスピードは1から10までの間で選ぶことができます。

2行目、3行目で線の色と背景の色を指定しています。

デフォルトで使う場合はこの2行は必要なく、背景が黒、線が白なので、切り絵みたいになるので、これはこれできれいな感じがします。

5行目で指定しているmin_lengthは、角度と太さ、長さを変えつつ描く直線の最小の長さで、この長さ以下になった時にポインターを戻します。

7行目から12行目が直線の角度を変えるための関数draw_branchで、間に14行目から19行目で定義する関数draw_stickを角度変更の間に入れています。

14行目から19行目で直線の太さと描写を指定しているのですが、lの長さだけ進んだあと、if文で、最小の長さよりl(つまり直線の長さ)が長い場合には、長さを80%にして、太さを70%にしてdraw_branchを実行しています。

最後にbackwardlの長さだけ戻っているのですが、これは入れ子になったdraw_branchが完了してから実行されます。

draw_stickの中で実行されるdraw_branchには、長さ(l)と太さ(w)が縮んだ変数が代入されて入れ子になり、最小のlから順番に閉じられていくので、扇状の枝のような描写を表現することができます。

出力結果

Python Google ColaboratoryでColabTurtleを使う

完成図を表示していますが、Google Colaboratoryで実行すれば、描写の過程を見ることができます。

今回のコードを書いたGoogle Colaboratoryのファイルを共有していますので、参考にしてみてください。

菊花紋章っぽい模様

イチョウの葉っぱのコードを参考にして、forループを使って、菊花紋章っぽい模様を描いてみます。

initializeTurtle(initial_speed=10)
color('orange')
bgcolor('white')

min_length=30

def draw_branch(l, w):
    left(15)
    draw_stick(l, w)
    right(30)
    draw_stick(l, w)
    left(15)
  
def draw_stick(l, w):
    width(w)
    forward(l)
    if min_length < l:
        draw_branch(math.ceil(l*0.8), math.ceil(w*0.7))
    backward(l)

for _ in range(6):
    draw_branch(70, 8)
    right(60)

20行目までは同じコードですが、2行目で色をオレンジにしています。

イチョウの葉っぱは、軸の線が2本で終了するので、forループで角度を変更して6回draw_branchを繰り返して1周分を描写しています。

出力結果

Python Google ColaboratoryでColabTurtleを使う

classにしてみる

意味があるのかどうかわからないのですが、とりあえず、複数の関数を使うので、少しコードを付け足してclassでコードを描いてみました。

initializeTurtle(initial_speed=10)
color('green')
bgcolor('white')

min_length=30

class Flower(object):
    def __init__(self, l, w):
        self.l = l
        self.w = w

    def draw_branch(self):
        left(20)
        self.set_range()
        right(40)
        self.set_range()
        left(20)

    def set_range(self):
        width(self.w)
        forward(self.l)
        if min_length < self.l:
            draw_branch(math.ceil(self.l * 0.8), math.ceil(self.w * 0.5))
        backward(self.l)

    def set_start(self, a, b):
        width(a)
        forward(b)

    def set_end(self, b, c):
        backward(b)
        right(c)

f = Flower(50, 10)

for _ in range(6):
    f.set_start(11, 55)
    f.draw_branch()
    f.set_end(55, 60)

クラスを作成して、__init__lwを定義しています。

draw_branchは角度を2040に変更して、set_rangeは、太さを50%に変更しています。

どちらの関数も__init__で定義したself.lself.wを引数に利用しています。

実行時にdraw_branchの前後に追加する関数(set_startset_end)も、26行目から32行目までで記述しています。

34行目でクラスオブジェクトを作成して、36行目から39行目でforループで360度ぐるっと1周分を描写しています。

出力結果

Python Google ColaboratoryでColabTurtleを使う

今回作成したコードはこちらで共有していますので、ぜひ試してみてください。

まとめ

誰でも気軽に使えるGoogle Colaboratoryでturtleが使えたら楽しいだろうなということで使おうとしたところ、通常のturtleが使えなかったので、ネットで調べてみると、やっぱりライブラリが存在していたんです。

3人集まれば文殊の知恵といいますが、インターネットを使っている約40億人が集まっているわけですから、大体のやりたいことは誰かが考えてくれているわけです。

ちなみに、ツリー状の模様の書き方は、こちらのコードを参考にさせていただきました。

参考にしたコードは、2つの関数の中にお互いの関数が入っているので、ちょっと理解に苦しんだのですが、インデントをつけながら実行しているコードをメモ帳に書いていくことでHTMLの階層のような感じでイメージをつかむことができました。

ほんとネットさえあれば、Pythonを学習できるんだから、すごい世の中ですよね。

いろいろと描写していると、知らない間に時間がたってしまい、Python学習が前に進みません。

遊びすぎに気を付けないと。。。

それでは、明日もGood Python!