【问题标题】:Turtle X drawing simplificationTurtle X 绘图简化
【发布时间】:2017-03-25 20:09:59
【问题描述】:

只需创建一个 python 程序,该程序会创建一个名为 letterX 的函数,它......很好地制作了一个 X。两条线必须彼此成 90 度。指针在初始位置结束。

我很容易解决了这个问题,只是想知道你是否可以将它放入一个循环中或只是简化它。我不知道怎么做,因为我必须以不同的方式改变方向,而不是循环遍历相同的代码。任何帮助将不胜感激。

import turtle
t = turtle.Turtle()
s = turtle.Screen()

def letterX(t,length):
    t.down()
    t.right(45)
    t.forward(length/2)
    t.right(180)
    t.forward(length)
    t.right(180)
    t.forward(length/2)
    t.left(90)
    t.forward(length/2)
    t.right(180)
    t.forward(length)
    t.right(180)
    t.forward(length/2)
    t.right(45)
    t.up()
letterX(t,100)

【问题讨论】:

    标签: python turtle-graphics


    【解决方案1】:

    就个人而言,我将海龟效率衡量为最小化绘制——你的海龟正在重绘它已经绘制的东西,所以让我们优化一下:

    def letterX(t, length):
    
        half_length = length / 2
        hypotenuse = (2 * half_length**2)**0.5
    
        t.pendown()
        t.right(45)
        t.forward(half_length)
        t.left(135)
    
        t.penup()
        t.forward(hypotenuse)
        t.pendown()
    
        t.left(135)
        t.forward(length)
        t.right(135)
    
        t.penup()
        t.forward(hypotenuse)
        t.pendown()
    
        t.right(135)
        t.forward(half_length)
        t.left(45)
        t.penup()
    

    但是,如果您真的想要最少的代码和循环,请考虑:

    def letterX(t, length):
    
        for angle in range(-135, 136, 90):
            mock = t.clone()
            mock.left(angle)
            mock.forward(length / 2)
            mock.hideturtle()
    

    如果您正在寻找速度和真正神秘的代码,请考虑标记:

    def letterX(t, length):
    
        t.shapesize(length / 10, 1 / 10)  # assuming default turtle image
    
        for angle in range(-45, 91, 135):
            t.tilt(angle)
            t.stamp()
    
        t.tilt(-45)
        t.shapesize(1)
    

    【讨论】:

      【解决方案2】:

      关键是找出可重复的单位。由于您希望在所有单位后恢复海龟,因此在每个单位后恢复它是最简单的。

      import turtle
      t = turtle.Turtle()
      s = turtle.Screen()
      
      def line(t, length, angle):
          half = length/2
          t.left(angle)
          t.forward(half)
          t.right(180)
          t.down()
          t.forward(length)
          t.up()
          t.right(180)
          t.forward(half)
          t.right(angle)
      
      def letterX(t,length):
          for angle in (45, 135):
              line(t, length, angle)
      
      letterX(t,100)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-08
        • 2016-07-20
        • 2016-11-20
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        • 1970-01-01
        • 2017-09-23
        相关资源
        最近更新 更多