Загрузка данных
import turtle
# Настройка окна и черепашки
screen = turtle.Screen()
screen.bgcolor("white")
screen.setup(900, 650)
screen.tracer(False) # рисунок появится сразу
t = turtle.Turtle()
t.speed(0)
t.pensize(3)
t.hideturtle()
# ---------- Вспомогательные функции ----------
def midpoint(p1, p2):
"""Середина между двумя точками."""
return ((p1[0] + p2[0]) / 2, (p1[1] + p2[1]) / 2)
def quad_bezier(p0, c, p1, steps=18):
"""Квадратичная кривая Безье p0 -> c -> p1 маленькими шажками."""
for i in range(1, steps + 1):
u = i / steps
x = (1 - u) ** 2 * p0[0] + 2 * (1 - u) * u * c[0] + u ** 2 * p1[0]
y = (1 - u) ** 2 * p0[1] + 2 * (1 - u) * u * c[1] + u ** 2 * p1[1]
t.goto(x, y)
def smooth_closed(points, fill_color, outline_color="black"):
"""Гладкий замкнутый контур: кривая идёт через середины между
соседними точками, а сами точки — «опорные». Заполняет и обводит."""
n = len(points)
mids = [midpoint(points[i], points[(i + 1) % n]) for i in range(n)]
t.penup()
t.goto(mids[-1])
t.pendown()
t.pencolor(outline_color)
t.fillcolor(fill_color)
t.begin_fill()
for i in range(n):
quad_bezier(mids[i - 1], points[i], mids[i])
t.end_fill()
def filled_circle(color, center, radius):
"""Закрашенный круг с центром в заданной точке."""
t.penup()
t.goto(center[0] - radius, center[1])
t.setheading(0)
t.pendown()
t.pencolor(color)
t.fillcolor(color)
t.begin_fill()
t.circle(radius)
t.end_fill()
def filled_rect(color, x1, y1, x2, y2):
"""Закрашенный прямоугольник (x1, y1) — левый нижний угол."""
t.penup()
t.goto(x1, y1)
t.pendown()
t.pencolor(color)
t.fillcolor(color)
t.begin_fill()
t.goto(x2, y1)
t.goto(x2, y2)
t.goto(x1, y2)
t.goto(x1, y1)
t.end_fill()
def cloud(x, y, scale=1.0):
"""Облако из трёх белых кругов."""
for dx, dy, r in [(-30, 0, 15), (0, 8, 21), (30, 0, 15)]:
filled_circle("white", (x + dx * scale, y + dy * scale), r * scale)
def grass_tuft(x, y, h=16, color="#558B2F"):
"""Пучок из трёх травинок-треугольников."""
t.fillcolor(color)
t.pencolor(color)
for dx, lean in [(-6, -3), (0, 2), (6, -1)]:
t.penup()
t.goto(x + dx - 4, y)
t.pendown()
t.begin_fill()
t.goto(x + dx + 4, y)
t.goto(x + dx + lean, y + h)
t.goto(x + dx - 4, y)
t.end_fill()
# ---------- Фон: небо и трава ----------
# Небо (чуть больше окна, чтобы не было белых щелей)
filled_rect("#87CEEB", -460, -330, 460, 330)
# Облака
cloud(-270, 210, 1.0)
cloud(140, 250, 1.2)
cloud(330, 150, 0.8)
# Трава (верх травы на y=-145, чтобы лапы стояли на ней)
filled_rect("#7CB342", -460, -330, 460, -145)
# Травяные пучки на лужайке
tufts = [
(-400, -165), (-320, -190), (-240, -160), (-160, -200),
(-90, -170), (-10, -185), (70, -165), (170, -195),
(260, -165), (340, -190), (400, -160),
(-330, -250), (-150, -270), (40, -245), (220, -265), (370, -245),
]
for x, y in tufts:
grass_tuft(x, y)
# ---------- Рисуем собачку ----------
# 1. Туловище (стало поуже: спина ниже, живот подтянут)
body_points = [
(-40, 58), # шея верх
(45, 62), # холка
(135, 55), # спина
(180, 35), # круп
(205, 15), # основание хвоста
(258, -25), # кончик хвоста
(210, -40), # хвост низ
(195, -80), # задняя нога сзади
(192, -145), # задняя лапа
(160, -148), # задняя лапа спереди
(152, -92), # задняя нога спереди
(90, -62), # живот (зад)
(30, -64), # живот (перед)
(12, -145), # передняя лапа сзади
(-22, -148), # передняя лапа
(-22, -95), # передняя нога спереди
(-50, -48), # грудь
(-66, -5), # шея перед
]
smooth_closed(body_points, "white")
# 2. Пятна — все целиком внутри силуэта
# Пятно на спине
back_spot = [
(48, 20), (60, 40), (92, 44),
(116, 26), (106, 6), (70, 2),
]
smooth_closed(back_spot, "black")
# Пятно на бедре
hip_spot = [
(144, -34), (152, -14), (170, -12),
(180, -30), (170, -50), (150, -52),
]
smooth_closed(hip_spot, "black")
# Маленькое круглое пятнышко на боку
filled_circle("black", (5, -18), 11)
# 3. Голова (коричневая)
head_points = [
(-40, 58), # шея верх
(-70, 105), # макушка
(-118, 112), # лоб
(-158, 88), # морда верх
(-176, 64), # кончик носа
(-152, 44), # уголок пасти
(-105, 34), # подбородок
(-66, -5), # горло
]
smooth_closed(head_points, "#A0522D")
# 4. Ухо
ear_points = [
(-95, 100), (-70, 112), (-58, 85),
(-62, 52), (-85, 58), (-103, 80),
]
smooth_closed(ear_points, "black")
# 5. Глаз и нос
filled_circle("black", (-118, 86), 6) # глаз
filled_circle("black", (-168, 62), 7) # нос
# Травинки перед лапами — собачка стоит в траве
grass_tuft(-60, -149, 14)
grass_tuft(35, -149, 18)
grass_tuft(150, -149, 18)
# Показываем результат
screen.update()
turtle.done()