ThinkPython-Ex 4.5-编写绘制阿基米德螺旋线(或其他类型之一)的程序

时间:2018-11-09 19:27:30

标签: python turtle-graphics

在尝试使用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)

1 个答案:

答案 0 :(得分:0)

[在下面的讨论中,我使用的是Python附带的龟库,而不是TurtleWorld,因此请相应地进行调整。]从在线ThinkPython PDF:

  

锻炼4.5。在http://en.wikipedia.org/wiki/Spiral阅读有关螺旋的信息;   然后编写一个程序,绘制一个阿基米德螺旋形(或一个   其他)。解决方案:http://thinkpython.com/code/spiral.py

如果我们遵循从 Spiral Archimedean 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控制转弯之间的距离:

enter image description here

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

要摆脱math.py中的pisin()cos(),它会画出螺旋上的海龟,以及沿螺旋运动的样子。它引入了n,即要绘制的线段数,以及length这些线段的长度。 b变量的含义仍然大致相同,尽管范围不同,而a表示初始螺旋开始的紧密程度。同样,我们从以下开始:

theta = 0.0

但是,我们没有循环完整的旋转次数,而是循环到n,即要绘制的段数。因此n应该很大,例如1000,而不是代码中的5。每次迭代时,我们向前移动length个像素,然后基于abtheta计算一个新的转角,以进行转向:

delta = 1 / (a + b * theta)

我们将这笔钱转小,也要在再次循环之前将这笔钱添加到theta中。在这种方法中,ab通常小于1,但不为零:

enter image description here

在两个图像中,您可以看到乌龟的方向,第一个只是在绘制点,所以乌龟的方向并不重要,但是在第二个图像中,我们沿着螺旋运动,所以乌龟始终指向螺旋上升。我希望对这两种方法的讨论对您有帮助。