为什么Python的乌龟会填满这个?

时间:2019-10-10 08:02:01

标签: python turtle-graphics

我不明白为什么要填写这个数字(我希望这里没有填写)。 它不是三角形,因为我使用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()似乎被忽略了,但我做了其他示例,它们在使用penuppendown的同时也可以正常工作。 有人可以解释一下乌龟的填充算法吗?

2 个答案:

答案 0 :(得分:1)

填充与图形无关。您可以在source code中进行检查:

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

答案 1 :(得分:0)

谢谢您的回答。此外,似乎在调用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

有效。您是否看到一种更好的方法来防止填充?