还记得小时候的万花尺吧?这么画:
![e41b08131b0a9502c204dbe3c4479317.gif](https://i-blog.csdnimg.cn/blog_migrate/de4c21076f58466221dcc68dd4ba6c86.gif)
一点也不费脑筋,就可以出来这么多丰富多彩的复杂几何图形。
![fcfa6d27a7a80a336de26b22072935d2.png](https://i-blog.csdnimg.cn/blog_migrate/88c56148c0a92ac8623f3bc4ea7130e6.jpeg)
![8dfa07de4f94a65645bd6ecd909fca7d.png](https://i-blog.csdnimg.cn/blog_migrate/98416233135a47199283541b81d6b288.jpeg)
具体而言,可以用万花尺玩具(如图2-1所示)来绘制数学曲线。这种玩具由两个不同尺寸的塑料齿轮组成,一大一小。小的齿轮有几个孔。把钢笔或铅笔放入一个孔,然后在较大齿轮(内部有齿)内旋转里面的小齿轮,保持笔与外轮接触,可以画出无数复杂而奇妙的对称图案。
![903d1dc30c7d148a716f1094c3713e1c.png](https://i-blog.csdnimg.cn/blog_migrate/4afd26c347b7f36e3b99a22519c32444.jpeg)
图2-1 万花尺
现在,在电脑里,用Python也可以这么玩了,让我们看看Python的万花尺效果吧。(不用急,程序在后哦)
$ python spiro.py
默认情况下,spiro.py程序绘制随机螺线,如图2-5所示。按S键保存绘制。
![221585ef52fa32b6ab0673c5f8c20b14.png](https://i-blog.csdnimg.cn/blog_migrate/74961974a90c8b9550a04e849874b69d.jpeg)
图2-5 spiro.py的运行示例
再次运行程序,这次在命令行传入参数,画出特定的螺线。
$ python spiro.py --sparams 300 100 0.9
图2-6展示了输出结果。如你所见,这段代码根据用户指定的参数绘制了一条螺线,图2-5和它不同,展示了几个随机螺线的动画。
![2ecd777568da605b2bb36133fa73f201.png](https://i-blog.csdnimg.cn/blog_migrate/248df06db59577421b3df0db579142b3.jpeg)
图2-6 用具体参数运行spiro.py的示例
这么神奇又好玩的万花尺,在Python里怎么玩呢?
不要走开,让我们继续下面的Python之旅。
在这个项目中,我们将用Python来创建动画,像万花尺一样绘制曲线。我们的spiro.py程序将用Python和参数方程来描述程序的万花尺齿轮的运动,并绘制曲线(我称之为螺线)。我们可以将完成的画图保存为PNG图像文件,并用命令行选项来指定参数或生成随机螺线。
在这个项目中,我们将学习如何在计算机上绘制螺线。还将学习以下几点:
- 用turtle模块创建图形;
- 使用参数方程;
- 利用数学方程来生成曲线;
- 用线段来画曲线;
- 用定时器来生成图形动画;
- 将图形保存为图像文件。
参数方程
在本节中,你将看到用参数方程来画圆的简单例子。参数方程将曲线上点的坐标表示为一个变量的函数,该变量称为参数。参数方程让绘制曲线变得容易,因为只要将参数代入方程就能产生曲线。
注意
如果你现在不想学习这部分数学知识,可以跳到下一部分,讨论针对万花尺项目的方程。
我们开始考虑用半径 r 来描述一个圆的方程,圆心位于二维平面的原点。 x 、 y 坐标满足该方程的所有点构成了圆。
现在,请考虑下面的方程:
x = r cos( θ )
y = r sin( θ )
这些方程是圆的参数表示,其中角 θ 是参数。这些方程中(X,Y)的任何值,都满足前面描述的圆的方程,X 2 + Y 2 = R 2 。如果让 θ 从0变到2π,可以用这些方程来计算圆上对应的 x 和 y 坐标。图2-2展示了这种方案。
![8f31cea8266926da656f1d72f5640ecf.png](https://i-blog.csdnimg.cn/blog_migrate/80ff0100589a6a9395646ff6674a3e19.jpeg)
图2-2 用参数方程描述圆
记住,这两个方程适用于圆心在坐标系原点的圆。将圆心转换到点( a , b ),就可以将圆置于 xy 平面的任何位置。所以更一般的参数方程就变成 x = a + r cos( θ )和 y = b + r cos( θ )。现在,让我们来看看描述螺线的方程。
万花尺方程
图2-3展示了类似万花尺运动的数学模型。该模型没有齿轮,因为玩具中的齿轮只是为了防止打滑,而在这里不必担心打滑。
![7f6c750f35d2943503c81730d132a7be.png](https://i-blog.csdnimg.cn/blog_migrate/1c98718278e8ba0715492e65d4509487.jpeg)
图2-3 万花尺数学模型
在图2-3中,C是较小的圆的圆心,P是笔尖。较大的圆半径为 R ,较小的圆半径为 r 。半径之比表示如下: