Python、Turtleモジュールを使ったお絵かきあれこれ

PythonのTurtleモジュールを使った作例へのアクセスが多いので、追加でいくつか用意しました。

まずは動かしてみて、数値や設定を変えて遊んでみてください。

星型三角パターン

コードを見る
import turtle

t = turtle.Turtle()
t.speed(0)
turtle.bgcolor("navy")
t.pencolor("yellow")

for i in range(12):
    for _ in range(3):
        t.forward(120)
        t.left(120)
    t.right(150)

turtle.done()

五芒星の輪

コードはこちら
import turtle

t = turtle.Turtle()
t.speed(0)
turtle.bgcolor("midnight blue")
t.pencolor("gold")

def draw_star(size):
    for _ in range(5):
        t.forward(size)
        t.right(144)  # 五芒星の角度

for i in range(12):
    draw_star(120)
    t.right(30)

turtle.hideturtle()
turtle.done()

三角形の花

コードはこちら
import turtle
import math

def draw_triangle(t, size):
    """三角形を描画する関数"""
    t.begin_fill()
    for _ in range(3):
        t.forward(size)
        t.left(120)
    t.end_fill()

# 設定
window = turtle.Screen()
window.bgcolor("black")
window.title("三角形の花")

t = turtle.Turtle()
t.speed(0)
t.penup()
t.goto(0, 0)
t.pendown()

# 色の設定
colors = ["red", "orange", "yellow", "green", "blue", "purple"]

# 描画
num_triangles = 36
size = 100
angle = 10

for i in range(num_triangles):
    t.color(colors[i % len(colors)])
    draw_triangle(t, size)
    t.left(angle)
    
    # サイズを少しずつ小さくする
    size = size * 0.97

# 中心に戻る
t.penup()
t.goto(0, 0)
t.pendown()

# 別の方向にも描画
t.right(180)
size = 100

for i in range(num_triangles):
    t.color(colors[(i + 3) % len(colors)])
    draw_triangle(t, size)
    t.left(angle)
    size = size * 0.97

# 終了処理
t.hideturtle()
window.mainloop()

ネスト五角形フラクタル

コードはこちら
import turtle
import math

def draw_nested_pentagons(t, size, depth, colors):
    """入れ子になった5角形を描画する関数"""
    if depth == 0:
        return
    
    # 現在の5角形を描く
    angle = 72  # 5角形の外角
    
    t.color(colors[depth % len(colors)])
    t.fillcolor(colors[depth % len(colors)])
    
    t.begin_fill()
    for _ in range(5):
        t.forward(size)
        t.left(angle)
    t.end_fill()
    
    # 次の5角形のための準備
    t.penup()
    # 次の5角形は中心に向かって小さくなる
    next_size = size * 0.7
    # 中心に向かって移動
    distance = (size - next_size) / 2
    t.forward(distance)
    t.left(angle / 2)
    t.forward(distance)
    t.right(angle / 2)
    t.pendown()
    
    # 再帰的に次の5角形を描く
    draw_nested_pentagons(t, next_size, depth - 1, colors)

# 設定
window = turtle.Screen()
window.bgcolor("black")
window.title("ネスト5角形フラクタル")

t = turtle.Turtle()
t.speed(0)  # 最速

# 色の設定
colors = ["purple", "blue", "cyan", "green", "yellow", "orange", "red"]

# 初期位置
t.penup()
t.goto(-150, -100)
t.pendown()

# 描画
draw_nested_pentagons(t, 300, 8, colors)

# 終了処理
t.hideturtle()
window.mainloop()

カフカス風タイル模様(幾何学的な星と多角形)

コードはこちら
import turtle
import math

def draw_star(x, y, size, points, color="navy"):
    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()
    angle = 360 / points
    turtle.pencolor(color)
    turtle.fillcolor("")
    turtle.begin_fill()
    for _ in range(points):
        turtle.forward(size)
        turtle.right(180 - angle)
        turtle.forward(size)
        turtle.left(180 - 2 * angle)
    turtle.end_fill()

def draw_tile(x, y, size):
    draw_star(x, y, size, 8)  # 8角星
    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()
    turtle.pencolor("turquoise")
    turtle.circle(size, steps=8)  # 8角形
    turtle.pencolor("black")

turtle.speed(0)
turtle.hideturtle()
turtle.bgcolor("white")
tile_size = 40

for j in range(-3, 4):
    for i in range(-5, 6):
        x = i * tile_size * 2
        y = j * tile_size * 2
        draw_tile(x, y, tile_size)

turtle.done()

カラフルなスピログラフ

コードはこちら
import turtle
import math
import random

def setup_turtle():
    """タートルの初期設定"""
    screen = turtle.Screen()
    screen.setup(800, 800)
    screen.bgcolor("black")
    screen.title("スピログラフ")
    
    t = turtle.Turtle()
    t.speed(0)
    t.hideturtle()
    turtle.tracer(0, 0)  # 描画を高速化
    return screen, t

