Черепа́шья гра́фика — принцип организации библиотеки графического вывода, построенный на метафоре Черепахи, воображаемого роботоподобного устройства, которое перемещается по экрану и поворачивается в заданных направлениях, при этом имея возможность оставлять за собой определенный след. В 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.

Последнее изменение: пятница, 8 августа 2025, 12:55