6 2 imgupscaler.ai Beta 2K scaled

В прошлой статье мы научились работать с функциями черепахи из модуля turtle, узнали разницу между пересечением и объединением фигур и опробовали на практике алгоритм решения 6 заданий первого типа.

В данной статье мы продолжим работу с этим заданием, но уделим внимание второму типу – будем находить периметр и площадь внутри объединения и пересечения фигур.

Не будем долго затягивать и приступим к практике!

Алгоритм решения

Изменения в коде решения у нас будут минимальны. Самое главное – задать точкам цвет фона, обычно – белый, и увеличить их размер. То есть первый блок кода нашего решения может выглядеть так:

from turtle import *

tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12

lt(90) # Не обязательно

По сравнению с тем, что был использован в прошлой статье, здесь изменены значения всего двух переменных – dot_color и dot_size.

Также для расстановки точек в последнем блоке больше не нужно подбирать какие-то определённые диапазоны. При достаточной мощности компьютера можете расставить точки хоть на диапазоне координат от -50 до 50. Но все же лучше хотя бы примерно понять квадрант, в котором располагаются фигуры, и сократить диапазоны до минимума.

В остальном же код остаётся прежним. Давайте опробуем его на задании с такой формулировкой (как и в прошлый раз, ограничимся лишь алгоритмом черепахи и условием):

Задание 661

«Черепахе был дан для исполнения следующий алгоритм:

Повтори 9 [Вперёд 17 Налево 90 Вперед 8 Налево 90 Вперёд 17]
Поднять хвост
Налево 90 Вперед 3 Направо 90 Вперёд 5 Налево 90
Опустить хвост
Повтори 4 [Вперёд 97 Направо 90 Вперёд 132 Направо 90]

Определите периметр области пересечения фигур, ограниченных заданными алгоритмом линиями.»

Первая фигура у нас чертится по такому алгоритму: Повтори 9 [Вперёд 17 Налево 90 Вперед 8 Налево 90 Вперёд 17]. Переведём его на язык Python:

for _ in range(9):
    fd(17 * scale) # Вперёд 17
    lt(90) # Налево 90
    fd(8 * scale) # Вперёд 8
    lt(90) # Налево 90
    fd(17 * scale)  # Вперёд 17

Далее черепаха перемещается с поднятым хвостом к началу второй фигуры: Налево 90 Вперед 3 Направо 90 Вперёд 5 Налево 90

В Python это выглядит так:

pu() # Поднять хвост
lt(90) # Налево 90
fd(3 * scale)  # Вперёд 3
rt(90) # Направо 90
fd(5 * scale)  # Вперёд 5
lt(90) # Налево 90
pd() # Опустить хвост

Ну и вторая фигура задана таким алгоритмом: Повтори 4 [Вперёд 97 Направо 90 Вперёд 132 Направо 90]. Перепишем его в Python:

for _ in range(4):
    fd(97 * scale) # Вперёд 97
    rt(90) # Направо 90
    fd(132 * scale) # Вперёд 132
    rt(90) # Направо 90

К этим трём блокам кода добавляем блоки с базовой настройкой и размещением точек. В итоге наша программа приобретает такой вид:

from turtle import *

tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12

lt(90) # Не обязательно

color("#A7D380")
# Повтори 9
for _ in range(9):
    fd(17 * scale) # Вперёд 17
    lt(90) # Налево 90
    fd(8 * scale) # Вперёд 8
    lt(90) # Налево 90
    fd(17 * scale)  # Вперёд 17


pu() # Поднять хвост
lt(90) # Налево 90
fd(3 * scale)  # Вперёд 3
rt(90) # Направо 90
fd(5 * scale)  # Вперёд 5
lt(90) # Налево 90
pd() # Опустить хвост

color("#F76D47")
# Повтори 2
for _ in range(4):
    fd(97 * scale) # Вперёд 97
    rt(90) # Направо 90
    fd(132 * scale) # Вперёд 132
    rt(90) # Направо 90

pu()  # Поднять хвост
for x in range(-5, 1):
    for y in range(-17, -4):
        goto(x * scale, y * scale) # Переместиться к x, y
        dot(dot_size, dot_color) # Поставить точку

done()

Запустим её и увидим такое изображение на экране.

Задание 6 2 1 scaled

