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
を実行しています。
最後にbackward
でl
の長さだけ戻っているのですが、これは入れ子になったdraw_branch
が完了してから実行されます。
draw_stick
の中で実行されるdraw_branch
には、長さ(l
)と太さ(w
)が縮んだ変数が代入されて入れ子になり、最小のl
から順番に閉じられていくので、扇状の枝のような描写を表現することができます。
出力結果
完成図を表示していますが、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周分を描写しています。
出力結果
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__
でl
とw
を定義しています。
draw_branch
は角度を20
と40
に変更して、set_range
は、太さを50%に変更しています。
どちらの関数も__init__
で定義したself.l
とself.w
を引数に利用しています。
実行時にdraw_branch
の前後に追加する関数(set_start
とset_end
)も、26行目から32行目までで記述しています。
34行目でクラスオブジェクトを作成して、36行目から39行目でfor
ループで360度ぐるっと1周分を描写しています。
出力結果
今回作成したコードはこちらで共有していますので、ぜひ試してみてください。
まとめ
誰でも気軽に使えるGoogle Colaboratoryでturtle
が使えたら楽しいだろうなということで使おうとしたところ、通常のturtle
が使えなかったので、ネットで調べてみると、やっぱりライブラリが存在していたんです。
3人集まれば文殊の知恵といいますが、インターネットを使っている約40億人が集まっているわけですから、大体のやりたいことは誰かが考えてくれているわけです。
ちなみに、ツリー状の模様の書き方は、こちらのコードを参考にさせていただきました。
参考にしたコードは、2つの関数の中にお互いの関数が入っているので、ちょっと理解に苦しんだのですが、インデントをつけながら実行しているコードをメモ帳に書いていくことでHTMLの階層のような感じでイメージをつかむことができました。
ほんとネットさえあれば、Pythonを学習できるんだから、すごい世の中ですよね。
いろいろと描写していると、知らない間に時間がたってしまい、Python学習が前に進みません。
遊びすぎに気を付けないと。。。
それでは、明日もGood Python!