【问题标题】:How to draw a circle using turtle in python?如何在python中使用乌龟画一个圆?
【发布时间】:2020-11-02 14:08:23
【问题描述】:

我想问一下,如何在 python 中使用 turtle.forward 和 turtle.left 绘制一个圆?我使用下面的代码:

 for i in range(30):
     turtle.forward(i)
     turtle.left(i)  
 turtle.done()

我得到的是,一旦我得到完整的圈子,这条线就不会停止。如何编码,以便我有一个特定半径的圆,并且在绘制圆后我有一个句号(不使用turtle.circle)。

【问题讨论】:

  • 如果你要画30条边,然后回到你的起点面对原来的方向,你每次要转多少度?
  • 这应该取决于边的长度吗?就像整个旋转是 360 度,然后根据边的长度,我必须弄清楚转弯的度数,这是你的意思吗?
  • 想象一下,你不前进就转弯,想在 30 步内完成一个完整的转弯,你会每一步打开多少?当您不了解情况时,从更简单的问题开始总是一个好主意;在这里,尝试分 4 步完成。如果你现在每一步都往前走,你要转多少?
  • 在你的房间里试试,然后在广场上走走。如果你做一个更大的正方形,角度会改变吗?那么你就有了答案……
  • 赋值给一个变量:steps = 10; for i in range(steps): turtle.forward(<whatever you want>); turtle.left(360/steps)

标签: python python-turtle


【解决方案1】:

我制作了这张图片作为参考,

基本上你需要绘制n边的内接多边形。

最初的转将是 ϴ/2。

然后前进 a = 2rsin(ϴ/2)。

每个 forward 后面跟着一个完整的 ϴ left 转,除了最后一个 forward 之后我们只想要一个 左转 ϴ/2 以便正确更新航向以与圆(或圆弧)相切。

类似的,

import turtle
import math

def circle2(radius,extent=360,steps=360):
    if extent<360 and steps==360:
        steps=extent
    
    theta=extent/steps
    step_size=2*radius*math.sin(math.radians(theta/2))
    turtle.left(theta/2)
    turtle.forward(step_size)
    for i in range(1,steps):
        turtle.left(theta)
        turtle.forward(step_size)
    
    turtle.left(theta/2)
    

turtle.hideturtle()
turtle.speed(0)
turtle.getscreen().tracer(False)

circle2(50)
circle2(100,180)
turtle.up()
turtle.home()
turtle.down()
circle2(130)
circle2(130,360,10)

turtle.update()
turtle.mainloop()

【讨论】:

    【解决方案2】:

    如果你想画一个圆,最好的办法就是把问题简单化,如果我们考虑为圆的每一度移动1个空间,那么我们可以简单地写成

    def draw_circle1():
        for _ in range(360):
            turtle.forward(1)
            turtle.left(1)
    

    现在我们对我们绘制的这个基本圆圈了解多少?好吧,我们知道它需要 360 步,每步是 1。所以圆的周长是 360。我们可以使用一些数学来计算半径。

    circumference = 2 * 3.14... * radius
    360 = 2 * 3.14... * radius
    360 / 2 / 3.14... = radius
    radius = 57.29...
    

    所以现在我们可以反转这个,如果我们想指定一个给定半径的圆,我们可以计算这个圆应该有什么周长。除以 360 度,我们就知道在每转 1 度之前要采取的步长。

    def draw_circle(radis):
        circumfrence = 2 * math.pi * radis
        step_size = circumfrence / 360
        for _ in range(360):
            turtle.forward(step_size)
            turtle.left(1)
    

    如果我们对 3 个单独的圆圈运行此操作,每个圆圈的大小都会增加,您会看到它给我们一个一致的结果

    draw_circle(20)
    draw_circle(40)
    draw_circle(60)
    turtle.hideturtle()
    turtle.done()
    

    所以现在我们有了一个可以接受半径并根据该半径绘制圆的函数

    【讨论】:

      【解决方案3】:

      螺旋码

      from turtle import Turtle
      import random
      
      josh = Turtle()
      josh.color('DarkRed')
      
      def random_color()->tuple:
          r = random.randint(0,255)
          g = random.randint(0,255)
          b = random.randint(0,255)
          return (r,g,b)
      
      josh.speed('fastest')
      josh.pensize(2)
      for i in range(72):
          josh.circle(100)
          josh.right(5)
          colormode(255)
          josh.pencolor(random_color())
              
      screen = Screen()
      screen.setup(800,800)
      screen.exitonclick()
      

      【讨论】:

      • 这里已经有几个答案,还有更多解释。这个答案比他们做得更好吗?请阅读How to Answer
      【解决方案4】:

      此处为示例,

      import turtle
      
      def circle(distance, sections):
          angle = 360/sections
          for i in range(1, sections+1):
              turtle.forward(distance)
              turtle.left(angle)
      
      circle(20, 30)
      turtle.done()
      

      【讨论】:

        【解决方案5】:

        使用海龟创建一个螺旋图。最终输出:

        import random
        import turtle
        
        from turtle import Turtle, Screen
        
        tim = Turtle()
        
        tim.shape('arrow')
        
        turtle.colormode(255)
        
        def random_colour( ):
            r = random.randint(0, 255)
            g = random.randint(0, 255)
            b = random.randint(0, 255)
            return (r, g, b)
        
        tim.speed('fastest')
        
        def draw_spirograph(size_of_gap):
            for _ in range(int(360/size_of_gap)):
                tim.color(random_colour())
                tim.circle(100)
                tim.setheading(tim.heading()+size_of_gap)
        
        draw_spirograph(5)
        
        screen = Screen()
        screen.exitonclick()
        

        【讨论】:

          猜你喜欢
          • 2017-01-28
          • 1970-01-01
          • 2018-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多