turtle
Черепа́шья гра́фика — принцип организации библиотеки графического вывода, построенный на метафоре Черепахи, воображаемого роботоподобного устройства, которое перемещается по экрану и поворачивается в заданных направлениях, при этом имея возможность оставлять за собой определенный след. В python черепашья графика представлена библиотекой turtle. Для управления черепахой там используются различные функции, перечислим некоторые из них.
|
Функция |
Описание |
|
forward(distance) fd(distance) |
Перемещает черепаху в направлении ее взгляда на distance единиц. |
|
back(distance) bk(distance) backward(distance) |
Перемещает черепаху в направлении обратном относительно ее взгляда на distance единиц. |
|
right(angle) rt(angle) |
Поворачивает черепаху на angle градусов по часовой стрелке. |
|
left(angle) lt(angle) |
Поворачивает черепаху на angle градусов против часовой стрелки. |
|
goto(x,y) |
Перемещает черепаху из ее текущего положения в точку с координатами x,y. |
|
setheading(to_angle) seth(to_angle) |
Поворачивает черепаху таким образом, чтобы она начала смотреть под углом to_angle (0 градусов – вправо, 90 градусов вверх и т.д. в соответствии с тригонометрическим кругом). |
|
circle(radius,extent,steps) |
Черепаха движется по окружности (либо дуге) с радиусом radius. extent – значение соответствующая градусной мере дуги (если значение меньше 360), если значение равно 360, то черепаха пройдет всю окружность и остановится в той точке с которой начинала, если же значение больше 360, то черепаха пройдет всю окружность и пройдет по ней еще сколько-то заходя на второй, третий и т.д. круги. steps – черепаха движется не совсем окружности, скорее она рисует многоугольник, и чем больше значение steps, тем больше у него вершин и тем менее это заметно. |
|
dot(size,color) |
Черепаха рисует точку радиуса size и цвета color. |
|
pendown() pd() down() |
Опустить перо. Черепаха начнет оставлять след при движении. |
|
penup() pu() up() |
Поднять перо. Черепаха перестанет оставлять след при движении. |
|
pensize(width) width(width) |
Изменение толщины оставляемого следа черепахой на width. |
|
pencolor(colorstring) pencolor(r,g,b) |
Изменение цвета пера. |
В дополнение к таблице выше отметим, что изначально черепаха смотрит вправо (вдоль положительного направления оси абсцисс) и делает это с опущенным хвостом.
Также стоит отметить, что мы можем управлять непосредственно анимацией черепахи. Иногда бывает полезно ее ускорить, чтобы не ждать слишком долго. Вот пара функций, которая для этого пригодится.
|
Функция |
Описание |
|
tracer(n) |
Где n – значение, соответствующее порядковому номеру каждого отрисовываемого кадра. Например, если n=10, то будет отрисовываться только каждый 10ый кадр. |
|
update() |
Отрисовывает все не отрисованные на данный момент кадры. В связи с тем, что через tracer мы указываем некоторое значение n, а количество кадров, которые нужно отрисовать, может оказаться не кратно n, то получается, что мы отрисуем не все кадры. Так, если n=100, а кадров 270, то мы потеряем последние 70 кадров. |
Решим одну из задач №6 с помощью описанных выше функций.
ФИПИ 8E798C
Исполнитель Черепаха действует на плоскости с декартовой системой координат. В начальный момент Черепаха находится в начале координат, её голова направлена вдоль положительного направления оси ординат, хвост опущен. При опущенном хвосте Черепаха оставляет на поле след в виде линии. В каждый конкретный момент известно положение исполнителя и направление его движения. У исполнителя существует 5 команд : Поднять хвост, означающая переход к перемещению без рисования; Опустить хвост, означающая переход в режим рисования; Вперёд n (где n – целое число), вызывающая передвижение Черепахи на n единиц в том направлении, куда указывает её голова; Назад n (где n – целое число), вызывающая передвижение в противоположном голове направлении; Направо m (где m – целое число), вызывающая изменение направления движения на m градусов по часовой стрелке, Налево m (где m – целое число), вызывающая изменение направления движения на m градусов против часовой стрелки.
Запись Повтори k [Команда1 Команда2 … КомандаS] означает, что последовательность из S команд повторится k раз.
Черепахе был дан для исполнения следующий алгоритм:
Повтори 2 [Вперёд 10 Направо 90 Вперёд 18 Направо 90]
Поднять хвост
Вперёд 5 Направо 90 Вперёд 14 Налево 90
Опустить хвост
Повтори 2 [Вперёд 17 Направо 90 Вперёд 7 Направо 90]
Определите, сколько точек с целочисленными координатами будут находиться внутри пересечения фигур, ограниченных заданными алгоритмом линиями, включая точки на линиях.
Решение
Для начала напишем код, который отрисует точки в целочисленных координатах от -1 до 29 (в данном случае весь наш рисунок будет находиться внутри этих координат). Нарисуем эдакое подобие координатной плоскости, но не с помощью параллельных прямых, а с помощью точек.
up()
for x in range(-1,30):
for y in range(-1,30):
goto(x,y)
dot(2,"black")
Проблема данного кода в том, что если мы его запустим, то увидим как черепаха рисует сплошные линии, т.к. размер точки просто будет настолько большим, что мы не увидим зазора между точками. Ну а если уменьшить размер точки, то черепашка настолько маленькую точку даже отображать не станет. Чтобы исправить эту проблему давайте введем "шаг". Т.е. будем отрисовывать точки не в координатах (0,0), (0,1), (0,2) и т.д., а в координатах (0,0), (0,10), (0,20) и т.д. Ну и увеличим в связи с этим размер точек.
up()
step=10
for x in range(-1,30):
for y in range(-1,30):
goto(x*step,y*step)
dot(5,"black")
Теперь вернем черепаху на место с помощью goto(0,0). Опустим хвост с помощью down(). Повернем ее налево на 90 градусов left(90), чтобы она стала смотреть вдоль положительного направления оси ординат.
Подготовительную часть выполнили, теперь давайте повторим описанный в задании алгоритм с учетом того, что у нас изначально был задан шаг. Чтобы ускорить процесс отрисовки в начале вызовем tracer() и в конце отрисуем оставшиеся кадры с помощью update(). Итоговый код будет выглядеть следующим образом.
from turtle import *
tracer(2000)
up()
step=10
for x in range(-1,30):
for y in range(-1,30):
goto(x*step,y*step)
dot(5,"black")
goto(0,0)
down()
left(90)
for i in range(2):
forward(10*step)
right(90)
forward(18*step)
right(90)
up()
forward(5*step)
right(90)
forward(14*step)
left(90)
down()
for i in range(2):
forward(17*step)
right(90)
forward(7*step)
right(90)
update()
Получаем следующую картинку

Считаем интересующие нас точки

И наш ответ 30.