Занятие № 5. Компьютерная графика в Python

Теория

Модуль turtle

Чтобы использовать модуль рисования turtle, нужно его импортировать в вашу программу. Для этого в начале программы записывается следующая инструкция:

from turtle import *

Таким образом мы из модуля turtle импортируем все функции и типы данных, которые в нём описаны (символ * как раз и означает, что импортируется всё содержимое модуля).

Работать с черепахой можно в процедурном или объектно-ориентированном стиле.

Процедурный стиль:

from turtle import *

forward(60)
left(45)
forward(60)

done()

В программу импортируются все объекты и функции для работы с черепашкой. Вызванные функции для движения и рисования выполняются созданным заранее объектом типа Turtle.

Объектно-ориентированный:

from turtle import *
# создаём объект "Черепаха"
t = Turtle() 

t.forward(60)
t.left(45)
t.forward(60)

done()

Можно самостоятельно создать объект типа 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()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      
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 направлено вверх.

Рисунок 1: Поле для рисования

Текущее расположение и направление черепах можно узнать с помощью следующих методов:

Таблица 1: Свойства черепахи
Свойство Процедурный стиль ООП стиль
Координата x Черепахи xcor() <черепаха>.xcor()
Координата y Черепахи ycor() <черепаха>.ycor()
Текущее направление Черепахи (в градусах) heading() <черепаха>.heading()

Движение черепахи

Управлять перемещением черепахи можно с помощью следующих методов:

Таблица 2: Методы для перемещения черепах
Метод Назначение
forward(<пиксели>) Движение вперёд на указанное количество пикселей в сторону, куда направлена Черепаха
backward(<пиксели>) Движение назад на указанное количество пикселей
right(<градусы>) Поворот Черепахи направо на указанное количество градусов
left(<градусы>) Поворот Черепахи налево на указанное количество градусов
goto(x, y) Переместить Черепаху в точку с координатами (x, y).

Рассмотрим команды подробнее.

  import {Tangle as Tangle} from "@mbostock/tangle"
viewof forw = EventTarget {value: 25}
forw = 25
viewof heading = EventTarget {value: -45}
heading = -45

Методы forward() и backward() двигают черепаху на заданное количество пикселей вперёд и назад относительно текущего положения и по текущему направлению:

forward(25) аналогично backward(-25)

Если черепашка до этого находилась в точке с координатами (0, 0), вызов метода xcor() вернёт нам значение, равное 25.

Если указать отрицательное число в качестве аргумента метода backward(), то черепаха .

Методы right() и left() поворачивают черепаху на заданный угол в градусах относительно текущего направления:

right(-45) аналогично left(45)

Если мы вызовем метод heading() после выполнения одной из предыдущих функций то получим значение, равное 45°.

Если вызвать метод left(370), то метод heading() вернёт значение, равное .

Нарисуем многоугольник в следующем примере, используя методы forward() и left():

from turtle import *
speed(1)
n = 5
for i in range(n):
forward(75)
left(360 // n)
done()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      
from turtle import *

speed(1)

n = 5
for i in range(n):
    forward(75)
    left(360 // n)

done()

Количество сторон будет зависеть от значения, хранящегося в переменной под именем . При этом длина одной стороны будет равна пикселей.

xy
viewof gotoX = EventTarget {value: -30}
gotoX = -30
viewof gotoY = EventTarget {value: 42}
gotoY = 42

С помощью метода goto() можно задать новые абсолютные координаты черепашки:

goto(-30, 42)

Черепашка переместиться в точку заданными координатами, а её направление не изменится. После выполнения инструкции из примера, черепашка окажется в точке с координатами (-30, 42).

Рисование

Во время движения, черепашка рисует свою траекторию движения. Для настройки пера используются следующие методы:

Таблица 3: Методы для настройки пера
Метод Назначение
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()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      
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()

Очерченный черепахой контур можно залить выбранным цветом.

Таблица 4: Методы для управления заливкой
Метод Назначение
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()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      
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()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      
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()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      
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 - координаты точки относительно которой будет рисовать фрагмент мозаики. Это пригодится нам для решения следующей задачи.

Стоит отметить, что направление черепашки после выполнения программы .

Пример № 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)
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      
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()
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      
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")
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

      
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 пикселей. Стартовая точка обозначена красной окружностью.

Среди предложенных блоков есть лишние.

from turtle import *
forward(100)
left(120)
forward(100)
left(120)
forward(100)
done()
forward(100)
done()
left(120)
left(120)
right(120)
forward(100)
left(60)
from turtle import *
forward(100)
В коде есть ошибка.