【问题标题】:Drawing 4 squares inside each other在彼此内部绘制 4 个正方形
【发布时间】:2015-01-29 14:49:00
【问题描述】:

我想画 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 个不同的正方形相互重叠

有什么建议吗?

【问题讨论】:

  • 您还需要在绘制正方形之间移动海龟的起点。
  • 那叫什么?我在文档中找不到它
  • ...什么叫什么?
  • 移动海龟起点的函数叫什么?因为如果我能找到它,我就不需要再改变 x 和 y 了
  • 我建议您重新阅读文档,其中包括您可以使用的几个选项:docs.python.org/2/library/turtle.html#turtle-methods

标签: python turtle-graphics


【解决方案1】:

我使用递归来解决这个问题,因为它可能是最简单的方法。

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)

【讨论】:

  • 我喜欢这个解决方案 (+1),但是您已经使正方形之间的“间隙”是 OP 指定的两倍,并且未能使用 distanceApart 作为递归 x 和 @987654324 的一部分@ 计算,而不是使用硬编码值 10。
【解决方案2】:

可以使用turtle 以几种不同的方式解决这个问题。虽然显而易见的答案似乎是使用嵌套循环来绘制正方形,但下面是一些其他的思考方式。

首先,使用turtle.circle(steps=4)。 circle 例程可以绘制任意正多边形,包括正方形,但您必须针对定位进行调整:

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 的 recursive 解决方案非常好,尽管我会稍微调整如下:

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(yourTurtle, sideLength, nSquares, distanceApart):
    myTurtle = yourTurtle.clone()  # clone turtle so we don't have to restore changes

    myTurtle.shape("square")  # modify turtle shape for stamping
    myTurtle.fillcolor(turtle.bgcolor())  # modify turtle fill color for stamping

    for _ in range(nSquares):
        myTurtle.turtlesize(sideLength / 20)  # magic number 20 is default stamp size
        myTurtle.stamp()
        sideLength -= 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中的任何内容都不一致。我选择将它们设为左下角或中心(对于基于圆形和冲压的解决方案)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2021-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多