Python 画4个正方形,每个正方形内有一个
我想画4个正方形,每个正方形变小10个像素,进入另一个正方形 这就是我现在所拥有的 square.pyPython 画4个正方形,每个正方形内有一个,python,turtle-graphics,Python,Turtle Graphics,我想画4个正方形,每个正方形变小10个像素,进入另一个正方形 这就是我现在所拥有的 square.py def drawSquare(myTurtle,sideLength,x,y): myTurtle.setx(x) myTurtle.sety(y) for i in range(4): myTurtle.forward(sideLength) myTurtle.right(90) main.py >>> from s
def drawSquare(myTurtle,sideLength,x,y):
myTurtle.setx(x)
myTurtle.sety(y)
for i in range(4):
myTurtle.forward(sideLength)
myTurtle.right(90)
main.py
>>> from square import *
>>> import turtle
>>> t = turtle.Turtle()
>>> side = 200
>>> x = 60
>>> y = 60
>>> for i in range(4):
drawSquare(t,200,x,y)
side = side - 10
x = x- 5
y = y - 5
不幸的是,这样做的方式是4个不同的正方形相互重叠
有什么建议吗?我用递归解决这个问题,因为它可能是最简单的方法
myTurtle = turtle.Turtle()
def drawSquares(myTurtle,sideLength, x, y, nSquares, distanceApart):
if nSquares > 0:
myTurtle.pu()
myTurtle.setx(x)
myTurtle.sety(y)
myTurtle.pd()
for i in range(4):
myTurtle.forward(sideLength)
myTurtle.right(90)
drawSquares(myTurtle, sideLength - distanceApart*2, x+10, y-10, nSquares-1, distanceApart)
drawSquares(myTurtle, 200, 60, 60, 4, 10)
这个问题可以通过几种不同的方法来解决。虽然显而易见的答案似乎是嵌套循环来绘制正方形,但下面是一些其他的思考方法 首先,使用turtle.circlesteps=4。“圆”例程可以绘制任意正多边形,包括正方形,但您必须根据定位进行调整:
import turtle
def drawSquares(myTurtle, sideLength, nSquares, distanceApart):
myTurtle.penup()
x, y = myTurtle.position()
myTurtle.goto(x - sideLength/ 2, y - sideLength / 2) # adjust so current x, y is center
myTurtle.pendown()
myTurtle.setheading(-45) # by default square would be sitting on corner instead of on side
for _ in range(nSquares):
radius = sideLength * 2**0.5 / 2
myTurtle.circle(radius, steps=4)
sideLength -= 10
myTurtle.penup()
x, y = myTurtle.position()
myTurtle.goto(x + distanceApart / 2, y + distanceApart / 2)
myTurtle.pendown()
yertle = turtle.Turtle()
yertle.penup()
yertle.goto(60, 60)
yertle.pendown()
drawSquares(yertle, 200, 4, 10)
turtle.done()
对于我剩下的示例,我将假设相同的调用代码,并且只展示修改后的drawSquares例程。我相信@PVNRT的递归解决方案非常优秀,尽管我会对其进行如下微调:
def drawSquares(myTurtle, sideLength, nSquares, distanceApart):
if nSquares < 1:
return
for _ in range(4):
myTurtle.forward(sideLength)
myTurtle.left(90)
myTurtle.penup()
x, y = myTurtle.position()
myTurtle.goto(x + distanceApart / 2, y + distanceApart / 2)
myTurtle.pendown()
drawSquares(myTurtle, sideLength - distanceApart, nSquares - 1, distanceApart)
最后,一个显而易见的解决方案是使用嵌套循环,但现在你已经看到了其他方法,这一点就不那么明显了:
def drawSquares(myTurtle, sideLength, nSquares, distanceApart):
for n in range(nSquares):
for _ in range(4):
myTurtle.forward(sideLength)
myTurtle.left(90)
myTurtle.penup()
x, y = myTurtle.position()
myTurtle.goto(x + distanceApart / 2, y + distanceApart / 2)
myTurtle.pendown()
sideLength -= distanceApart
OP规范中的一个弱点是x&y参数的含义。我忽略了它们,因为它们是在当前的x&y位置绘制的。OP将它们视为图纸的右上角,这与turtle中的任何内容都不一致。我选择将它们设置为圆的左下角或圆心,并使用基于戳记的解决方案。您还需要在绘制正方形之间移动海龟的起点。这叫什么?我在文档中找不到它…调用了什么?移动被调用海龟起点的函数是什么?因为如果我能找到它,我就不需要再改变x和y了,我建议你重新阅读文档,其中包括几个你可以使用的选项:我喜欢这个解决方案+1,但是你已经使平方之间的间隙是OP指定的两倍,并且没有将distanceparate作为递归x和y计算的一部分,而是使用硬编码值10。
def drawSquares(myTurtle, sideLength, nSquares, distanceApart):
for n in range(nSquares):
for _ in range(4):
myTurtle.forward(sideLength)
myTurtle.left(90)
myTurtle.penup()
x, y = myTurtle.position()
myTurtle.goto(x + distanceApart / 2, y + distanceApart / 2)
myTurtle.pendown()
sideLength -= distanceApart