在Python中打转吗?

0 投票
2 回答
1130 浏览
提问于 2025-04-17 13:47

我最近在玩Python里的turtle模块,试着修改一些别人写的代码(是Dmitri Kurilo写的)。我用这个模块画出了一个很不错的图形,形成了美丽的曲线。因为我对数学了解不多,也许你们能帮我理解一下这里发生了什么!非常感谢,下面是代码!:

import turtle, random
from math import *
def fib(n):    
    for n in range(400):
        turtle.color("black")
        turtle.right(pi*19)
        turtle.forward(n)
        if n > 400:
            break    

turtle.title("The Looping ball")
turtle.colormode(255)
turtle.color("white")
turtle.goto(0,0)
turtle.color("black")
turtle.speed(500)
fib(1)
turtle.getscreen()._root.mainloop()

2 个回答

2

这是原程序的一个更清晰的版本:

import turtle

def fib(num, rot=59.7, scale=1.0):
    for n in range(num):
        turtle.right(rot)
        turtle.forward(n*scale)

turtle.title('The Looping ball')
turtle.speed(2000)
turtle.pencolor('blue')
fib(400, rot=92, scale=0.75)
turtle.getscreen()._root.mainloop()

这个版本去掉了一些不必要的内容,并且把一些数值变成了可以调整的参数,这样提问者就可以自己尝试修改行数、每行的旋转角度和行的长度。这样做可以帮助理解每个参数的变化对结果的影响。

2
import turtle, random
from math import *

这里引入的 random 模块其实是多余的。最后只用了 turtlemath.pi

def fib(n):    
    for n in range(400):
        turtle.color("black")
        turtle.right(pi*19)
        turtle.forward(n)
        if n > 400:
            break

画一个由400条线段组成的图形,每两条线段之间的角度是59.69度(turtle模块默认使用度数),而且每条线段比前一条长一单位。这样画出来的图形几乎是一个六角螺旋(spirangle),但因为线段之间的角度不是360度的六分之一(60度),所以看起来会有点偏差。

需要注意的是,参数 n 没有被使用,因为在循环中它被重新赋值了。条件 n > 400 永远不会成立(因为 range(400) 的范围是从0到399),所以循环的最后部分没有什么值得提的内容。

现在进入主要部分:

turtle.title("The Looping ball")
turtle.colormode(255)
turtle.color("white")
turtle.goto(0,0)
turtle.color("black")
turtle.speed(500)

设置了一些窗口的参数:设置了标题,设置了 colormode(这是指定颜色值的方式;这里没有用到),画了一条白线到屏幕中心,并让海龟停在那里(最好用 turtle.penup()turtle.pendown() 来实现这个),并把绘图速度设置为最快(turtle.speed(0) 也能达到同样的效果,任何大于十的值都和 turtle.speed(0) 一样)。

fib(1)

螺旋图形被画出来了。

turtle.getscreen()._root.mainloop()

程序的控制权交给了 turtle 窗口的主事件循环。如果不这样做,窗口在绘图完成后会立即关闭。如果你“运行”主循环,程序会在窗口打开时保持运行。

撰写回答