Лаборатория линуксоида

Методы fillcolor, begin_fill и end_fill модуля turtle языка Python. Заливка фигур

из модуля turtle:
  • teleport ‒ телепорт
  • goto ‒ перейти
  • forward ‒ вперед
  • backward ‒ назад
  • left ‒ налево
  • right ‒ направо
  • write ‒ писать, записывать
  • stamp ‒ штамп, печать, отпечаток
  • shape ‒ форма, вид, облик, фигура
  • turtle ‒ черепаха
  • pensize ‒ размер (size) пера (pen)
  • pencolor ‒ цвет (color) пера (pen)
  • fillcolor ‒ цвет (color) заливки (filling)
  • color ‒ цвет
  • begin_fill ‒ начать (begin) заполнение (fill)
  • end_fill ‒ конец (end) заполнения (fill)
  • shapesize ‒ размер (size) фигуры (shape)

На прошлом уроке вы могли заметить, что при смене цвета пера заливка самой черепашки не меняется. Неважно, отображается она в виде стрелки или черепахи. Ее контур соответствует цвету пера, а внутри она остается черной.

Это связано с тем, что в черепашьей графике языка Python есть возможность менять не только цвет пера, но и заливки. Делается это с помощью функции fillcolor, которой передают цвет аналогично pencolor (название цвета, RGB-код или hex-код).

Заливка черепахи
shapesize(3)
stamp()

teleport(100, 0)
pencolor('yellow')
fillcolor('green')
stamp()

left(90)
teleport(100, 100)
fillcolor('#abcdef')
shape('turtle')

В коде выше с помощью команды shapesize устанавливается размер черепахи. Мы его увеличиваем, чтобы было лучше видно.

Модуль turtle так настроен, что по-умолчанию заливается только фигура исполнителя-черепахи. Когда она рисует фигуры, они не заливаются, даже если вы вызывали в коде fillcolor. Чтобы заливка срабатывала, требуются специальные методы: begin_fill и end_fill. Рассмотрим такую программу:

fillcolor('pink')

teleport(-200, -30)
forward(100)
left(120)
forward(100)
write(1)
left(120)
forward(100)

begin_fill()
setheading(0)
teleport(-50, -30)
forward(100)
left(120)
forward(100)
write(2)
left(120)
forward(100)
end_fill()

setheading(0)
teleport(100, -30)
forward(100)
left(120)
forward(100)
write(3)
left(120)
forward(100)

Здесь заливается только второй треугольник, потому что только его код обрамляют команды begin_fill и end_fill. Так, например, если end_fill переместить в конец программы, то раскрашенными будут второй и третий треугольники.

В turtle, чтобы заливка сработала, фигура не обязательно должна быть замкнутой, то есть представлять собой многоугольник. Это может быть просто ломаная линия.

fillcolor('orange')
begin_fill()

teleport(-100, 50)
forward(200)

teleport(-100, 0)
forward(100)
teleport(10, 0)
right(10)
forward(100)

left(10)
teleport(-100, -50)
forward(100)
right(10)
forward(100)

end_fill()

В примере выше заливается только третья фигура, потому что только она подходит под определение ломаной ‒ фигуры, состоящей из последовательно соединенных друг за другом отрезков, не лежащих на одной прямой. По всей видимости модуль turtle "в уме" соединяет крайние концы по прямой и заливает пространство внутри этого недостроенного нами многоугольника.

Сложнее предсказать заливку или получить желаемое, когда ломаная самопересекающаяся или таковой получается, когда turtle ее достраивает до многоугольника.

pensize(3)
pencolor('green')
fillcolor('lightblue')
teleport(-100, 50)

begin_fill()
forward(100)
right(90)
forward(100)
right(90)
backward(100)
end_fill()

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

Заливка срабатывает и при поднятом пере. В этом случае отсутствует контур фигуры.

fillcolor('lightgreen')
teleport(-100, 50)
penup()

begin_fill()
forward(150)
right(90)
forward(100)
right(90)
forward(150)
end_fill()

Также сделать фигуру однотонной можно, установив одинаковый цвет для пера и заливки. Наиболее краткий способ это сделать ‒ использовать еще один метод ‒ color. Например, инструкция color('lightgreen') сделает и перо, и заливку светлозелеными.

Если в функцию color передать два разных цвета, то первый из них определит цвет пера, второй ‒ заливку. Это удобнее, чем вызывать pencolor и fillcolor, когда надо изменить не одну, а обе характеристики.

Задания для самостоятельной работы

  1. Выведите с помощью черепахи пятиконечную звезду, когда при рисовании отрезки пересекают друг друга. В код добавьте команды ее заливки. Какой окажется середина звезды?
  2. Запрограммируйте рисунок раскрашенного домика.
  3. Напишите код, при выполнении которого внутри залитой цветом фигуры появляется белое пятно.