Подтема 4 из 6
Рисунок программой
Как нарисовать фигуры программой на turtle и посчитать точки по готовому рисунку.
Зачем рисовать программой
Прямоугольники задачи темы легко нарисовать на черновике. Но если команд много или стороны наклонные, рисунок от руки выходит неточным, и точки у границы легко посчитать неверно.
Программа на Python с модулем turtle выполняет команды Черепахи и наносит сетку целых точек — остаётся посчитать точки по рисунку. Ответ программа не находит: какие точки входят в нужную область, решаешь ты.
Шаблон
Вот программа для задачи темы. В ней три части: подготовка, команды из условия и сетка точек. Для новой задачи меняют только среднюю часть.
import turtle as t k = 30t.tracer(0)t.setheading(90) for _ in range(2): t.forward(6 * k) t.right(90) t.forward(8 * k) t.right(90) t.penup()t.forward(2 * k)t.right(90)t.forward(3 * k)t.left(90)t.pendown() for _ in range(2): t.forward(5 * k) t.right(90) t.forward(7 * k) t.right(90) t.penup()for x in range(-2, 13): for y in range(-2, 10): t.goto(x * k, y * k) t.dot(4, "red") t.update()t.done()Тонкости:где запускать
Программу запускают в Python на своём компьютере, например в IDLE: меню Run → Run Module или клавиша F5. Многие онлайн-среды не умеют открывать окно turtle и выдают ошибку. Файл не называй turtle.py: Python подключит его вместо модуля.
Если рисунок не помещается в окно, уменьши масштаб k — фигура и сетка уменьшатся вместе.
Команды на Python
Каждая команда условия — одна строка программы. Строка import turtle as t , и его команды пишут через t.:
| В условии | В программе |
|---|---|
| Вперёд n | t.forward(n * k) |
| Назад n | t.backward(n * k) |
| Направо m | t.right(m) |
| Налево m | t.left(m) |
| Поднять хвост | t.penup() |
| Опустить хвост | t.pendown() |
| Повтори k [ … ] | for _ in range(k): |
«Повтори» записывают . Какие команды повторяются, показывает отступ: в цикл входят строки с четырьмя пробелами под ним. Если t.right(90) написать без отступа, поворот выполнится один раз, после всех повторений.
Остальные строки шаблона служебные. t.setheading(90) направляет голову вверх: в turtle Черепаха сначала смотрит вправо. t.tracer(0) и t.update() рисуют всё сразу, без медленной анимации, а t.done() оставляет окно открытым.
Масштаб
На масштаб k умножают расстояния и координаты, но не углы.
Одна единица turtle — одна точка экрана, и прямоугольник 8 × 6 без масштаба был бы размером с букву. При k = 30 одна единица задачи занимает 30 точек экрана: t.forward(6 * k) проходит 180 точек экрана, а в задаче длина стороны по-прежнему 6.
Поворот при увеличении рисунка не меняется: t.right(90). Запись t.right(90 * k) повернула бы Черепаху на 2700° и изменила бы сам алгоритм.
Сетка точек
Сетку наносят двумя вложенными циклами — с поднятым хвостом и тем же масштабом, что и фигуру.
t.penup()for x in range(-2, 13): for y in range(-2, 10): t.goto(x * k, y * k) t.dot(4, "red")Внешний цикл перебирает x, а для каждого x перебирает y — получаются все пары. range(a, b) даёт числа от a до b − 1: range(-2, 13) — это x от −2 до 12. Диапазоны берут с запасом вокруг фигуры.
t.goto(x * k, y * k) переносит Черепаху в точку сетки, t.dot(4, "red") ставит там красную точку. Без t.penup() переходы между точками оставили бы линии, а без умножения на k все точки сбились бы у начала координат.
Итого
- Шаблонподготовка, команды условия, сетка точек
- Повтори k
for _ in range(k):и блок с отступом - Масштаб kумножать расстояния, не углы
- Сетка
t.penup(), затемgoto(x * k, y * k)иdot - Ответточки по рисунку считаешь сам
Проверьте себя
Ответь сначала сам, потом открой ответ.
Фигура построена с масштабом, а сетка — так:
k = 25 for _ in range(4): t.forward(6 * k) t.right(90) for x in range(-2, 9): for y in range(-2, 9): t.goto(x, y) t.dot(4, "red")Найди две ошибки в части, которая наносит точки.
ОтветСкрыть ответ
t.penup(); точки без масштаба — нужно t.goto(x * k, y * k).t.forward(5 * k), t.right(90 * k), t.goto(2 * k, 3 * k)? Почему?ОтветСкрыть ответ
t.right(90 * k): угол не масштабируют, иначе меняется сам алгоритм.range нужны, чтобы сетка охватила её с запасом в одну точку с каждой стороны?ОтветСкрыть ответ
range(-4, 6) для x и range(-3, 7) для y: правая граница range не включается.ОтветСкрыть ответ
for _ in range(3): и в блоке с отступом t.forward(4 * k), t.right(120).Что нарисует программа и куда в конце будет смотреть голова?
t.setheading(90)for _ in range(4): t.forward(5)t.right(90)ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Масштаб и расстояние
В программе на turtle масштаб k = 25. Сколько точек экрана пройдёт Черепаха по команде «Вперёд 6»?
Введите число.
Подсказка
На масштаб умножают расстояние.
Решение
Команда записывается как t.forward(6 * k): 6 · 25 = 150.
Ответ: 150
Сколько точек отметит сетка
Сетку наносят циклом for x in range(-3, 8): и вложенным в него for y in range(-2, 6):. Сколько точек она отметит?
Введите число.
Подсказка
range(a, b) даёт b − a чисел.
Решение
x принимает 11 значений (от −3 до 7), y — 8 значений (от −2 до 5). Точек 11 · 8 = 88.
Ответ: 88
Правая граница range
Фигура занимает −3 ≤ x ≤ 4. Сетку по x наносят циклом for x in range(-3, b):. При каком наименьшем b в сетку попадёт столбец x = 4?
Введите число.
Подсказка
Правая граница range в перебор не входит.
Решение
range(-3, b) даёт числа от −3 до b − 1. Чтобы среди них было 4, нужно b − 1 ≥ 4, то есть b = 5.
Ответ: 5
Две фигуры с командами «Назад»
Черепаха находится в начале координат, голова направлена вверх, хвост опущен. Ей дали алгоритм:
Повтори 2 [Вперёд 4 Направо 90 Вперёд 9 Направо 90]Поднять хвостНазад 3 Направо 90 Назад 2 Налево 90Опустить хвостПовтори 2 [Вперёд 8 Направо 90 Вперёд 5 Направо 90]Определи, сколько точек с целочисленными координатами принадлежит объединению областей, ограниченных заданными алгоритмом линиями, включая точки на линиях.
Введите число.
Подсказка
«Назад» ведёт в отрицательные координаты: построй рисунок программой или найди, где опустится хвост.
Решение
Первая фигура — 0 ≤ x ≤ 9, 0 ≤ y ≤ 4. С поднятым хвостом Черепаха пятится на 3 вниз и на 2 влево, хвост опускается в (−2; −3), голова смотрит вверх. Вторая фигура — −2 ≤ x ≤ 3, −3 ≤ y ≤ 5. В первой 10 · 5 = 50 точек, во второй 6 · 9 = 54, общих (0 ≤ x ≤ 3, 0 ≤ y ≤ 4) 4 · 5 = 20. В объединении 50 + 54 − 20 = 84.
Ответ: 84