2022/11/09

テクノロジー

亀で亀を描いてみた

この記事の目次

    初めに

    大学の講義で一度学んだタートルグラフィックスで亀の絵を描いてみたいという野望を長年持っていました。
    今回、同じ野望を持つ人がイメージできるよう本記事を作成いたしました。
    なお今回はGoogle Colaboratoryを用いているので環境構築については記入いたしません。

    タートルグラフィックスとは

    タートルグラフィックス(Turtle Graphics)とは亀を操作して図を描写することが出来る機能です。
    Wally Feurzeig, Seymour Papert, Cynthia Solomon が 1967に開発したLogo プログラミング言語の機能の一つです。
    例えば以下のようなことを行うことが出来ます。

    for i in range(5):
      turtle.forward(100)
      turtle.right(144)
    file

    本記事の目的

    タートルグラフィックスを用いて、亀の絵を描いてみることです。
    楽しく(遊びながら)プログラムに触れることが出来ます。

    こんな人におすすめの記事です!!

    • 亀で亀を描くとは?と興味を持った人
    • Python初心者
    • Pythonで絵を描いてみたい人
    • 亀がちょこまか動くのを見て癒されたい方
    • 亀で亀を描くという夢を持っている人

    本題

    亀を描くにあたって以下を考える必要があります。

    • 亀の向き(角度)
    • 亀の動く距離
      特に亀の向きを考えることが、タートルグラフィックスを用いて絵を描くうえで重要です。

    イメージ図

    コードを書く前にまずイメージ図を書きました。(ibisPaintというスマホアプリで作成)
    イメージを明確化することで、迷いなくプログラムを書くことが出来ます。

    今回は

    • 甲羅を描く
    • 甲羅の下線を書く
    • 頭の下線を描く
    • 頭の曲線を描く
    • 足・しっぽを描く

    の順に実践しました。

    コード

    タートルグラフィックスのインストール

    まず、Google Colaboratory内で、タートルグラフィックスを使用できるようにします。

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

    今回使用した主なコード

    今回、使用した主なコードの説明をします。
    基本的に以下を用いれば図を描くことが可能です。

    turtle.forward(100) #亀が向いている方向へ100移動する
    turtle.left(90) #亀が向いている方向から左に90度傾く
    turtle.right(90) #亀が向いている方向から右に90度傾く
    turtle.home() #最初の位置・角度に戻る
    turtle.penup() #書き込みをしない
    turtle.pendown() #書き込みをする
    turtle.write("A", font=(40, "Arial", "normal")) #Aの文字を記入

    甲羅の作成

    甲羅の作成を行います。
    図を書いて亀の向きを計算しながらコードを書いています。
    このタイミングで直径を求めず、しっぽを生やすことを決意しました。
    そのため、イメージ図と違いしっぽが生えています。

    import ColabTurtle.Turtle as turtle
    turtle.initializeTurtle()
    turtle.pendown()
    turtle.color('green') #亀の色と言えば緑!!
    turtle.right(30-4) #*亀の傾きをx軸と平行に最後8度回転してしまう為4度引く
    for i in range(30): #240度分の扇を描く
        turtle.forward(5)
        turtle.left(8)
    
    turtle.left(60-4) #*と同じ修正
    turtle.forward(80) #体の線を書く
    turtle.penup() #書き込みをしない(移動のため)
    turtle.left(180)
    turtle.forward(80) #元の場所へ戻る
    turtle.pendown() #ここから記入

    頭の作成

    次に頭の作成を行いました。
    頭は、計算せず、見た目で角度や長さを決めています。

    turtle.forward(30) #頭の下の作成
    turtle.right(18) #良い感じの傾きにした
    for i in range(15): #240度の扇を描く
      turtle.right(16)
      turtle.forward(5)
    file

    足・しっぽの作成

    また、足・しっぽの作成を行いました。
    頭を書いた時点で位置(座標)が不明になってしまったため一度ホームに戻りました。

    #後ろ足作成
    turtle.left(26)
    turtle.penup() #書き込みをしない(移動のため)
    turtle.home() #最初の位置に戻る
    turtle.pendown() #ここから記入
    turtle.left(162) #*と同じ修正(180-18)
    for i in range(5):
      turtle.forward(5)
      turtle.right(36)
      #前足作成
    turtle.penup() #書き込みをしない(移動のため)
    turtle.home() #最初の位置に戻る
    turtle.left(90) 
    turtle.forward(42) 
    turtle.pendown() #ここから記入
    turtle.left(108) #*と同じ修正(90+18)
    for i in range(5):
      turtle.right(36)
      turtle.forward(5)
    
    #しっぽを作成
    turtle.penup() #書き込みをしない(移動のため)
    turtle.home() #最初の位置に戻る
    turtle.pendown() #ここから記入
    turtle.right(90) ![](https://dev-engineerblog.mynavi.jp/uploads/kamegakame.jpg)
    
    for i in range(3): # 段々細くなるしっぽへ変更
      turtle.pensize(6-2*i)
      turtle.forward(5)
    file

    文字を追加・亀の位置を移動

    文字を追加しました。
    また、ベストショットにする為、最後亀に移動してもらいました。

    turtle.penup()
    turtle.goto(290,175)
    #文字を書く
    turtle.pendown()
    turtle.write("K", font=(40, "Arial", "normal"))
    turtle.penup()
    turtle.forward(40)
    turtle.pendown()
    turtle.write("A", font=(40, "Arial", "normal"))
    turtle.penup()
    turtle.forward(40)
    turtle.pendown()
    turtle.write("M", font=(40, "Arial", "normal"))
    turtle.penup()
    turtle.forward(40)
    turtle.pendown()
    turtle.write("E", font=(40, "Arial", "normal"))
    turtle.penup()
    turtle.forward(40)
    # 亀を良い位置に移動する
    turtle.pendown()
    turtle.penup()
    turtle.home()
    turtle.forward(30)
    turtle.left(90)
    turtle.forward(30)
    file

    わかったこと

    やるうえで必要なこと

    • (恐らくGoogle Colaboratoryでは)円を描くことが出来ない為、直径を計算する必要があり、イメージ図を書かないと難しいと思います。
    • 亀の向き(角度)がわからない時はHOMEに戻ると良いです。

    タートルグラフィックスを学ぶのにおすすめな人・おすすめでない人

    • スピードがかなり遅い(このコードで一分程度かかります)為、本格的にプログラムに興味がある人には向きません。
    • プログラムって難しい・苦手だけど絵を描くのは好きという人におすすめです。

    ※本記事は2022年11月時点の情報です。

    著者:マイナビエンジニアブログ編集部