首页 > 解决方案 > ThinkPython - Ex 4.5 - 编写一个绘制阿基米德螺旋线(或其他类型之一)的程序

问题描述

从 Think Python 的练习中尝试这个问题时,是我还是每个人都面临着如此多的问题。我正在尝试解决第 4 章的练习,但遇到了很多问题。练习 4.5 说编写一个绘制阿基米德螺旋线的程序。我有这段代码,但它在 Python 中不起作用。我需要一个简单的解决方案。请帮忙。

from TurtleWorld import *

world = TurtleWorld()
bob = Turtle()

def polygon(t, length, n):
    t = Turtle()
    for i in range(n):
        fd(t, length)
        lt(t, 300 / n)

polygon(bob, 5, 8)

标签: pythonturtle-graphics

解决方案


【下面的讨论中,我使用的是Python自带的turtle库,不是TurtleWorld,所以相应调整。】来自在线ThinkPython PDF:

练习 4.5。在http://en.wikipedia.org/wiki/Spiral阅读有关螺旋的信息;然后编写一个绘制阿基米德 [原文如此] 螺旋线(或其他类型之一)的程序。解决方案: http: //thinkpython.com/code/spiral.py

如果我们按照从SpiralArchimedean spiral的 Wikipedia 链接,我们最终r = a + b * theta会得到自然希望在极坐标中计算并在笛卡尔坐标中绘制的公式:

def spiral(turtle, rotations=6, a=0.0, b=5):
    theta = 0.0

    while theta < rotations * 2 * pi:
        radius = a + b * theta
        x, y = radius * cos(theta), radius * sin(theta)
        turtle.goto(x, y)
        theta += 0.1

其中a控制螺旋的初始角度,并控制转弯b之间的距离:

在此处输入图像描述

但是 ThinkPython 提供的解决方案是不同的:

为了摆脱pisin()cos()从 math.py 中删除,它描绘了螺旋上的乌龟以及沿着螺旋移动的每个动作的样子。它介绍n了要绘制多少条线段,以及length这些线段的长度。该b变量的含义仍然大致相同,尽管规模不同,并且a代表了初始螺旋开始时的紧密程度。同样,我们从以下开始:

theta = 0.0

但是我们不是循环完整旋转的数量,而是循环到n要绘制的段数。所以n应该很大,例如代码中的 1000 而不是 5。每次迭代我们都向前移动length像素,然后根据 、 和 计算新的adeltab角度theta

delta = 1 / (a + b * theta)

我们转动这个小量,并theta在我们再次循环之前添加这个量。在这种方法中,a并且b通常小于 1 但非零:

在此处输入图像描述

你可以通过两张图片中海龟的方向看到,第一张只是绘制点,所以海龟的方向并不重要,但在第二张图中,我们沿着螺旋线移动,所以海龟总是指向螺旋增长的方向. 我希望对这两种方法的讨论对您有所帮助。


推荐阅读