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


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