Графика в Python и задачи моделирования
3.1 Управление исполнителем "черепашка"
Исполнитель "черепашка" управляется командами относительных ("вперёд- назад" и "направо-налево") и абсолютных ("перейти в точку с координатами...") перемещений. Исполнитель представляет собой "перо", оставляющее след на плоскости рисования. Перо можно поднять, тогда при перемещении след оставаться не будет. Кроме того, для пера можно установить толщину и цвет. Все эти функции исполнителя обеспечиваются модулем turtle ("черепаха").
Приведённый ниже код создаёт графическое окно (рис. 3.1) и помещает перо ("черепашку") в исходное положение.
# -*- coding: utf-8 -*-
import turtle
# Инициализация turtle.reset() # Здесь могут быть вычисления и команды рисования # turtle._root.mainloop() # для Python 2.4.x и 2.5.x # Эта команда показывает окно, пока его не закроют turtle.mainloop() # для Python 2.6.x
Как видно из этого примера, способ вызова метода mainloop() для показа графического окна зависит от версии Python. Поэтому если не работает один вариант, смело используйте другой. В остальных примерах будет использоваться вариант для Python 2.6.
Полученное окно имеет фиксированный размер, который зависит от версии Python, перо позиционируется в центре. Идея рисования заключается в перемещении пера ("черепашки") в точки окна рисования с указанными координатами или в указанных направлениях на заданные расстояния, а также в проведении отрезков прямых, дуг и окружностей.
Текущее направление перемещение пера (соответствующее направлению "вперёд") указывается остриём стрелки изображения "черепашки".
Полный список команд управления "черепашкой" (и, соответственно, рисования), а также функций, обеспечиваемых модулем, можно получить, набрав в окне выполнения любой системы программирования на Python команду help('turtle').
Список этот довольно длинный, а среди предоставляемых функций имеются также математические, поскольку они могут быть востребованы при вычислении параметров отрезков, дуг и окружностей.
Команды, обеспечивающие рисование, приведены ниже.
| Команда | Назначение | Пример |
|---|---|---|
| up() | Поднятие "пера", чтобы не оставалось следа его при перемещении | turtle.up() |
| down() | Опускание "пера", чтобы при перемещении оставался след (рисовались линии) | turtle.down() |
| goto(x,y) | Перемещение "пера" в точку с координатами в системе координат окна рисования |
turtle.goto(50,20) |
| color ('цвет') | Установка цвета "пера" в значение, определяемое строкой цвета |
turtle.color('blue')
turtle.color('#0000ff') |
| width(n) | Установка толщины "пера" в точках экрана | turtle.width(3) |
| forward(n) | Передвижение "вперёд" (в направлении острия стрелки, см. рис. 3.1) на точек |
turtle.forward(100) |
| backward(n) | Передвижение "назад" на n точек | turtle.backward(100) |
| right(k) | Поворот направо (по часовой стрелке) на единиц |
turtle.right(75) |
| left(k) | Поворот налево (против часовой стрелки) на единиц |
turtle.left(45) |
| radians () | Установка единиц измерения углов в радианы | turtle.radians() |
| degrees () | Установка единиц измерения углов в градусы (включён по умолчанию) | turtle.degrees() |
| circle(r) | Рисование окружности радиусом точек из текущей позиции "пера". Если положительно, окружность рисуется против часовой стрелки, если отрицательно — по часовой стрелке. |
turtle.circle(40) turtle.circle(-50) |
| circle(r,k) | Рисование дуги радиусом точек и углом единиц. Вариант команды circle()
|
turtle.circle(40,45) turtle.circle(-50,275) |
| fill (flag) | В зависимости от значения flag включается (flag=1) и выключается (flag=0) режим закрашивания областей. По умолчанию выключен. | Круг:
turtle.fill(1) turtle.circle(-50) turtle.fill(0) |
| write ('строка') | Вывод текста в текущей позиции пера | turtle.write('Начало координат!') |
| tracer(flag) | Включение (flag=1) и выключение (flag=0) режима отображения указателя "пера" ("черепашки"). По умолчанию включён. | turtle.tracer(0) |
| clear() | Очистка области рисования | turtle.clear(0) |
При выключенном режиме отображения указателя "черепашки" рисование происходит значительно быстрее, чем при включённом.
Проделаем упражнение с целью определить систему координат окна рисования. Приведённый ниже код формирует картинку, показанную на рис. 3.2.
# -*- coding: utf-8 -*-
import turtle
#
turtle.reset()
turtle.tracer(0)
turtle.color('#0000ff')
#
turtle.write('0,0')
#
turtle.up()
x=-170
y=-120
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
x=130
y=100
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
x=0
y=-100
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
turtle.down()
x=0
y=100
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
turtle.up()
x=-150
y=0
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
turtle.down()
x=150
y=0
coords=str(x)+","+str(y)
turtle.goto(x, y)
turtle.write(coords)
#
turtle.mainloop()Здесь строка с координатами формируется "в лоб", путём конкатенации преобразованных в строки значений координат.
Картинка, показанная на рис. 3.3, сформирована нижеследующим кодом.
# -*- coding: utf-8 -*-
import turtle
#
turtle.reset()
turtle.tracer(0)
turtle.width(2)
#
turtle.up()
x=0
y=-100
turtle.goto(x, y)
turtle.fill(1)
turtle.color('#ffaa00')
turtle.down()
turtle.circle(100)
turtle.fill(0)
turtle.color('black')
turtle.circle(100)
turtle.up()
#
x=-45
y=50
turtle.goto(x, y)
turtle.down()
turtle.color('#0000aa')
turtle.fill(1)
turtle.circle(7)
turtle.up()
turtle.fill(0)
#
x=45
y=50
turtle.goto(x, y)
turtle.down()
turtle.color('#0000aa')
turtle.fill(1)
turtle.circle(7)
turtle.up()
turtle.fill(0)
#
x=-55
y=-50
turtle.goto(x, y)
turtle.right(4 5)
turtle.width(3)
turtle.down()
turtle.color('#aa0000')
turtle.circle(80, 90)
turtle.up()
#
turtle.right(135)
x=0
y=50
turtle.goto(x, y)
turtle.width(2)
turtle.color('black')
turtle.down()
turtle.forward(100)
#
turtle.mainloop()Для того, чтобы изобразить улыбку, потребовалось после перемещения пера в начальную точку дуги (левую) повернуть перо на 45 градусов. Дело в том, что изначально направлением "вперёд" для пера является направление вправо (как показано на рис. 3.1). Окружности и дуги рисуются как касательные к этому "вектору", начинаясь в точке с текущими координатами пера. Поэтому для улыбки потребовалось изменить направление "вектора".
Далее, перо, первоначально сориентированное на 45 градусов вправо, после прохождения дуги в 90 градусов соответственно изменило своё направление. Поэтому для получения вертикальной линии его пришлось дополнительно повернуть.
Можно поэкспериментировать с рисованием домиков, солнышка и более сложных композиций. Однако для формирования сложных кривых (например, графиков функций) с помощью этого модуля придётся многократно выполнять команду goto(x,y). В этом легко убедиться, попытавшись нарисовать, например, график параболы.
3.1.1 Задания и упражнения
- Как в примерах кода, формирующего изображения на рис. 3.2 и рис. 3.3, применить кортежи?
- Напишите код для создания изображения "домика" (квадрат под треугольником) без подъёма пера при условии однократного перемещения по каждой линии.
- Рассчитайте координаты и напишите код для создания изображения "солнца" (круг и расходящиеся от него отрезки) так, чтобы "лучи" начинались на расстоянии 2 точки от круга (не менее 8-ми лучей).
- Напишите код для построения графика степенной функции (
) с началом координат в левой нижней четверти окна рисования так, чтобы кривая проходила практически через всё окно.

в системе координат окна рисования
точек
единиц
точек из текущей позиции "пера". Если
положительно, окружность рисуется против часовой стрелки, если отрицательно — по часовой стрелке.
