【问题标题】:Turtling around in Python?在 Python 中翻来覆去?
【发布时间】:2013-01-26 22:25:21
【问题描述】:

我发现自己在 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()

【问题讨论】:

    标签: python math module turtle-graphics


    【解决方案1】:
    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 模块默认使用度数),每条线段比前一条线长一个单位。这应该几乎会导致 6 角 spirangle,但因为线段之间的角度不是整圈的六分之一(60 度),所以会稍微偏离。

    请注意,参数n 未使用,因为它被循环中的n 覆盖。条件n > 400 永远不会达到(因为range(400) 的范围是从0 到400),所以循环的最后一部分没有什么值得一提的。

    现在是主要部分:

    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) 会做同样的事情,大于 10 的任何事情都与turtle.speed(0) 相同)。

    fib(1)
    

    螺旋被画出来了。

    turtle.getscreen()._root.mainloop()
    

    程序的控制权交给turtle 屏幕的主事件循环。如果您不这样做,窗口将在完成绘图后立即关闭。如果你“运行”主循环,只要窗口打开,它就会让程序保持活动状态。

    【讨论】:

      【解决方案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()
      

      这删除了一些不必要的东西并参数化了一些值,因此 OP 可以使用行数、每行之前的旋转和行的长度。这有助于了解每个参数如何改变事物。

      【讨论】:

      • 为什么你认为turtle.speed(2000)turtle.speed(500) 有所改进? turtle.getscreen()._root.mainloop() 到底是什么?只需turtle.Screen().mainloop() 即可。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      相关资源
      最近更新 更多