Загрузка данных


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