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


Рассмотрим пример построения узора «Цветок» из шести одинаковых лепестков, каждый из которых представляет собой полуокружность. Для возврата черепахи в центр после рисования каждого лепестка используется явный стек, в котором сохраняются текущие координаты и направление. Рисунок 7 демонстрирует код программы, а рисунок 8 – графическое окно с полученным результатом.
После импортирования необходимых классов из модуля turtle создается графическое окно с помощью Screen, задаются его размеры, белый фон и заголовок. Затем создается объект Turtle с максимальной скоростью рисования, толщиной линии 2 пикселя, цвет – синий. Дополнительно определяются две функции: push_state сохраняет в список-стек текущие параметры черепахи (позицию, угол, состояние пера, цвет и толщину), а pop_state извлекает последний сохраненный набор и применяет его к черепахе, возвращая ее в прежнее состояние.
Основной цикл выполняется шесть раз. Внутри каждой итерации сначала вызывается push_state, чтобы запомнить положение черепахи в центре цветка. Затем черепаха смещается вперед на 30 пикселей и рисует дугу длиной 50 пикселей, радиусом 180° с помощью метода circle(50, 180). После этого вызывается pop_state, который возвращает черепаху в центр и восстанавливает исходное направление. Перед следующей итерацией черепаха поворачивается на 60° влево, готовясь рисовать очередной лепесток. Программа завершается вызовом метода, который закрывает графическое окно щелчком мыши.
Приведенный в примере подход позволяет строить симметричные циклические узоры с произвольным количеством повторяющихся элементов: перед рисованием каждого элемента состояние сохраняется, а после завершения – восстанавливается. 

from turtle import Turtle, Screen

def push_state(t, stack):
    state = (t.pos(), t.heading(), t.isdown(), t.pencolor(), t.pensize())
    stack.append(state)

def pop_state(t, stack):
    pos, heading, is_down, color, size = stack.pop()
    t.penup()
    t.goto(pos)
    t.setheading(heading)
    t.color(color)
    t.pensize(size)
    if is_down:
        t.pendown()
    else:
        t.penup()

screen = Screen()
screen.setup(600, 400)
screen.bgcolor('white')
screen.title('Задание 4 – Пример')

t = Turtle()
t.speed(0)
t.pensize(2)
t.color('blue')

stack = []

for _ in range(6):
    push_state(t, stack)
    t.forward(30)
    t.circle(50, 180)
    pop_state(t, stack)
    t.left(60)

screen.exitonclick()
Рисунок 7 – код программы

Рисунок 8 – полученный результат

Напишите программу, которая строит сложный симметричный узор, состоящий из повторяющегося элемента. Для перехода к следующему элементу и возврата в исходную точку необходимо сохранять и восстанавливать состояние черепахи (позицию, угол, цвет, толщину, состояние пера «опущено/поднято»). В зависимости от варианта сделайте это либо с использованием явного стека (список, в который помещаются кортежи с параметрами, а затем извлекаются методом pop()), либо с помощью рекурсивной функции, где состояние сохраняется автоматически за счет стека вызовов.

Дополнительные требования к заданию. Аналогично Заданию № 3, используйте объектно-ориентированный импорт, экран размером 600×400, белый фон, а также заголовок, соответствующий заданию. После завершения рисования окно должно закрываться по щелчку мыши, скорость рисования максимальная. В случае использования явного стека, при каждом сохранении состояния помещайте в список кортеж из следующих значений: координаты (x, y), угол, признак «перо опущено» (True/False), цвет линии и толщину линии. При восстановлении состояния извлекайте этот кортеж из стека и устанавливайте черепахе соответствующие параметры: перемещайте ее в сохраненную точку, задавайте угол, цвет и толщину, а также опускайте или поднимайте перо в зависимости от сохраненного признака. Если в варианте указана рекурсия, глубина рекурсии должна задаваться параметром функции. Создаваемый узор должен быть визуально симметричным относительно центра экрана или, в зависимости от варианта, одной из осей координат.

Таблица 4 – Варианты
№ варианта	1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16
№ задачи	8	7	 6	5	10	9	4	3	11	12	2	1	14	13	16	15

1. Из центра отходят 12 лучей длиной 80 пикселей. Из конца каждого луча рисуются два коротких ответвления длиной 20 под углом 30° влево и вправо. После рисования ответвлений необходимо вернуться в центр, чтобы начать следующий луч. Используйте явный стек: перед рисованием луча сохраните состояние, после ответвлений восстановите.
2. Из центра отходят 8 лучей. На каждом луче, на расстоянии 30, 60 и 90 пикселей от центра, рисуются парные ответвления длиной 15 под углом 45° влево и вправо. После каждого ответвления возвращайтесь к точке на луче, а затем к центру. Используйте явный стек: перед каждым ответвлением сохраняйте состояние, а после завершения ответвлений восстанавливайте, чтобы продолжить движение по лучу. 
3. Начертите 10 квадратов с общим центром. Сторона первого квадрата 20 пикселей, каждый следующий на 15 больше, а также дополнительно повернут на 10° относительно предыдущего. Перед рисованием каждого квадрата сохраняйте состояние, после завершения восстанавливайте и переходите к следующему. Используйте явный стек.