Python タートルグラフィックスで絵を描く「turtle」

'21/06/13更新:クロソイド曲線の雛形コードを中程に追記しました。
 本記事では、下図のように亀で絵を描く雛形コードを載せました。下図中の左側から、丸, 三角, 四角, 花柄模様はネット検索で出てくる基本事項です。一方、下図右側の赤線のsin波は、自作関数で(x, y)座標を指定することで描いています。
 つまり、複雑な絵であっても、関数で定義できれば絵を描くことができます。その例として、クロソイド曲線の雛形コードを載せています。この場合、積分を使うため、Sympyも使用しています。
 文末には本家サイトのデモスクリプトの使い方と例を載せました。

f:id:HK29:20210523012926p:plain

■基本操作の雛形コード

import turtle
import math


# 画面サイズ
turtle.setup(width=1280, height=720, startx=None, starty=None)

# 位置の初期値
turtle.penup() # ペンを上げる
turtle.setpos(-500, 0)
turtle.pendown() # ペンを降ろす

# 亀を表示
turtle.shape('turtle')
turtle.color('black')

# 円を描く
turtle.circle(50)

# 直進後に三角形を描く
turtle.forward(150)
for i in range(3):
    turtle.forward(100)
    turtle.left(360 / 3)

# 直進後に四角形を描く
turtle.forward(200)
for i in range(4):
    turtle.forward(100)
    turtle.right(90)

# 直進後に角度を変えながら直進することで変な絵を描く(マニュアルの例題をやや編集)
turtle.forward(200)
turtle.color('blue', 'yellow')
turtle.begin_fill()
for i in range(36):
    turtle.speed(1 + i)
    turtle.forward(200)
    turtle.left(170)
turtle.end_fill()

### 画面外へsin波で抜ける(関数で座標を指定する方法)
turtle.speed(3)
turtle.forward(200)
turtle.color('red')
# 自作関数
def f(x):
    return (x/10) * math.sin(x/4)

# 現在の座標(x, y)=(a, b)を取得する
a, b = turtle.pos()
for x in range(1000):
    # カメの動きを座標で指定する
    turtle.setpos(a + x, b + f(x))

# 実行
turtle.done()

■クロソイド曲線
 下図はクロソイド曲線です。時間tをループで回して関数に代入して、(x, y)座標を取得して亀を動かします。

f:id:HK29:20210613170202p:plain

import turtle
import sympy as sp


# 画面サイズ
turtle.setup(width=640, height=360, startx=None, starty=None)

# 位置の初期値
turtle.penup()
turtle.setpos(-150, -150)
turtle.pendown()

# 亀を表示
turtle.shape('turtle')
turtle.color('blue', 'red')

# 関数
def clothoid_curve_func(t):
    # 変数θを定義
    theta = sp.symbols('theta')
    
    # クロソイド曲線
    X = float(sp.integrate(sp.cos((theta ** 2) / 2), (theta, 0, t)))
    Y = float(sp.integrate(sp.sin((theta ** 2) / 2), (theta, 0, t)))
    
    return X, Y

# カメの速度
turtle.speed(10)

# 現在の座標(x, y)=(a, b)を取得する
a, b = turtle.pos()
for time in range(1000):
    t = time/10
    
    # (x, y)座標を計算する
    x, y = clothoid_curve_func(t)
    #print(r'x, y ', x, y)

    # カメの動きを座標で指定する
    turtle.setpos(a + x*200, b + y*200)

# 実行
turtle.done()

下記リンクは、その動画です。

www.youtube.com

 

■さいごに、本家サイトの例題の使い方について

 次のリンク先には、複雑な木の絵や時計の動きなどの例題コードがあります。https://docs.python.org/ja/3/library/turtle.html#module-turtledemo

それらを実行するには非常に簡潔で、次のコマンドを実行します。

python -m turtledemo

すると、下図のようなウィンドウが表示されます。メニューバーの左上のExamplesからいずれかを選択します。

f:id:HK29:20210523122519p:plain

下図は、「clock」を選択した場合の例です。左側にそのコードが記載され、右側でそれが動作します。

f:id:HK29:20210523122257p:plain

以上

<広告>