使用Python的turtle模块绘制此图案。一些正方形彼此重叠,但像螺旋一样倾斜

时间:2019-06-14 00:16:48

标签: python turtle-graphics

我是编程的新手,正在读一本书,名为《如何像计算机科学家一样思考》。在第四章中,讨论了功能。

本章末尾有一个练习,要求我使用Python的turtle模块绘制以下模式。

enter image description here

我正在查看这张图片,并决定将其分成两部分:1)中间的线和2)像螺旋形一样彼此重叠的正方形。

我使用以下代码绘制了第一部分:

import turtle

wn = turtle.Screen()  # Set up the window
wn.bgcolor("lightgreen")

alex = turtle.Turtle()  # Create Alex
alex.color("blue")
alex.pensize(3)

for i in range(20):  # Here I start drawing the lines
    alex.forward(100)
    alex.backward(100)
    alex.left(360/20)  # Fit 20 lines in the 360 degree circle

wn.mainloop()

当我运行它时,它绘制如下:

enter image description here

然后,我创建了draw_square函数并设法绘制了第一个正方形:

import turtle


def draw_square(turtle, size):
    for i in range(4):
        turtle.forward(size)
        turtle.left(90)


wn = turtle.Screen()  # Set up the window
wn.bgcolor("lightgreen")

alex = turtle.Turtle()  # Create Alex
alex.color("blue")
alex.pensize(3)

for i in range(20):  # Here I start drawing the lines
    alex.forward(100)
    alex.backward(100)
    alex.left(360/20)  # Fit 20 lines in the 360 degree circle

# In a messy way, using what I've learned, I move Alex to where he's supposed to be now
# I'm pretty sure there's a classier way to do this
alex.penup()
alex.backward(100)
alex.right(90)
alex.forward(100)
alex.left(90)
alex.pendown()

# Here I get Alex to draw the square
draw_square(alex, 200)

wn.mainloop()

当我运行它时,它绘制如下:

enter image description here

现在我被困住了。我不知道从这里去哪里。我不知道如何绘制所有其他正方形。我不知道将乌龟放在哪里,以及不知道将正方形倾斜多少度(可能像直线一样倾斜20度,但我不知道如何实现)……不管怎么说,你们有什么建议吗?有什么建议吗?

我正努力不跳过这本书上的任何练习,而这让我受益匪浅。

1 个答案:

答案 0 :(得分:3)

出色的尝试,并感谢预期/实际输出的清晰图像!

该模式实际上比您想象的要简单。反复从中心绘制一个框,每次迭代时,乌龟在中心点上略微旋转。盒子侧面的重叠部分产生了“辐条”的错觉。

关于确定转弯量(度),我取360并将其除以图像中显示的轮辐数量(20个),得出18度。

这里的代码可以产生正确的输出。

import turtle

def draw_square(turtle, size):
    for i in range(4):
        turtle.forward(size)
        turtle.left(90)

if __name__ == "__main__":
    wn = turtle.Screen()
    wn.bgcolor("lightgreen")
    alex = turtle.Turtle()
    alex.color("blue")
    alex.pensize(3)
    boxes = 20

    for _ in range(boxes):
        draw_square(alex, 200)
        alex.left(360 / boxes)

    wn.mainloop()

输出:

turtle