Прямоугольник с двумя пунктирными зелёными и оранжевыми сторонами –как раз тот, периметр которого нам нужно вычислить. Что же, отрезков немного, можно посчитать и вручную.

Ширина этого прямоугольника равна 5 единичным отрезкам, а длина – 12. Складываем все стороны: 5 + 5 + 12 + 12. И получаем ответ на это задание: 34.

Пример 1

Только что мы работали с периметром пересечения. Но порой требуется найти и периметр объединения нескольких фигур. Правда, в таких случаях формулировка звучит несколько иначе:

Задание 602

«Черепахе был дан для исполнения следующий алгоритм:

Повтори 3 [Опустить хвост
Повтори 2 [Вперёд 10 Направо 90 Вперёд 10 Направо 90]
Поднять хвост
Вперёд 5 Направо 90 Вперёд 5 Направо 90]

Определите в сантиметрах длину замкнутой ломаной, которая является границей объединения фигур, очерченных заданными алгоритмом линиями. В ответе укажите только число. Единицы измерения указывать не нужно.»

Не переживайте, в алгоритме черепахи нет опечаток. Он действительно задаёт всего одну фигуру, но довольно сложную. При решении главное – чётко определить, какие действия в каком цикле должны быть расположены.

Давайте буквально построчно переписывать алгоритм. Фраза «Повтори 3» на Python переводится как «for _ in range(3):». Затем следует команда «Опустить хвост» или же в интерпретации модуля turtle – pd().

Ну а второй цикл уже привычный: Повтори 2 [Вперёд 10 Направо 90 Вперёд 10 Направо 90]. Запишем его так:

for _ in range(2):
    fd(10 * scale) # Вперёд 10
    rt(90) # Направо 90
    fd(10 * scale) # Вперёд 10
    rt(90) # Направо 90

Далее идёт оставшаяся часть алгоритма внутри первого цикла for:

pu() # Поднять хвост
fd(5 * scale) # Вперёд 5
rt(90) # Направо 90
fd(5 * scale) # Вперёд 5
lt(90) # Налево 90

Допишем в начало код базовой настройки, а в конец блок кода с расстановкой точек и получим такую программу:

from turtle import *

tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12

lt(90) # Не обязательно

color("#A7D380")  # Цвет границ

# Повтори 3
for _ in range(3):
    pd() # Опустить хвост

    # Повтори 2
    for _ in range(2):
        fd(10 * scale) # Вперёд 10
        rt(90) # Направо 90
        fd(10 * scale) # Вперёд 10
        rt(90) # Направо 90

    pu() # Поднять хвост
    fd(5 * scale) # Вперёд 5
    rt(90) # Направо 90
    fd(5 * scale) # Вперёд 5
    lt(90) # Направо 90


pu()  # Поднять хвост
for x in range(0, 21):
    for y in range(0, 21):
        goto(x * scale, y * scale) # Переместиться к x, y
        dot(dot_size, dot_color) # Поставить точку

done()

Прежде чем её запускать, давайте подумаем, что же мы ожидаем увидеть на экране. Очевидно, что у нас будет какая-то сложная фигура, состоящая из трёх. Об этом говорит самый первый цикл for с тремя повторениями.

Теперь рассмотрим вложенный цикл на два повторения. В нём черепаха сначала идёт вперёд на 10 единиц, затем поворачивает направо на 90 градусов и снова вперёд на 10 и направо. То есть чертятся две стороны квадрата с длиной в 10 единиц. Учитывая, что цикл повторяется дважды, то можем предположить, что это будет целый квадрат со стороной 10.

Далее черепаха поднимает хвост и перемещается вверх и вправо на 5 единиц – то есть ровно на середину только что начерченного квадрата.

И далее снова повторяется отрисовка квадрата и переход к его центру. Значит, на экране у нас будет три квадрата, каждый из которых начинается из центра предыдущего.

Запустим код и убедимся в этом.

Задание 6 2 2 scaled

Отлично, все как мы и предполагали. Нам нужно найти длину замкнутой ломаной линии объединения этих трёх квадратов. Давайте выделим её цветом.

Задание 6 2 3 scaled

Длину стороны квадрата мы уже вычислили ранее. Также определили, что каждый новый квадрат начинается из центра предыдущего. То есть длина восьми маленьких участков ломаной равна половине длины стороны квадрата, а именно – 5.

