LoginSignup
2
1

More than 3 years have passed since last update.

turtleを使って線の描画をしてみた

Posted at

Turtleモジュール

ペンを持った亀を操って絵を描くことのできるタートルグラフィックスのPython版です。
子ども向けにはscratchなどが有名ですが、これも使いようによっては良い教材になりそうです。
そういう自分が、この描画がすごいと思って使ってみたのですが…

  • こんな線画が描けます(森か林みたい)

スクリーンショット 2020-06-15 23.35.58.jpg

ではサンプルコードです。forestっていう関数を作成しておきましょう。

turtlePicture.py
#
# turtle を import して線描画する
# 2020.06.15 ProOJI
#
import turtle

# kameSan オブジェクト生成
kameSan = turtle.Turtle()

# メソッドを作成しておく(再帰的用法)
def forest(n, length:int=1000)->None:
    if n <= 0:
        kameSan.forward(length)
        return

    ''' 再帰 1 長さ = 1000 * 0.5 '''
    forest(n-1, length * 0.5)

    # 右に 85 度回転
    #   緩やかから急に尖った方向へ
    kameSan.right(85)

    ''' 再帰 2 長さ = 1000 ÷ 3 '''
    forest(n-1, length / 3)

    # 左に 170 度回転
    #   急なターンで尖った針を描画
    kameSan.left(170)

    ''' 再帰 3 長さ = 1000 ÷ 3 '''
    forest(n-1, length / 3)

    # 右に 85 度回転
    #   再び緩やな方向へ着地するように
    kameSan.right(85)
    ''' 再帰 4 長さ = 1000 ÷ 0.38 '''
    forest(n-1, length * 0.38)

if __name__ == '__main__':
    kameSan.penup()
    kameSan.setpos(270, -20)
    kameSan.pendown()
    kameSan.left(180)
    kameSan.speed(0)
    forest(5)
    kameSan.done()

こうすることで線の描画ができます。
また、少し手を加えて再帰箇所に色チェンジを設定すると・・・

スクリーンショット 2020-06-15 23.52.20.jpg

  • サンプルコード(色付き)
turtlePictureWithColor.py
#
# turtle を import して線描画します
# kameSan は移動するとき線描画をします
# 2020.06.15 ProOJI
#
import turtle

# kameSan オブジェクト生成
kameSan = turtle.Turtle()

# メソッドを作成しておく(再帰的用法)
def forest(n, length:int=1000)->None:
    if n <= 0:
        kameSan.forward(length)
        return

    ''' 再帰 1 長さ = 1000 * 0.5 '''
    kameSan.pencolor("red")
    forest(n-1, length * 0.5)

    # 右に 85 度回転
    #   緩やかから急に尖った方向へ
    kameSan.right(85)

    ''' 再帰 2 長さ = 1000 ÷ 3 '''
    kameSan.pencolor("blue")
    forest(n-1, length / 3)

    # 左に 170 度回転
    #   急なターンで尖った針を描画
    kameSan.left(170)

    ''' 再帰 3 長さ = 1000 ÷ 3 '''
    kameSan.pencolor("green")
    forest(n-1, length / 3)

    # 右に 85 度回転
    #   再び緩やな方向へ着地するように
    kameSan.right(85)
    ''' 再帰 4 長さ = 1000 ÷ 0.38 '''
    forest(n-1, length * 0.38)

if __name__ == '__main__':
    # penup ペンを上げているので描画なし
    kameSan.penup()
    # Position へ移動
    kameSan.setpos(270, -20)
    # pendown ペンを下ろすのでここから描画される
    kameSan.pendown()
    # 左へ 180度旋回する
    kameSan.left(180)

    kameSan.speed(0)
    forest(5)
    kameSan.done()

どのコードが線をどう描いているのかがよくわかりますね。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1