16 февр 13:17
6 минут

Черепаха на бумаге и в Питоне

А теперь решим ту же задачу № 6 из ЕГЭ — на Черепаху — в Python.


Как известно, в прошлом году КУМИР выкинули из списка обязательного ПО для экзаменационных компьютеров. То есть задача на Черепаху есть, а КУМИРа нет. Значит, будем решать её при помощи Python, благо в его «коробке» есть библиотека turtle.

Напомню классическую задачу на Черепаху:

Черепахе был дан для исполнения следующий алгоритм: повтори 9 [вперед(5) вправо (60)] Постройте многоугольник в среде исполнителя «Черепаха» программы Кумир и посчитайте количество точек с целыми координатами, которые находятся внутри фигуры (точки на границе считать не нужно).


Библиотека turtle

Подключаем библиотеку обычным образом. Выберем вариант подключения через псевдоним, чтобы сразу было видно, какие элементы программы относятся к Черепахе, а какие — нет.

Черепаха удобна для одноразового вывода, даже, например, для создания диаграмм. Программировать с её помощью анимацию (например, обычными «фазами» через стирание — перерисовку) не получается.


Каркас программы с Черепахой:

import turtle as tr

tr.done()

В отличие от Черепахи из бумажных задач начальное положение turtle — носом вправо. Здесь мы установили курсор в вид «черепашка».

Первый запуск turtle
Первый запуск turtle

Начало координат — точка (0,0) — в центре графического окна. Оси координат направлены как в математике.


Методы рисования

up() / down(): поднять хвост / опустить хвост — Черепаха рисует при опущенном хвосте

goto(x, y): перемещает Черепаху в точку (х, у), если хвост опущен — рисуется линия

setpos(x, y): перемещает Черепаху в точку (х, у) без отрисовки

dot(n): ставим точку размером n пикселов (при этом неважно, опущен хвост или поднят)

forward(n) / backward(n): движение вперёд / назад на n пикселов

right(n) / left(n): поворот направо / налево на n градусов


Методы настройки

exitonclick(): выход из программы при клике на окне

shape(«turtle»): вид курсора (turtle — черепашка)

tracer(n): длительность отрисовки, мс (0 — мгновенно)

screensize(x, y): размер графического окна


НеЕГЭшные методы

color(«red»): цвет контуров (параметр — название цвета)

width(n): толщина линий в пикселах

clearscreen(): очищает окно

pos() : возвращает позицию Черепахи в виде кортежа (x, y)

circle® : рисует круг радиусом r из точки, где находится Черепаха (текущая точка — это нижняя точка круга, если Черепаха направлена вправо)


fillcolor(«blue»): цвет заливки

begin_fill(): начать заливку, после этого замкнутая фигура будет закрашена выбранным в .fillcolor цветом

end_fill(): остановить заливку


Вывод текста

write(txt, move=False, align="left», font=(«Arial», 12, «normal»)

где

txt — выводимый текст

move — перемещать ли курсор после вывода текста

align = «left» / «center» / «right»

font — описание шрифта: кортеж из трёх элементов — гарнитура, размер в пикселах, начертание


Несколько Черепах

Основной объект библиотеки turtle — это Turtle. Мы можем создавать экземпляры этого объекта, чтобы использовать несколько Черепах с разными свойствами:

t1 = Turtle()
t1.color('red')
t1.width(3)
t1.forward(100)
t1.right(90)

t2 = Turtle()
t2.color('green')
t2.width(1)
t2.left(90)
t2.forward(200)


Как видите, инструментарий вполне достаточный для наших задач. На одном из практических занятий мы даже выводим Черепахой столбиковую диаграмму по массиву данных:

Столбиковая диаграмма, нарисованная при помощи turtle
Столбиковая диаграмма, нарисованная при помощи turtle


Давайте решим всё ту же задачу № 6 на количество точек внутри фигуры.


Вначале переписываем заданную программу

повтори 9 [вперед(5) вправо (60)]

при помощи turtle

import turtle as tr

# устанавливаем черепаху носом вверх, как в задаче
tr.left(90)

# переписываем программу из задачи
for _ in range(9):
    tr.forward(5)
    tr.right(60)
   
tr.done()

Однако мы обнаружим, что Черепаха нарисовала что-то совсем крошечное. Правильно, ведь параметр методов forward/backward задаётся в пикселах.

Уже работает, но фигура совсем крошечная!
Уже работает, но фигура совсем крошечная!


Добавим коэффициент укрупнения, на который будем умножать каждый отрезок (но, конечно, не угол 😄). Заодно отметим начало координат, чтобы понять, в какой части плоскости оказалась наша фигура.

import turtle as tr

# устанавливаем черепаху носом вверх, как в задаче
tr.left(90)
# нарисуем точку в начале координат
tr.dot(5)

# коэффициент укрупнения
k = 30

# переписываем программу из задачи
for _ in range(9):
    tr.forward(5*k)
    tr.right(60)
   
tr.done()

Увеличили рисунок за счёт коэффициента k
Увеличили рисунок за счёт коэффициента k

Черепаха нарисовала шестиугольник, да ещё и повторно прошлась по трём его сторонам. Действительно, шагов цикла-то 9!

Вся фигура оказалась справа от начала координат. Здесь мы и будем рисовать точки, которые потом посчитаем внутри фигуры. При этом используем тот же коэффициент укрупнения k, чтобы набросать точки с целочисленными координатами.

Заодно давайте сделаем точки синими, чтобы чётко видеть, где фигуры, а где точки.

import turtle as tr

# устанавливаем черепаху носом вверх, как в задаче
tr.left(90)
# нарисуем точку в начале координат
tr.dot(5)

# коэффициент укрупнения
k = 30

# переписываем программу из задачи
for _ in range(9):
    tr.forward(5*k)
    tr.right(60)

# нарисуем сетку из точек 0..10 по х и -10..10 по у
tr.up()
tr.color('blue')

for x in range(10+1):
    for y in range(-10, 10+1):
        tr.setpos(x*k, y*k)
        tr.dot(3)
   
tr.done()


Полностью решённая задача
Полностью решённая задача

Теперь подсчитываем точки, попавшие внутрь шестиугольника. Получаем 62 штуки, как при решении через КУМИР.

Если хочется, можно нарисовать не точки, а сетку — клеточки. Попробуйте! У вас есть все нужные инструменты 😉


Бесплатный
Комментарии
avatar
Здесь будут комментарии к публикации