python - 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)
解决方案
【下面的讨论中,我使用的是Python自带的turtle库,不是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 提供的解决方案是不同的:
为了摆脱pi
,sin()
并cos()
从 math.py 中删除,它描绘了螺旋上的乌龟以及沿着螺旋移动的每个动作的样子。它介绍n
了要绘制多少条线段,以及length
这些线段的长度。该b
变量的含义仍然大致相同,尽管规模不同,并且a
代表了初始螺旋开始时的紧密程度。同样,我们从以下开始:
theta = 0.0
但是我们不是循环完整旋转的数量,而是循环到n
要绘制的段数。所以n
应该很大,例如代码中的 1000 而不是 5。每次迭代我们都向前移动length
像素,然后根据 、 和 计算新的a
deltab
角度theta
:
delta = 1 / (a + b * theta)
我们转动这个小量,并theta
在我们再次循环之前添加这个量。在这种方法中,a
并且b
通常小于 1 但非零:
你可以通过两张图片中海龟的方向看到,第一张只是绘制点,所以海龟的方向并不重要,但在第二张图中,我们沿着螺旋线移动,所以海龟总是指向螺旋增长的方向. 我希望对这两种方法的讨论对您有所帮助。
推荐阅读
- angular - 如何在打字稿中自定义对 json 数组进行排序?
- c++ - 使用 std::filesystem::copy 无法复制符号链接
- python - spacy 3 - lemma_ 返回将是空字符串
- java - 由于 java.nio.channels.ClosedByInterruptException,Jenkins 并行子作业失败
- python - pythonic方法来打破一个字典,哪个值是几个字典的列表
- python - Python 随机数列表,它们之间的差为 2
- java - JavaMail API 不发送电子邮件
- php - 使用数据库表的列名创建表单
- python - Python -- 仅在目标文件夹中查找特定模式的 tar.gz 文件
- pip - 为 centos6 内核的奇异容器安装 glibc 2.14 和 2.17