Занятие № 5. Компьютерная графика в Python
Теория
Модуль turtle
Чтобы использовать модуль рисования turtle
, нужно его импортировать в вашу программу. Для этого в начале программы записывается следующая инструкция:
Таким образом мы из модуля turtle
импортируем все функции и типы данных, которые в нём описаны (символ *
как раз и означает, что импортируется всё содержимое модуля).
Работать с черепахой можно в процедурном или объектно-ориентированном стиле.
Процедурный стиль:
В программу импортируются все объекты и функции для работы с черепашкой. Вызванные функции для движения и рисования выполняются созданным заранее объектом типа Turtle
.
Объектно-ориентированный подход полезен в том случае, когда для рисования используют две и больше черепашек:
from turtle import * alice = Turtle() # черепаха alice bob = Turtle() # черепаха bob # указываем для каждой черепахи # свой набор действий alice.forward(60) alice.write("Я - alice") bob.right(180) bob.forward(60) bob.write("Я - bob") done()
Черепаха обладает рядом свойств: координаты на плоскости в которых она находится, курс - куда направлена её голова. Изначально черепаха появляется в точке с координатами (0, 0) и повёрнута вправо. Само поле для рисования представляет собой координатную плоскость, начало координат находится в центре окна, положительное направление оси x направлено вправо, положительное направление оси y направлено вверх.
Текущее расположение и направление черепах можно узнать с помощью следующих методов:
Свойство | Процедурный стиль | ООП стиль |
---|---|---|
Координата x Черепахи | xcor() |
<черепаха>.xcor() |
Координата y Черепахи | ycor() |
<черепаха>.ycor() |
Текущее направление Черепахи (в градусах) | heading() |
<черепаха>.heading() |
Движение черепахи
Управлять перемещением черепахи можно с помощью следующих методов:
Метод | Назначение |
---|---|
forward(<пиксели>) |
Движение вперёд на указанное количество пикселей в сторону, куда направлена Черепаха |
backward(<пиксели>) |
Движение назад на указанное количество пикселей |
right(<градусы>) |
Поворот Черепахи направо на указанное количество градусов |
left(<градусы>) |
Поворот Черепахи налево на указанное количество градусов |
goto(x, y) |
Переместить Черепаху в точку с координатами (x, y). |
Рассмотрим команды подробнее.
Если указать отрицательное число в качестве аргумента метода backward()
, то черепаха
x
поедет вперёд.
Если вызвать метод left(370)
, то метод heading()
вернёт значение, равное
x
?
10°.
Нарисуем многоугольник в следующем примере, используя методы forward()
и left()
:
from turtle import * speed(1) n = 5 for i in range(n): forward(75) left(360 // n) done()
Количество сторон будет зависеть от значения, хранящегося в переменной под именем
x
?
. При этом длина одной стороны будет равна
x
?
пикселей.
Рисование
Во время движения, черепашка рисует свою траекторию движения. Для настройки пера используются следующие методы:
Метод | Назначение |
---|---|
pensize(<пиксели>) |
Изменяем толщину линии |
penup() |
Поднимаем перо. С этого момента линия не рисуется |
pendown() |
Опускаем перо. С этого момента линия рисуется |
pencolor(<цвет>) |
Меняем цвет пера. Метод может принимать строковый аргумент <цвет> - название одного из встроенных цветов |
from turtle import * # список цветов colors = ["green", "orange", "blue", "indigo", "teal"] for i in range(40): # толщина линии зависит от итерации цикла pensize(i) # циклически меняем цвет линии: 0,1,2,3,4,0,1,2... pencolor(colors[i % 5]) # с каждой итерацией увеличиваем длину стороны forward(i * 2) left(35) done()
Очерченный черепахой контур можно залить выбранным цветом.
Метод | Назначение |
---|---|
fillcolor(<цвет>) |
Выбираем цвет заливки |
begin_fill() |
Обозначаем начало контура |
end_fill() |
Обозначаем конец контура. Если контур не замкнут, то две крайние точки соединяться отрезком |
from turtle import * speed(1) fillcolor("blue") begin_fill() # начало заливки n = 5 for i in range(n): forward(75) left(360 // n) end_fill() # конец заливки done()
Библиотека цветов
На сайте trinket.io есть интерактивная библиотека цветов. Кликните на желаемый цвет и скопируйте его название, чтобы использовать его в методах pencolor()
и fillcolor()
.
Примеры
Пример № 1 (ex01.py)
Изобразите следующий фрагмент мозаики. Стартовая точка обозначена красным цветом:
Первый вариант решения
Нарисуем линии относительно текущей позиции черепашки.
from turtle import * speed(2) forward(60) left(135) forward(85) right(135) forward(60) right(135) forward(85) left(135) done()
Второй вариант решения
Используем метод goto()
для перемещения черепашки по заданным координатам.
from turtle import * speed(2) x = 0 y = 0 goto(x + 60, y + 0) goto(x + 0, y + 60) goto(x + 60, y + 60) goto(x + 0, y + 0) done()
В этом случае добавляем переменные x
и y
- координаты точки относительно которой будет рисовать фрагмент мозаики. Это пригодится нам для решения следующей задачи.
Стоит отметить, что направление черепашки после выполнения программы x не поменялось.
Пример № 2 (ex02.py)
На основе фрагмента нарисуйте мозаику целиком:
Первый вариант решения
from turtle import * speed(2) w = 3 # ширина h = 2 # высота for x in range(0, 60 * w, 60): for y in range(0, 60 * h, 60): penup() goto(x, y) pendown() forward(60) left(135) forward(85) right(135) forward(60) right(135) forward(85) left(135) done()
Второй вариант решения
from turtle import * speed(2) w = 3 h = 2 for x in range(0, 60 * w, 60): for y in range(0, 60 * h, 60): penup() goto(x, y) pendown() goto(x + 60, y + 0) goto(x + 0, y + 60) goto(x + 60, y + 60) goto(x + 0, y + 0) done()
Пример № 3 (ex03.py)
Создайте следующее изображение с помощью черепашки.
from turtle import * speed(1) fillcolor("gray") begin_fill() forward(130) left(90) forward(100) left(90) forward(130) left(90) forward(100) left(90) end_fill() penup() goto(70, 20) pendown() fillcolor("blue") begin_fill() circle(30) end_fill() penup() goto(70, 30) pendown() fillcolor("white") begin_fill() circle(20) end_fill() penup() goto(20, 60) pendown() fillcolor("blue") begin_fill() circle(10) end_fill() penup() goto(10, 100) pendown() goto(20, 120) goto(40, 120) goto(50, 100) done()
Задания для самостоятельной работы
Задание № 1 (sam01.py)
Составьте из предложенных блоков программу для рисования равностороннего треугольника с длинной стороны 100 пикселей. Стартовая точка обозначена красной окружностью.
Среди предложенных блоков есть лишние.
left(60)
forward(100)
forward(100)
forward(100)
left(120)
right(120)
left(120)
from turtle import *
done()
В коде есть ошибки