我目前正在做一个需要创建科赫雪花的项目。我决定使用乌龟来完成这项任务。用户可以输入一个“命令”来确定三角形的边数。我遇到了一个问题,从像“6”这样的更高阶开始,三角形上的线条变得如此模糊,所以我什至看不到它是否有效。有没有办法来解决这个问题?我的一个解决方案是,如果用户可以放大,他们可能会更清楚地了解细节。
代码:
import turtle
from turtle import \*
from turtle import Screen
t = turtle.Turtle()
turtle.tracer(False)
screen = Screen()
def draw_kochs(length, n):
if (n == 0):
t.forward(length)
else:
n = n - 1
length = length / 3
draw_kochs(length, n)
t.right(60)
draw_kochs(length, n)
t.left(120)
draw_kochs(length, n)
t.right(60)
draw_kochs(length, n)
t.penup()
t.setposition(0, 0)
t.pendown()
t.speed(10)
order = screen.textinput("Order Number", "Please Enter Order Number")
order = int(order)
order = order - 1
for x in range(3):
draw_kochs(200, order)
t.left(120)
input()
我试图在网上找到其他答案,但发现对 turtle 的支持很少。
如果模糊,你应该增加区域的大小。 — 不是通过放大,而是通过
turtle.screensize()
: 设置像素数
import turtle
# Get the current value (in Pixels)
print(turtle.screensize())
=> (300,300)
# Set a higher value:
turtle.screensize(canvwidth=600, canvheight=600, bg="white")
但请注意,要计算更多的像素(一个区域由 x² 计算)会降低执行速度。
这在 turtle 中可能很棘手,因为我们想要实现缩放的两个功能,
setworldcoordinates()
和 screensize()
不能很好地一起玩。下面是一个仅使用 setworldcoordinates()
的简化示例。分形画好后,点击窗口继续放大它的一个角:
from turtle import Screen, Turtle
WIDTH, HEIGHT = 500, 500
def draw_kochs(length, n):
if n == 0:
turtle.forward(length)
else:
n -= 1
length /= 3
draw_kochs(length, n)
turtle.right(60)
draw_kochs(length, n)
turtle.left(120)
draw_kochs(length, n)
turtle.right(60)
draw_kochs(length, n)
adjust = 2
def zoom(x, y):
global adjust
adjust += 1
screen.setworldcoordinates(-WIDTH/adjust, -HEIGHT/adjust, WIDTH/adjust, HEIGHT/adjust)
screen = Screen()
screen.setup(WIDTH, HEIGHT)
order = screen.numinput("Order Number", "Please Enter Order Number:", minval=1, maxval=10)
screen.setworldcoordinates(-WIDTH/adjust, -HEIGHT/adjust, WIDTH/adjust, HEIGHT/adjust) # initial null change
screen.tracer(False)
turtle = Turtle()
turtle.hideturtle()
for _ in range(3):
draw_kochs(200 * order, order)
turtle.left(120)
screen.update()
screen.onclick(zoom)
screen.mainloop()
要在放大的分形中四处移动,我们需要
screensize()
,这又不能很好地与setworldcoordinates()
一起玩。为了解决这个问题,我们必须实现我们自己的可扩展坐标功能,折腾setworldcoordinates()
并使用screensize()
创建一个大的支持图像存储来滚动。