Урок 1.Круги и дуги
Круг: команда circle()
До сих пор мы рисовали только прямые линии. Но черепашка умеет и круги:
import turtle
t = turtle.Turtle()
t.circle(50)
turtle.done()
Число в скобках — радиус круга в пикселях. circle(50) — круг радиусом 50. circle(100) — вдвое больше.
Как черепашка рисует круг
Здесь есть тонкость, на которой спотыкаются все. Черепашка не прыгает в центр. Она стоит на месте и начинает идти по кругу против часовой стрелки. А центр круга находится слева от неё.
Лучше всего представить так: черепашка привязана верёвкой к колышку. Колышек — это центр круга, верёвка — радиус. Черепашка идёт вокруг колышка, натягивая верёвку. Поэтому круг всегда появляется слева от неё (если радиус положительный).
После рисования круга черепашка оказывается в той же точке, откуда начала, но повёрнутой на 360° — то есть смотрящей туда же, куда смотрела.
Дуга: circle() с двумя числами
У circle() есть второй параметр — угол. Если его указать, черепашка нарисует не весь круг, а только его часть:
import turtle
import turtle
t = turtle.Turtle()
t.speed(0)
t.pensize(3)
t.penup()
t.goto(-200, 0)
t.pendown()
t.circle(50, 90) # четверть круга
t.penup()
t.goto(0, 0)
t.pendown()
t.circle(50, 180) # половина круга
t.penup()
t.goto(100, 0)
t.pendown()
t.circle(50, 270) # три четверти
turtle.done()
Угол измеряется в градусах. 360 — полный круг, 180 — половина, 90 — четверть.
Куда идёт черепашка после дуги
После дуги черепашка оказывается повёрнутой. Она прошла часть круга и смотрит уже в другом направлении. Это ключевой момент для составных фигур.
Например, лепестки цветка:
import turtle
t = turtle.Turtle()
t.speed(0)
for _ in range(6):
t.circle(50, 90) # четверть круга
t.right(-90) # повернуть
t.circle(50, 90) # четверть круга
t.right(-30) # повернуть
turtle.done()
Отрицательный радиус
Если радиус отрицательный, черепашка идёт по часовой стрелке, и центр круга оказывается справа от неё:
t.circle(-50) # круг по часовой стрелке
t.circle(-50, 90) # дуга по часовой стрелке
Это полезно, когда нужно нарисовать дугу в другую сторону, не разворачивая черепашку.
Волна из полукругов
Если чередовать положительный и отрицательный радиус, получаются волны:
import turtle
t = turtle.Turtle()
t.speed(0)
t.pensize(3)
for _ in range(6):
t.circle(10, 180) # полукруг влево
t.circle(-10, 180) # полукруг вправо
turtle.done()
Получается волнистая линия — как след от синусоиды.
Спираль из дуг
Если каждая следующая дуга чуть больше предыдущей, получится спираль:
import turtle
t = turtle.Turtle()
t.speed(0)
for i in range(1, 30):
t.circle(i * 5, 90)
turtle.done()
Каждая дуга — четверть круга, но радиус растёт. Получается закручивающаяся спираль.
Овал
Овал — это как будто круг, растянутый в одну сторону. Можно нарисовать его, чередуя два радиуса:
import turtle
t = turtle.Turtle()
t.speed(0)
for _ in range(2):
t.circle(80, 90) # широкая дуга
t.circle(40, 90) # узкая дуга
turtle.done()
Четыре дуги замыкаются в овал. Чем больше разница между радиусами, тем более вытянутый овал.
Скорость
Круги рисуются медленнее прямых линий, потому что черепашка проходит много маленьких шагов. Если рисуешь много кругов, ставь t.speed(0).
Задание 1. Нарисуй круг радиусом 100. Где оказался его центр относительно стартовой точки черепашки?
Задание 2. Нарисуй три дуги: четверть круга, половину и три четверти. Радиус каждой — 60.
Задание 3. Нарисуй волну: шесть полукругов подряд. Подсказка: чередуй
circle(50, 180) и circle(-50, 180).
Задание 4. Нарисуй спираль из дуг: в цикле
circle(i * 5, 90), где i идёт от 1 до 30.
Задание 5. Нарисуй овал, чередуя радиусы 100 и 50.
Урок 2.Заливка
Две команды для заливки
Чтобы залить фигуру, нужно обернуть её рисование в две команды:
import turtle
t = turtle.Turtle()
t.color("black", "yellow")
t.begin_fill()
t.circle(50)
t.end_fill()
turtle.done()
begin_fill()— «начинаю запоминать фигуру».end_fill()— «закончил, залей то, что запомнил».
Черепашка запоминает путь между этими командами и закрашивает область внутри.
Замкнутая фигура
Важно: если фигура не замкнута, заливка получится странной. Черепашка просто соединит конец пути с началом. Поэтому всегда возвращайся в начальную точку.
Например, вот так круг заливается правильно — потому что circle() сам возвращает черепашку в начало. А вот треугольник, который не вернулся в начало, зальётся неправильно. Сравни:
import turtle
t = turtle.Turtle()
# неправильно: не вернулись в начало
t.color("black", "pink")
t.begin_fill()
t.forward(100)
t.right(120)
t.forward(100)
t.end_fill()
turtle.done()
import turtle
t = turtle.Turtle()
# правильно: вернулись в начало
t.color("black", "lightgreen")
t.begin_fill()
for _ in range(3):
t.forward(100)
t.right(120)
t.end_fill()
turtle.done()
Во втором случае черепашка проходит все три стороны и возвращается в стартовую точку.
Несколько фигур подряд
Если хочешь нарисовать несколько залитых фигур, делай так: нарисовал одну — залил, поднял перо, перешёл на новое место, опустил перо, начал следующую.
import turtle
t = turtle.Turtle()
t.speed(0)
# первый круг
t.color("black", "red")
t.begin_fill()
t.circle(50)
t.end_fill()
# переход
t.penup()
t.forward(150)
t.pendown()
# второй круг
t.color("black", "blue")
t.begin_fill()
t.circle(50)
t.end_fill()
turtle.done()
Отдельно перо и заливка
Вернёмся к двум цветам. t.color(перо, заливка) — задаёт оба сразу. А можно задать по отдельности:
t.pencolor("red") # только цвет пера
t.fillcolor("yellow") # только цвет заливки
Полезно, когда меняешь только один цвет.
Одна тонкость
Цвет заливки не влияет на контур. Если поставить fillcolor("yellow"), но не поставить pencolor, контур останется чёрным. Иногда это как раз то, что нужно — например, жёлтое солнце с чёрным обводом. А иногда хочется, чтобы всё было одного цвета — тогда ставь оба:
t.color("yellow", "yellow")
И ещё: если заливка «не появляется» — скорее всего, забыли end_fill(). Без него черепашка не знает, что фигура закончилась, и ничего не заливает.
Задание 1. Нарисуй залитый круг красного цвета. Контур — чёрный.
Задание 2. Нарисуй залитый треугольник со стороной 100. Цвет заливки — голубой.
Задание 3. Нарисуй два залитых круга рядом: один красный, второй синий. Используй
penup() и forward(), чтобы перейти между ними.
Задание 4. Нарисуй залитый овал (чередуя радиусы 80 и 40). Цвет заливки — жёлтый.
Урок 3.Многоугольники
Формула для любого многоугольника
Мы уже рисовали квадрат — четыре стороны и четыре поворота по 90°. Заметь: 90 — это 360 / 4.
Для любого правильного многоугольника работает формула:
угол поворота = 360 / количество сторон
Проверим:
- Треугольник: 360 / 3 = 120°.
- Квадрат: 360 / 4 = 90°.
- Пятиугольник: 360 / 5 = 72°.
- Шестиугольник: 360 / 6 = 60°.
- Восьмиугольник: 360 / 8 = 45°.
Значит, можно написать универсальную программу, которая рисует любой правильный многоугольник:
import turtle
t = turtle.Turtle()
n = 6 # количество сторон
angle = 360 / n
for _ in range(n):
t.forward(100)
t.right(angle)
turtle.done()
Поменяй n на 3 — получится треугольник. На 5 — пятиугольник. На 8 — восьмиугольник. На 36 — почти круг.
Упаковываем в функцию
Каждый раз писать цикл заново неудобно. Давай соберём его в функцию — как маленькую подпрограмму с именем:
def polygon(n, size):
for _ in range(n):
t.forward(size)
t.right(360 / n)
Теперь можно рисовать многоугольники одной строкой:
import turtle
t = turtle.Turtle()
t.speed(0)
def polygon(n, size):
for _ in range(n):
t.forward(size)
t.right(360 / n)
# переход
t.penup(); t.forward(-120); t.pendown()
polygon(3, 100) # треугольник
t.penup(); t.forward(120); t.pendown()
polygon(4, 80) # квадрат
t.penup(); t.forward(120); t.pendown()
polygon(6, 60) # шестиугольник
turtle.done()
Функция polygon принимает два значения: n — сколько сторон, size — длина стороны. Внутри она использует те же команды, что мы писали руками.
Это пока механическая упаковка. Мы просто завернули готовый код в функцию и дали ей имя. Зачем функции нужны и как они работают — разберём позже. Сейчас достаточно уметь их использовать.
Многоугольник с заливкой
Добавим заливку:
import turtle
t = turtle.Turtle()
t.speed(0)
t.color("black", "yellow")
def polygon(n, size):
t.begin_fill()
for _ in range(n):
t.forward(size)
t.right(360 / n)
t.end_fill()
polygon(5, 100) # пятиугольник
turtle.done()
Разные многоугольники подряд
Теперь можно рисовать целую коллекцию фигур:
import turtle
t = turtle.Turtle()
t.speed(0)
t.pensize(3)
def polygon(n, size):
for _ in range(n):
t.forward(size)
t.right(360 / n)
colors = ["red", "orange", "yellow", "green", "blue", "purple"]
sizes = [70, 60, 50, 40, 30, 25]
# переход
t.penup(); t.forward(-250); t.pendown()
turtle.done()
for i in range(6):
t.color(colors[i])
polygon(i + 3, sizes[i])
t.penup()
t.forward(90)
t.pendown()
turtle.done()
Шесть фигур: от треугольника до восьмиугольника. Каждая — своего цвета и размера.
Задание 1. Нарисуй залитый треугольник со стороной 100. Какой угол поворота? Подсказка: 360 / 3.
Задание 2. Нарисуй залитый шестиугольник со стороной 80. Цвет заливки — голубой.
Задание 3. Сделай цикл, который рисует многоугольники от 3 до 10 сторон подряд. Подсказка: используй функцию
polygon(n, size).
Задание 4. Нарисуй залитый круг, а внутри — залитый квадрат другого цвета. Подсказка: сначала круг, потом подними перо, перейди в центр и нарисуй квадрат.
Урок 4.Звёзды и итог
Как нарисовать звезду
Со звёздами немного хитрее. Если нарисовать пятиконечную звезду как пятиугольник с поворотом 72°, получится просто пятиугольник. А чтобы получилась звезда, нужно поворачиваться на другой угол — на 144°.
Откуда 144? Это 360 × 2 / 5. То есть мы как будто дважды обходим круг.
import turtle
t = turtle.Turtle()
t.color("gold", "yellow")
t.begin_fill()
for _ in range(5):
t.forward(150)
t.right(144)
t.end_fill()
turtle.done()
Получилась классическая пятиконечная звезда с заливкой.
Упаковываем звезду в функцию
Точно так же, как с многоугольником:
def star(size):
t.begin_fill()
for _ in range(5):
t.forward(size)
t.right(144)
t.end_fill()
Теперь можно рисовать звёзды одной строкой: star(100), star(50).
Разные звёзды
Попробуем разные размеры и цвета:
import turtle
t = turtle.Turtle()
t.speed(0)
t.penup()
t.goto(-350, 0)
def gcd(a, b):
while b: a, b = b, a % b
return a
def star(n, k, size):
for _ in range(n):
t.forward(size)
t.right(360 * k / n)
# только «настоящие» звёзды
for n in range(5, 10):
for k in range(2, n // 2 + 1):
if gcd(n, k) == 1:
t.pendown()
star(n, k, 67)
t.penup()
t.forward(100)
turtle.done()
Итоговый проект: звёздное поле
Соберём всё, что узнали за 4 недели: круги, заливку, многоугольники, функции и случайность.
Нарисуем звёздное поле: несколько звёзд разного размера и цвета, разбросанных по всему окну случайным образом.
import turtle
import random
t = turtle.Turtle()
t.speed(0)
screen = turtle.Screen()
screen.bgcolor("midnightblue")
def star(size):
t.begin_fill()
for _ in range(5):
t.forward(size)
t.right(144)
t.end_fill()
colors = ["gold", "yellow", "white", "orange", "lightyellow"]
for _ in range(15):
x = random.randint(-250, 250)
y = random.randint(-250, 250)
size = random.randint(15, 50)
color = random.choice(colors)
t.penup()
t.goto(x, y)
t.pendown()
t.color(color, color)
star(size)
turtle.done()
Что здесь происходит:
- Фон — тёмно-синий, как ночное небо.
- Функция
star(size)рисует залитую звезду. - Цикл повторяется 15 раз.
- Каждый раз координаты, размер и цвет выбираются случайно.
- Черепашка прыгает в точку через
goto()и рисует там звезду.
Попробуй:
- Изменить количество звёзд.
- Изменить палитру (например, только золотые и белые).
- Изменить размеры (например, от 10 до 70).
- Добавить луну — большой залитый круг в углу.
Задание 1. Нарисуй залитую пятиконечную звезду со стороной 150.
Задание 2. Сделай цикл из 5 звёзд разного размера, расположенных в ряд.
Задание 3. Нарисуй звёздное поле со своими параметрами: 20 звёзд, размеры от 10 до 60, только «холодные» цвета (голубой, белый, светло-серый).
Задание 4. Добавь в звёздное поле луну — большой залитый круг в углу окна.