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()
# ---------- Рисуем собачку ----------
# 1. Туловище (плавный контур)
body_points = [
(-40, 62), # шея верх
(45, 75), # холка
(135, 65), # спина
(185, 40), # круп
(205, 15), # основание хвоста
(258, -25), # кончик хвоста
(210, -40), # хвост низ
(195, -85), # задняя нога сзади
(192, -145), # задняя лапа
(160, -148), # задняя лапа спереди
(152, -95), # задняя нога спереди
(90, -80), # живот (зад)
(30, -82), # живот (перед)
(12, -145), # передняя лапа сзади
(-22, -148), # передняя лапа
(-22, -95), # передняя нога спереди
(-52, -60), # грудь
(-68, -5), # шея перед
]
smooth_closed(body_points, "white")
# 2. Пятна — все целиком внутри силуэта туловища
# Пятно на спине
back_spot = [
(45, 25), (58, 48), (92, 52),
(118, 32), (108, 8), (70, 2),
]
smooth_closed(back_spot, "black")
# Пятно на бедре
hip_spot = [
(142, -35), (150, -12), (172, -10),
(184, -30), (172, -52), (150, -55),
]
smooth_closed(hip_spot, "black")
# Маленькое круглое пятнышко на боку
filled_circle("black", (5, -20), 11)
# 3. Голова (коричневая)
head_points = [
(-40, 62), # шея верх
(-70, 105), # макушка
(-118, 112), # лоб
(-158, 88), # морда верх
(-176, 64), # кончик носа
(-152, 44), # уголок пасти
(-105, 34), # подбородок
(-68, -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) # нос
# Показываем результат
screen.update()
turtle.done()