def draw_spirograph(t, R, r, d, color):
    """スピログラフを描く
    R: 固定円の半径
    r: 動く円の半径
    d: ペンの位置(動く円の中心からの距離)
    """
    t.penup()
    
    # 初期位置を計算
    x0 = (R - r) + d
    y0 = 0
    
    t.goto(x0, y0)
    t.pendown()
    t.pencolor(color)
    
    # 歯車比を計算
    gcd_val = math.gcd(R, r)
    lcm_val = (R * r) // gcd_val
    n_rot = lcm_val // r  # 完全な模様を描くために必要な回転数
    
    theta = 0.0
    step = 0.01  # ステップサイズ(小さいほど滑らかになるが、遅くなる)
    
    # スピログラフの数式に基づいて点を描画
    for i in range(int(n_rot * 2 * math.pi / step) + 1):
        theta += step
        x = (R - r) * math.cos(theta) + d * math.cos(((R - r) / r) * theta)
        y = (R - r) * math.sin(theta) - d * math.sin(((R - r) / r) * theta)
        t.goto(x, y)
    
    turtle.update()

def create_colorful_spirograph():
    """カラフルなスピログラフを作成"""
    screen, t = setup_turtle()
    t.width(1)
    
    # カラーパレット
    colors = [
        "#FF5E5B", "#D8D8F6", "#39A0ED", "#FEFFE4", "#51C4D3",
        "#FFCB77", "#FF7700", "#5DD39E", "#E3C7FF", "#FF99C8"
    ]
    
    # 様々なパラメータでスピログラフを描く
    spiro_params = [
        (150, 50, 75, colors[0]),
        (150, 60, 55, colors[1]),
        (150, 70, 95, colors[2]),
        (150, 80, 45, colors[3]),
        (150, 45, 65, colors[4]),
        (150, 55, 85, colors[5]),
        (150, 65, 30, colors[6]),
        (150, 75, 110, colors[7]),
        (150, 85, 40, colors[8]),
        (150, 90, 120, colors[9])
    ]
    
    for R, r, d, color in spiro_params:
        draw_spirograph(t, R, r, d, color)
    
    screen.mainloop()

# 実行
create_colorful_spirograph()

花火?

コードはこちら
import turtle
import random

width, height = 800, 600
turtle.speed(0)
turtle.hideturtle()
turtle.bgcolor("midnightblue")
colors = ["yellow", "red", "orange", "white", "cyan", "deepskyblue", "pink"]

for _ in range(20):
    x = random.randint(-width//2 + 20, width//2 - 20)
    y = random.randint(-height//2 + 20, height//2 - 20)
    rays = random.randint(14, 28)
    turtle.penup()
    turtle.goto(x, y)
    turtle.pendown()
    clr = random.choice(colors)
    for i in range(rays):
        angle = 360 / rays * i
        length = random.randint(45, 110)
        turtle.pencolor(clr)
        turtle.setheading(angle)
        turtle.forward(length)
        turtle.backward(length)
turtle.done()

葉っぱのような模様

コードはこちら
import turtle
import math
import random

# スクリーン初期化
screen = turtle.Screen()
screen.tracer(0, 0)  # アニメーションOFF、一括描画

def draw_leaf_veins(x, y, length, angle, veins, spread, strength_step, color):
    # 主脈
    turtle.penup()
    turtle.goto(x, y)
    turtle.setheading(angle)
    turtle.pensize(5)
    turtle.pencolor(color)
    turtle.pendown()
    for t in range(length):
        curve = math.sin(math.radians(t / length * 120)) * 25
        turtle.setheading(angle + curve)
        turtle.forward(1)
    # 支脈
    for i in range(1, veins + 1):
        ratio = i / veins
        strength = 2 + (veins - i) * strength_step
        turtle.penup()
        turtle.goto(x, y)
        curve = math.sin(math.radians(ratio * 120)) * 25
        turtle.setheading(angle + curve)
        turtle.forward(length * ratio)
        px, py = turtle.pos()
        for sgn in (-1, 1):
            turtle.pencolor(color)
            turtle.pensize(strength)
            turtle.goto(px, py)
            turtle.setheading(angle + curve + sgn * (spread * (ratio ** 0.7)))
            turtle.pendown()
            vein_len = length * 0.35 * (1 - 0.6*ratio)
            for t in range(int(vein_len)):
                c = math.sin(math.radians(t / vein_len * 90)) * 20 * sgn * (1 - ratio)
                turtle.setheading(angle + curve + sgn * (spread * (ratio ** 0.7)) + c)
                turtle.forward(1)
            turtle.penup()

turtle.speed(0)
turtle.hideturtle()
turtle.bgcolor("white")

colors = ["forestgreen", "limegreen", "darkgreen", "seagreen", "#9acd32"]

for i in range(-2, 3):
    x = i * 180 + random.randint(-30, 30)
    y = random.randint(-90, 50)
    length = random.randint(280, 330)
    main_angle = 80 + random.randint(-25, 25)
    veins = random.randint(18, 28)
    spread = random.randint(50, 90)
    color = random.choice(colors)
    strength_step = random.uniform(0.5, 0.7)
    draw_leaf_veins(x, y, length, main_angle, veins, spread, strength_step, color)

# 描画を一気に反映
screen.update()

turtle.done()