К содержанию

Подтема 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()
Что покажет окно программы: оба прямоугольника и сетка. Общая часть — шесть столбцов по пять точек, 30.
Тонкости:где запускать

Программу запускают в Python на своём компьютере, например в IDLE: меню Run → Run Module или клавиша F5. Многие онлайн-среды не умеют открывать окно turtle и выдают ошибку. Файл не называй turtle.py: Python подключит его вместо модуля.

Если рисунок не помещается в окно, уменьши масштаб k — фигура и сетка уменьшатся вместе.

Команды на Python

Каждая команда условия — одна строка программы. Строка import turtle as t , и его команды пишут через t.:

В условииВ программе
Вперёд nt.forward(n * k)
Назад nt.backward(n * k)
Направо mt.right(m)
Налево mt.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 все точки сбились бы у начала координат.

Итого

  • Шаблонподготовка, команды условия, сетка точек
  • Повтори kfor _ in range(k): и блок с отступом
  • Масштаб kумножать расстояния, не углы
  • Сеткаt.penup(), затем goto(x * k, y * k) и dot
  • Ответточки по рисунку считаешь сам

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1

Фигура построена с масштабом, а сетка — так:

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).
Вопрос 2
Какая из строк ошибочна при масштабе k: t.forward(5 * k), t.right(90 * k), t.goto(2 * k, 3 * k)? Почему?
ОтветСкрыть ответ
Ответ
t.right(90 * k): угол не масштабируют, иначе меняется сам алгоритм.
Вопрос 3
Фигура занимает −3 ≤ x ≤ 4, −2 ≤ y ≤ 5. Какие range нужны, чтобы сетка охватила её с запасом в одну точку с каждой стороны?
ОтветСкрыть ответ
Ответ
range(-4, 6) для x и range(-3, 7) для y: правая граница range не включается.
Вопрос 4
Переведи на Python «Повтори 3 [Вперёд 4 Направо 120]» с масштабом k.
ОтветСкрыть ответ
Ответ
for _ in range(3): и в блоке с отступом t.forward(4 * k), t.right(120).
Вопрос 5

Что нарисует программа и куда в конце будет смотреть голова?

t.setheading(90)for _ in range(4):    t.forward(5)t.right(90)
ОтветСкрыть ответ
Ответ
Отрезок длиной 20 вверх, голова в конце смотрит вправо: поворот без отступа не входит в цикл и выполняется один раз.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Масштаб и расстояние

В программе на turtle масштаб k = 25. Сколько точек экрана пройдёт Черепаха по команде «Вперёд 6»?

Введите число.

Сколько точек отметит сетка

Сетку наносят циклом for x in range(-3, 8): и вложенным в него for y in range(-2, 6):. Сколько точек она отметит?

Введите число.

Правая граница range

Фигура занимает −3 ≤ x ≤ 4. Сетку по x наносят циклом for x in range(-3, b):. При каком наименьшем b в сетку попадёт столбец x = 4?

Введите число.

Две фигуры с командами «Назад»

Черепаха находится в начале координат, голова направлена вверх, хвост опущен. Ей дали алгоритм:

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

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

Введите число.