我的作业要求我编写一些嵌套正方形的图形表示,大小在20-80之间,如下所示:
创建第一个正方形后,我需要将位置移动到下一个正方形的起点。为此,我使用了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()
答案 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()
运行此代码时,请注意,乌龟在左上角的每个方块处开始 并开始向右绘制。
现在让我们考虑一下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
让我们看看现在会发生什么:
宾果
顺便说一下,将left
和right
和forward
之类的相对命令与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()
答案 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()
就像 drawing 一样,我们只需添加以下内容即可旋转图像:
turtle.setheading(45)
或turtle.left(45)
或turtle.right(45)
:
但与 drawing 不同,我们还可以利用turtle尚未为 drawing 实现的其他乌龟光标图形操作。例如,剪切:
turtle.shearfactor(0.5)
我确定您应该使用 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