Как рисовать фигуры черепашкой: шаг и поворот
Любая фигура из отрезков строится 2 командами: forward проводит сторону, left или right поворачивает исполнителя на угол. Вся геометрия прячется в одном числе — величине поворота.
Представьте, что вы обходите по периметру клумбу квадратной формы. Вы идёте вдоль одной стороны, в углу поворачиваетесь, идёте вдоль следующей. Когда вы вернулись к началу, вы смотрите туда же, куда смотрели в самом начале, — значит, всего развернулись на полный круг, на 360 градусов. Сеймур Пейперт, придумавший черепашью графику, называл это «теоремой о полном обходе черепашки» и считал, что ребёнок открывает её сам, когда пробует рисовать[1]. Из этой теоремы получаются все повороты на этой странице, и любые фигуры черепашкой строятся по ней.
Если вы ещё не знакомы с командами модуля, прочитайте сначала обзор модуля turtle в Python: там разобраны перо, цвет, скорость и координаты. Здесь мы сосредоточимся на геометрии, а сам модуль подробно описан в официальной документации Python[3]. В редакторе выше уже есть программа с треугольником, квадратом, шестиугольником и звездой — нажмите «▶ Запустить» и посмотрите, как они появляются на холсте.
Квадрат: 4 стороны и поворот на 90 градусов
Квадрат — это 4 одинаковые стороны и 4 поворота на 90 градусов. Его удобно рисовать первым: прямой угол легко представить, а ошибку в числе сразу видно. В книге Пейперта квадрат тоже служит одним из первых примеров.
import turtle
t = turtle.Turtle()
for i in range(4):
t.forward(120)
t.left(90)
Без цикла программа заняла бы 8 строк, где одна и та же пара команд повторяется. Цикл for делает код короче и, главное, понятнее: читатель сразу видит «4 раза сторона и поворот». Попробуйте заменить 90 на 89 — квадрат не замкнётся, и последняя сторона упрётся мимо начала. Так на практике видно, что у замкнутой фигуры сумма поворотов должна равняться 360: 4 × 89 = 356, не хватает 4 градусов.
Прямоугольник рисуется так же, но стороны чередуются: длинная, короткая, длинная, короткая. Поэтому цикл повторяется 2 раза, а внутри — две стороны и два поворота.
import turtle
t = turtle.Turtle()
for i in range(2):
t.forward(160)
t.left(90)
t.forward(80)
t.left(90)
Треугольник: почему поворот 120, а не 60
Если повернуть на 60 градусов, правильный треугольник не получится, хотя каждый его угол равен 60. Исполнитель поворачивается на внешний угол, а он равен 180 − 60 = 120 градусов.
Это самая частая ошибка у тех, кто впервые рисует треугольник. Внутренний угол — это угол между сторонами внутри фигуры. А поворот — насколько исполнитель меняет направление движения. Шёл вправо, а должен пойти вверх-влево вдоль второй стороны: разворот здесь куда больше, чем 60 градусов. Проверить легко: три поворота по 120 дают 360, полный обход. Три поворота по 60 дают только 180, замкнуть контур так не выйдет: вместо треугольника получится половина шестиугольника.
import turtle
t = turtle.Turtle()
for i in range(3):
t.forward(150)
t.left(120)
Этот же принцип объясняет любую фигуру: внутренний угол и поворот вместе всегда дают 180 градусов. На уроке геометрии внутренний угол знают лучше, поэтому полезно один раз нарисовать оба на бумаге и подписать.
Любой многоугольник по правилу 360/n
Чтобы нарисовать правильный многоугольник с n сторонами, нужно n раз пройти сторону и повернуть на 360/n градусов. Это правило работает для 3, 5, 8 и даже 36 сторон.
| Фигура | Сторон n | Поворот 360/n | Внутренний угол |
| Треугольник | 3 | 120° | 60° |
| Квадрат | 4 | 90° | 90° |
| Пятиугольник | 5 | 72° | 108° |
| Шестиугольник | 6 | 60° | 120° |
| Восьмиугольник | 8 | 45° | 135° |
| Почти круг | 36 | 10° | 170° |
Последняя строка показывает интересную вещь: у многоугольника с 36 сторонами стороны такие короткие, что глаз видит круг. Именно так компьютер и рисует окружности — множеством маленьких отрезков. В документации Python описан и готовый вариант: команда circle с параметром steps строит вписанный многоугольник. Чем больше сторон, тем короче их нужно делать, иначе фигура не поместится на холсте: у 36-угольника со стороной 100 периметр 3600 точек.
import turtle
t = turtle.Turtle()
n = 7
for i in range(n):
t.forward(80)
t.left(360 / n)
Поменяйте n на 5, 9 или 12 — так рисуют фигуры черепашкой без переписывания: код строит правильный семиугольник и любую другую фигуру без единой правки внутри цикла. Деление 360 / n в Python всегда даёт дробное число, и это не мешает: черепашка поворачивается и на 51,43 градуса.
Функция для фигур черепашкой
Функция — это способ дать имя куску программы и вызывать его с разными числами. Одна функция с 3 параметрами заменяет десяток почти одинаковых циклов, и рисовать фигуры черепашкой становится в разы удобнее.
import turtle
t = turtle.Turtle()
def mnogougolnik(n, storona):
for i in range(n):
t.forward(storona)
t.left(360 / n)
mnogougolnik(3, 100)
mnogougolnik(5, 70)
mnogougolnik(8, 40)
Все три фигуры начинаются в одной точке и «вырастают» из неё, потому что после полного обхода исполнитель возвращается на место. Если нужно поставить их рядом, добавьте в функцию параметры x и y и переходите туда с поднятым пером. Подробнее о параметрах и return — в статье про функции в Python. В редакторе на странице функция figura принимает ещё и цвет: попробуйте нарисовать радугу из шести вложенных шестиугольников.
Пятиконечная звезда и поворот на 144
Пятиконечная звезда рисуется 5 лучами с поворотом на 144 градуса. Исполнитель обходит центр не один раз, а дважды, поэтому сумма поворотов равна 720.
import turtle
t = turtle.Turtle()
for i in range(5):
t.forward(150)
t.right(144)
Почему 144? Звезда — это пятиугольник, у которого вершины соединены через одну. Обходя её, черепашка делает два полных оборота: 720 / 5 = 144. Острый угол на кончике луча при этом равен 180 − 144 = 36 градусов. Для звезды с другим нечётным числом лучей подходит формула 180 − 180/n: для 7 лучей это примерно 154,3 градуса. С чётным числом лучей, например 6, нарисовать звезду одной ломаной не получится: её собирают из двух наложенных треугольников, которые рисуют отдельно.
Спираль: сторона растёт с каждым шагом
Спираль — это многоугольник, который не замыкается: на каждом шаге сторона становится длиннее. Для этого переменную цикла используют как длину отрезка.
import turtle
t = turtle.Turtle()
t.speed(0)
for i in range(60):
t.forward(i * 4)
t.left(91)
При повороте ровно на 90 получится квадратная спираль с прямыми углами; закрутить её без лишнего градуса не получится. Лишний градус — 91 — закручивает её, и углы начинают медленно сдвигаться. Попробуйте 121 вместо 91: появится закрученная треугольная спираль. Число повторов держите не больше 60–80, иначе линии уйдут за край холста. Спирали — первый шаг к генеративным картинкам; ещё шесть программ для экспериментов собраны на странице о рисовании кодом.
Узоры: фигура, повёрнутая по кругу
Узор получается, если нарисовать одну фигуру, повернуть исполнитель на 360/k градусов и повторить k раз. Это цикл внутри цикла: внутренний рисует фигуру, внешний её поворачивает.
import turtle
t = turtle.Turtle()
t.speed(0)
for k in range(18):
for i in range(4):
t.forward(90)
t.left(90)
t.left(20)
18 квадратов с поворотом на 20 градусов дают розетку: 18 × 20 = 360. Замените квадрат на шестиугольник или звезду, и узор станет совсем другим. Цвета можно чередовать списком: t.color(["red", "blue", "green"][k % 3]). В школе такие задания встречаются у исполнителя Черепашка: по федеральной образовательной программе исполнителей изучают в 8 классе вместе с циклами[2], и узоры из повторяющихся фигур — классический пример вложенного цикла.
Когда правило 360/n не поможет
Правило поворота на 360/n не поможет, если фигура неправильная: стороны или углы у неё разные. В этих 4 случаях нужен другой подход.
- Ромб с углами 60 и 120 градусов. Повороты чередуются, поэтому цикл на 2 повтора с двумя разными поворотами внутри.
- Домик из 2 частей. Стены и крыша рисуются отдельно, с переходом между ними.
- Звезда с 6 лучами. Одной ломаной её не обойти — рисуют два треугольника.
- Ровная окружность радиуса 100. Удобнее команда
circle(100), чем 360 отрезков вручную.
Миф: «поворот черепашки равен углу фигуры». Это не подтверждается даже на простейшем примере с тремя сторонами: угол 60 градусов, а поворот 120. Совпадают они только при прямом угле, и поэтому ошибка долго остаётся незамеченной.
Миф: «чтобы рисовать кодом, надо отлично знать геометрию». Отдельной подготовки не нужно: правило 360/n дети обычно выводят сами, пробуя разные числа, и это, по мысли Пейперта, лучший способ его понять.
Чего делать нельзя
Нельзя подбирать углы наугад десятками попыток: проще посчитать по правилу и проверить сумму поворотов. Остальные ошибки тоже типичны.
- Нельзя путать внутренний угол и поворот — три поворота по 60 не замкнут контур.
- Не стоит писать
360 // n: целочисленное деление для 7 сторон даст 51 вместо 51,43, и фигура чуть разойдётся. - Не следует запускать спираль на 500 шагов без проверки: она уйдёт за холст и будет рисоваться долго.
- Не стоит повторять один и тот же цикл 5 раз подряд — вынесите повтор в функцию.
- Нельзя забывать penup при переходе к новой фигуре, если соединяющая линия не нужна.
- Не следует менять поворот внутри цикла без причины: правильная форма требует одинаковых шагов.
Готовые упражнения с подсказками — домик, лестница, снежинка — собраны в подборке заданий для черепашки по возрастанию сложности. А если вы пришли из Scratch, сравните эти программы с блоками из статьи про рисование пером в Scratch.
Источники
[1] Papert S. Mindstorms: Children, Computers, and Powerful Ideas. New York: Basic Books, 1980.
[2] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования».
[3] The Python Tutorial (официальная документация Python 3). Python Software Foundation.
Вопросы и ответы
Почему фигуры черепашкой получаются кривыми?
Чаще всего сумма поворотов не равна 360 или в цикле меняется длина стороны. Проверьте число повторов и угол: их произведение должно давать 360 для простого контура.
Как закрасить рисунок внутри?
Поставьте t.begin_fill() перед циклом и t.end_fill() после него, а цвет заливки задайте вторым значением в t.color("black", "yellow").
Как начать рисунок в другом месте холста?
Поднимите перо, перейдите командой goto(x, y) и опустите перо обратно. Центр холста — точка (0, 0).
Почему звезда рисуется через right, а не left?
Можно и через left — звезда просто отразится зеркально. Направление поворота меняет только то, в какую сторону она «растёт» от начальной точки.
Сколько сторон нужно, чтобы получился круг?
Уже 24–36 коротких сторон глаз воспринимает как окружность. Сторону при этом делают маленькой, 5–10 точек, чтобы рисунок поместился.
Можно ли рисовать так в школе на уроке?
Если на уроке используют Python, то да. По ФОП исполнитель Черепашка изучается в 8 классе. Если учитель выбрал среду КуМир, команды называются по-русски, но правило поворота то же самое.