【问题标题】:How to gradually erase the path traced by turtle in python?如何在python中逐渐擦除turtle追踪的路径?
【发布时间】:2020-09-09 05:35:11
【问题描述】:

我一直在使用 python turtle 制作一些程序,我想在其中查看 turtle 跟踪的路径。我知道 turtle.penup() 使海龟升起,turtle.clear() 清除所有内容,但这不是我想要的,我希望乌龟追踪的路径逐渐消失,直到它被抹去,那么有什么办法可以实现吗?

【问题讨论】:

    标签: python graphics turtle-graphics


    【解决方案1】:

    我希望海龟追踪的路径逐渐消失,直到它变得 擦掉了,有什么办法可以实现吗?

    turtle 没有内置任何东西来支持这一点。下面是我使用大量海龟和计时器对渐变的粗略模拟:

    from turtle import Screen, Turtle
    
    PEN_WIDTH = 5
    SEGMENTS_PER_LINE = 12
    MILLISECONDS_PER_FADE = 500
    AMOUNT_PER_FADE = 0.05
    
    def fade_forward(t, distance):
        stride = delta = distance / SEGMENTS_PER_LINE
        heading = t.heading()
    
        while stride < distance:
            position = t.position()
            t.forward(delta)
    
            fader = faders.pop() if faders else fader_prototype.clone()
            fader.setheading(heading)
            fade(fader, position, delta)
    
            t.clear()
            stride += delta
    
    def fade(f, position, distance, shade=0.0):
        screen.tracer(False)
        f.clear()
    
        if shade < 1.0:
            f.pencolor(shade, shade, shade)
            f.setposition(position)
            f.pendown()
            f.forward(distance)
            f.penup()
    
            shade += AMOUNT_PER_FADE
            screen.ontimer(lambda: fade(f, position, distance, shade), MILLISECONDS_PER_FADE)
        else:
            faders.append(f)
    
        screen.tracer(True)
    
    faders = []
    
    screen = Screen()
    
    fader_prototype = Turtle()
    fader_prototype.hideturtle()
    fader_prototype.speed('fastest')
    fader_prototype.width(PEN_WIDTH)
    fader_prototype.penup()
    
    turtle = Turtle()
    turtle.shape('turtle')
    turtle.width(PEN_WIDTH)
    turtle.penup()
    turtle.setposition(-170, -125)
    turtle.pendown()
    
    for _ in range(10):
        fade_forward(turtle, 340)
        turtle.left(126)
        fade_forward(turtle, 400)
        turtle.left(126)
    
    screen.exitonclick()
    

    【讨论】:

      【解决方案2】:

      看看这个,来自turtledemo源代码:

      from turtle import Screen, Turtle, mainloop
      from time import perf_counter, sleep
      
      def mn_eck(p, ne,sz):
          turtlelist = [p]
          #create ne-1 additional turtles
          for i in range(1,ne):
              q = p.clone()
              q.rt(360.0/ne)
              turtlelist.append(q)
              p = q
          for i in range(ne):
              c = abs(ne/2.0-i)/(ne*.7)
              # let those ne turtles make a step
              # in parallel:
              for t in turtlelist:
                  t.rt(360./ne)
                  t.pencolor(1-c,0,c)
                  t.fd(sz)
      
      def main():
          s = Screen()
          s.bgcolor("black")
          p=Turtle()
          p.speed(0)
          p.hideturtle()
          p.pencolor("red")
          p.pensize(3)
      
          s.tracer(36,0)
      
          at = perf_counter()
          mn_eck(p, 36, 19)
          et = perf_counter()
          z1 = et-at
      
          sleep(1)
      
          at = perf_counter()
          while any([t.undobufferentries() for t in s.turtles()]):
              for t in s.turtles():
                  t.undo()
          et = perf_counter()
          return "runtime: %.3f sec" % (z1+et-at)
      
      
      if __name__ == '__main__':
          msg = main()
          print(msg)
          mainloop()
      

      【讨论】:

      • 谢谢!如果你能告诉我while any([t.undobufferentries() for t in s.turtles()]):是什么,那就太棒了。
      • 如果可迭代对象的任何元素为 True,则 any() 函数返回 True。如果不是,则 any() 返回 False。这意味着,一旦列表的元素清空,我们就会跳出 while 循环。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-13
      • 2012-10-23
      • 1970-01-01
      • 2012-06-25
      • 2017-11-11
      • 1970-01-01
      相关资源
      最近更新 更多