Отметим все числа на рисунке (длины маленьких сторон на углах отметим по одному разу).

Задание 6 2 4 scaled

Осталось всего лишь сложить все имеющиеся значения. Вот они по часовой стрелке: 10 + 5 + 5 + 5 + 5 + 10 + 10 + 5 + 5 + 5 + 5 + 10. Итоговая сумма составила 80 единиц. Это число и запишем в ответ.

Пример 2

Теперь поработаем с площадью фигур. Начнём с такой формулировки:

Задание 631

«Черепахе был дан для исполнения следующий алгоритм:

Повтори 4 [Вперёд 19 Направо 90 Вперёд 30 Направо 90]
Поднять хвост
Вперёд 2 Направо 90 Вперёд 8 Налево 90
Опустить хвост
Повтори 4 [Вперёд 93 Направо 90 Вперёд 97 Направо 90]

Определите площадь области пересечения фигур, ограниченных заданными алгоритмом линиями.»

Алгоритм здесь классический, ничего необычного в нём нет. Просто переписываем его на языке Python. Выглядеть он будет так:

# Повтори 4
for _ in range(4):
    fd(19 * scale) # Вперёд 19
    rt(90) # Направо 90
    fd(30 * scale) # Вперёд 30
    rt(90) # Направо 90

# Перемещение
pu()
fd(2 * scale) # Вперёд 2
rt(90) # Направо 90
fd(8 * scale) # Вперёд 8
lt(90)  # Налево 90
pd()

# Повтори 4
for _ in range(4):
    fd(93 * scale) # Вперёд 93
    rt(90) # Направо 90
    fd(97 * scale) # Вперёд 97
    rt(90) # Направо 90

Уже имея опыт решения 6 заданий, можем сказать, что здесь будет два прямоугольника, второй, которые больше, смещён относительно первого на 2 и 8 единиц.

Давайте допишем программу полностью и запустим её.

from turtle import *

tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12

lt(90) # Не обязательно

color("#A7D380")

# Повтори 4
for _ in range(4):
    fd(19 * scale) # Вперёд 19
    rt(90) # Направо 90
    fd(30 * scale) # Вперёд 30
    rt(90) # Направо 90

# Перемещение
pu()
fd(2 * scale) # Вперёд 2
rt(90) # Направо 90
fd(8 * scale) # Вперёд 8
lt(90)  # Налево 90
pd()

color("#F76D47")

# Повтори 4
for _ in range(4):
    fd(93 * scale) # Вперёд 93
    rt(90) # Направо 90
    fd(97 * scale) # Вперёд 97
    rt(90) # Направо 90

pu()  # Поднять хвост
for x in range(0, 21):
    for y in range(0, 21):
        goto(x * scale, y * scale) # Переместиться к x, y
        dot(dot_size, dot_color) # Поставить точку

done()

В итоге имеем такое пересечение двух прямоугольников.

Задание 6 2 5 scaled

Отметим жёлтым цветом интересующую нас область.

Задание 6 2 6 scaled

Нужно вычислить её длину и ширину. Само собой, вручную считать мы это не будем. Давайте исходить из имеющихся данных – длины и ширины первой (зелёной) фигуры. Она задаётся таким алгоритмом: Вперёд 19 Направо 90 Вперёд 30 Направо 90. Отсюда можно сделать вывод, что её длина 30 единиц, а ширина – 19.

Далее рассмотрим, насколько смещена вторая фигура, а следовательно, и само пересечение. Это можно определить по перемещению черепахи с поднятым хвостом: Вперёд 2 Направо 90 Вперёд 8 Налево 90. То есть на 2 и 8 единиц соответственно. Отметим эти значения на изображении.

Задание 6 2 7 scaled

Теперь будет несложно подсчитать размеры сторон пересечения: от 30 отнимаем 8 и от 19 отнимаем 2. Получается, что длина пересечения равна 22, а ширина17.

Задание 6 2 8 scaled

Для вычисления площади нас осталось просто перемножить два этих числа. Получаем ответ – 374.

Пример 3

В заключение решим задание на площадь объединения фигур:

Задание 667

«Черепахе был дан для исполнения следующий алгоритм:

