Python:turtle goto()命令

时间:2018-11-07 18:35:02

标签: python turtle-graphics goto

我的作业要求我编写一些嵌套正方形的图形表示,大小在20-80之间,如下所示:

enter image description here

创建第一个正方形后,我需要将位置移动到下一个正方形的起点。为此,我使用了goto()命令。我的问题是goto()命令,因为我在水平和垂直输入中使用了两个变量,但是一次只能使用其中一个-我需要它们都起作用。任何帮助将不胜感激。

#Draw a set of nested squares, increasing in size
from turtle import *

number_of_shapes = 4

for shape in range(1, number_of_shapes + 1):
    #Draw a square
    for sides in range(1,5):
        forward(20 + shape * 10)
        right(90)

#Move to position of next square
    penup()
    goto(shape * 10, shape * 10)
    pendown()

3 个答案:

答案 0 :(得分:1)

关于Python的一大优点是可以很容易地在解释器中测试一小段代码。让我们使用解释器检查边的长度:

In [82]: number_of_shapes = 4

In [83]: for shape in range(1, number_of_shapes + 1):
   ....:     print(20 + shape * 10)
30
40
50
60

糟糕。现在我们可以清楚地看到forward(20 + shape * 10)不会使边的长度分别为20、40、60和80。请注意,(20 + shape * 10)会使边的长度增加10。我们希望将边的长度增加20 ,请改用(20 + shape * 20)

In [84]: for shape in range(1, number_of_shapes + 1):
   ....:     print(20 + shape * 20)
   ....: 
40
60
80
100

糟糕,我理解错了。没问题,我们只需要将整个内容减少20:

In [85]: for shape in range(1, number_of_shapes + 1):
   ....:     print(shape * 20)
   ....: 
20
40
60
80

啊,好多了。


所以现在代码看起来像这样:

import turtle

number_of_shapes = 4

for shape in range(1, number_of_shapes+1):
    #Draw a square
    for sides in range(4):
        turtle.forward(20 + shape * 20)
        turtle.right(90)

    #Move to position of next square
    turtle.penup()
    turtle.goto(shape * 10, shape * 10)
    turtle.pendown()
turtle.mainloop()

enter image description here

运行此代码时,请注意,乌龟在左上角的每个方块处开始 并开始向右绘制。


现在让我们考虑一下goto(shape * 10, shape * 10)语句。它带我们去哪里?让我们使用解释器来找出:

In [87]: for shape in range(1, number_of_shapes + 1):
   ....:     print(shape * 10, shape * 10)
   ....: 
10 10
20 20
30 30
40 40

将这些坐标与上面的结果进行比较,您可以看到乌龟正在向上和向右移动。每个正方形的左上角从较高的位置开始,向右的位置开始一点。取而代之的是,我们希望每个新方块的左上角开始都高一点,然后向左

In [88]: for shape in range(1, number_of_shapes + 1):
   ....:     print(-shape * 10, shape * 10)
   ....: 
-10 10
-20 20
-30 30
-40 40

让我们看看现在会发生什么:

enter image description here

宾果


顺便说一下,将leftrightforward之类的相对命令与goto之类的绝对命令混合在一起需要进行协调。数学很挑剔。 如果您坚持使用纯粹相对的命令,则不必费心思考正确设置goto坐标公式:

turtle.penup()
turtle.left(90)
turtle.forward(10)
turtle.left(90)
turtle.forward(10)
turtle.left(180)
turtle.pendown()

使用纯相对命令的优点是,现在您可以将海龟放置在任何需要的位置,并且具有任何初始标题,并且仍然可以绘制嵌套的正方形:

import turtle

number_of_shapes = 4
turtle.setheading(45)
turtle.penup()
turtle.goto(20, 50)
turtle.pendown()
for shape in range(1, number_of_shapes+1):
    #Draw a square
    for sides in range(4):
        turtle.forward(20 + shape * 20)
        turtle.right(90)

    #Move to position of next square
    turtle.penup()
    turtle.left(90)
    turtle.forward(10)
    turtle.left(90)
    turtle.forward(10)
    turtle.left(180)
    turtle.pendown()
turtle.mainloop()

enter image description here

答案 1 :(得分:0)

这个简单的几何形状是冲压绘图更简单和更快的完美示例:

from turtle import Screen, Turtle

NUMBER_OF_SHAPES = 4
CURSOR_SIZE = 20  # cursor sized relative to this starting size

screen = Screen()

turtle = Turtle('square', visible=False)
turtle.color('black', 'white')  # pencolor, fillcolor
turtle.penup()

for shape in range(NUMBER_OF_SHAPES - 1, -1, -1):  # from large to small
    turtle.shapesize((20 + shape * 20) / CURSOR_SIZE)
    turtle.stamp()

screen.mainloop()

enter image description here

就像 drawing 一样,我们只需添加以下内容即可旋转图像:

turtle.setheading(45)

turtle.left(45)turtle.right(45)

enter image description here

但与 drawing 不同,我们还可以利用turtle尚未为 drawing 实现的其他乌龟光标图形操作。例如,剪切

turtle.shearfactor(0.5)

enter image description here

我确定您应该使用 drawing 解决此问题,但是当您转到自己的程序时,请记住 stamping 作为一些简单的几何形状更简单更快 flexible 解决方案。

答案 2 :(得分:-1)


import turtle
from turtle import *
speed()
a=50
x=-15
y=15
for i in range(7):
  for n in range (4):
    forward(a)
    right(90)
  penup()
  goto(x,y)
  pd()
  a+=10
  x-=5
  y+=5