Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 画4个正方形,每个正方形内有一个_Python_Turtle Graphics - Fatal编程技术网

Python 画4个正方形,每个正方形内有一个

Python 画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

我想画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 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