Повтори 3 [Вперёд 39 Направо 90 Вперёд 48 Направо 90]
Поднять хвост
Вперёд 27 Направо 90 Вперёд 24 Налево 90
Опустить хвост
Повтори 3 [Вперёд 29 Направо 90 Назад 18 Направо 90]

Определите площадь области объединения фигур, ограниченных заданными алгоритмом линиями»

Подробно останавливаться на коде уже не будем. Алгоритм всех передвижений черепахи запишем так:

# Повтори 3
for _ in range(3):
    fd(39 * scale) # Вперёд 39
    rt(90) # Направо 90
    fd(48 * scale) # Вперёд 48
    rt(90) # Направо 90

# Перемещение
pu()
fd(27 * scale) # Вперёд 27
rt(90) # Направо 90
fd(24 * scale) # Вперёд 24
lt(90)  # Налево 90
pd()

# Повтори 3
for _ in range(3):
    fd(29 * scale) # Вперёд 29
    rt(90) # Направо 90
    bk(18 * scale) # Назад 18
    rt(90) # Направо 90

Дополним программу базовой настройкой, цветом каждой фигуры и расстановкой точек:

from turtle import *

tracer(0)
scale = 20
pensize(5)
screensize(2000, 2000)
dot_color = "#FFF" # Белый
dot_size = 12

lt(90) # Не обязательно

color("#A7D380")

# Повтори 3
for _ in range(3):
    fd(39 * scale) # Вперёд 39
    rt(90) # Направо 90
    fd(48 * scale) # Вперёд 48
    rt(90) # Направо 90

# Перемещение
pu()
fd(27 * scale) # Вперёд 27
rt(90) # Направо 90
fd(24 * scale) # Вперёд 24
lt(90)  # Налево 90
pd()

color("#F76D47")

# Повтори 3
for _ in range(3):
    fd(29 * scale) # Вперёд 29
    rt(90) # Направо 90
    bk(18 * scale) # Назад 18
    rt(90) # Направо 90

pu()  # Поднять хвост
for x in range(0, 50):
    for y in range(0, 50):
        goto(x * scale, y * scale) # Переместиться к x, y
        dot(dot_size, dot_color) # Поставить точку

done()

Проверим результат работы программы.

Задание 6 2 9 scaled

Да, и вот тут пересечение фигур выполнено не совсем удачно. Что же, давайте поэтапно разберём, как двигалась черепаха.

Изначально она находилась в точке с координатами (0, 0), а её голова была направлена «вверх». Первым делом выполняются команды: Вперёд 39 Направо 90 Вперёд 48 Направо 90. То есть черепаха рисует две стороны прямоугольника с длинами 39 и 48 единиц.

Задание 6 2 10 scaled

Далее снова выполняются всё те же команды и прямоугольник дорисовывается полностью.

Задание 6 2 11 scaled

А на третьей итерации цикла for черепаха перемещается в правый верхний угол фигуры и поворачивается головой «вниз».

Задание 6 2 12 scaled

Далее идёт перемещение с поднятым хвостом вперёд на 27 единиц.

Задание 6 2 13 scaled

После чего черепаха поворачивает налево и сдвигается еще на 24 единицы.

Задание 6 2 14 scaled

Повернувшись направо на 90 градусов, она приступает к рисованию второй фигуры. Её уже подробно разбирать не будем. Нам здесь важно, что одна из сторон пересечения одновременно будет и стороной второй фигуры. И длина этой стороны равняется 18.

Задание 6 2 15 scaled

Осталось лишь найти вторую сторону пересечения. На изображении она отмечена синим цветом.

Задание 6 2 16 scaled

Найти её несложно – достаточно от длины меньшей стороны первой фигуры (39) отнять первое перемещение черепахи с поднятым хвостом (27).

Задание 6 2 17 scaled

В итоге получим, что длина искомой стороны пересечения равна 12.

Задание 6 2 18 scaled

Теперь можем найти площадь объединения фигур. Для этого достаточно найти площадь каждой фигуры, сложить полученные значение и вычесть из этой суммы площадь пересечения. Запишем это выражение: 39 × 48 + 29 × 18 – 18 × 12 = 2178.

Число 2178 и будет ответом на это задание.

Больше заданий данного типа с подробным решением вы можете найти в нашем тренажёре