Почему черепаха Питона заполняет это? - PullRequest
0 голосов
/ 10 октября 2019

Я не понимаю, почему эта цифра заполнена (я ожидаю, что здесь ничего не заполнено). Это не треугольник, так как я использую penup() и pendown() для перемещения черепахи без рисования края).

from turtle import *

color('black', 'yellow')
begin_fill()

forward(200)
penup()
left(120)
forward(200)
left(120)
pendown()
forward(200)
end_fill()

exitonclick()

Вот что я получаю

bad filling

Кажется penup() и pendown() игнорируются здесь, но я сделал другие примеры, которые работают как ожидалось, также используя penup и pendown. Может кто-нибудь объяснить мне, пожалуйста, алгоритм заполнения черепахи?

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Заполнение не зависит от чертежа. Вы можете проверить это в исходном коде :

self.screen._drawpoly(self._fillitem, self._fillpath, fill=self._fillcolor)

Как вы можете видеть здесь, end_fill() заботится только о _fillpath, пути черепахи, начиная с begin_fill(),Это не имеет ничего общего с рисованием.

Просто чтобы продемонстрировать, что если вы никогда ничего не рисуете (ручка все время поднимается), форма по-прежнему заполняется:

from turtle import *

color("black", "green")
begin_fill()
penup()
circle(40)
end_fill()

exitonclick()
0 голосов
/ 26 октября 2019

Спасибо за ответ. И, кроме того, кажется, что когда вызывается end_fill (), он закрывает фигуру, добавляя ребро между последней точкой и первой (созданной после begin_fill ()). Кто-нибудь может это подтвердить?

Изменить мой пример следующим образом:

from turtle import *

color('black', 'yellow')
begin_fill()

forward(200)
left(120)
forward(200)
end_fill()

exitonclick()

Хотя код рисует только 2 ребра, результатом является цветной треугольник.

enter image description here

Я ожидал, что в этом случае ничего не будет заполнено (это, очевидно, небольшая часть более крупного проекта). Чтобы избежать заполнения, думаю, что нужно закончить в той же позиции, что и я, без добавления какого-либо нового ребра. Решение, которое я вижу, заключается в обратном перемещении (в обратном порядке) вдоль созданных ребер. Вот решение (penup() / pendown() можно опустить).

from turtle import *

color('black', 'yellow')
begin_fill()

forward(200)
left(120)
forward(200)
penup()
backward(200) # reverse move
left(-120)
backward(200)
pendown()
end_fill()

exitonclick()

Вот результат

enter image description here

Оно работает. Вы видите лучший способ предотвратить заполнение?

...