在尝试使用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)
答案 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
控制转弯之间的距离:
但是ThinkPython提供的解决方案有所不同:
要摆脱math.py中的pi
,sin()
和cos()
,它会画出螺旋上的海龟,以及沿螺旋运动的样子。它引入了n
,即要绘制的线段数,以及length
这些线段的长度。 b
变量的含义仍然大致相同,尽管范围不同,而a
表示初始螺旋开始的紧密程度。同样,我们从以下开始:
theta = 0.0
但是,我们没有循环完整的旋转次数,而是循环到n
,即要绘制的段数。因此n
应该很大,例如1000,而不是代码中的5。每次迭代时,我们向前移动length
个像素,然后基于a
,b
和theta
计算一个新的转角,以进行转向:
delta = 1 / (a + b * theta)
我们将这笔钱转小,也要在再次循环之前将这笔钱添加到theta
中。在这种方法中,a
和b
通常小于1,但不为零:
在两个图像中,您可以看到乌龟的方向,第一个只是在绘制点,所以乌龟的方向并不重要,但是在第二个图像中,我们沿着螺旋运动,所以乌龟始终指向螺旋上升。我希望对这两种方法的讨论对您有帮助。