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()