turtle

写在前面

其实我也不知道为什么我会写这个,本文涉及信号与传递,Python

正题

近期看到一个3年前的视频,1000个圆一笔画出一个Miku

在观看完源码了以后,我发现这是这调用的是基本的goto,用了傅里叶级函数(傅里叶级变化),那个视频中给出了分析,只要圆足够多,就可以画出任意的封闭曲线

$f(x)=\frac{a_{0}}{2}+\sum\limits_{n=1}^{\infty}\left(a_{n}\cos{nx}+b_{n}\sin{nx}\right)$
任意满足狄利克雷条件的函数,其本身的傅里叶级数都是收敛的。也就是说,函数可以表示成无限个正弦函数和余弦函数和的形式。
假如说我我能把我们需要绘制的二维图像表现在复平面上,把它的轨迹表现成有关时间t的复函数,那么,横坐标的移动和纵坐标的移动都可以看作是关于时间t的函数。
$f(x)=\frac{a_{0}}{2}+\sum\limits_{n=1}^{\infty}\left(a_{n}\cos{nx}+b_{n}\sin{nx}\right)$

$g(x)=\frac{c_{0}}{2}+\sum\limits_{n=1}^{\infty}\left(c_{n}\cos{nx}+d_{n}\sin{nx}\right)$

以上的两个函数都是实函数,都可以展开成傅里叶级数


展开的公式太难写了,所以就截图了。
然后,我们对二维图像的轨迹稍加处理,发现这也是个傅里叶级展开式,只不过前面的系数变成了复数。这样子的解释不是证明,但是在傅里叶级变换的复数表示里,正弦函数都是可以通过余弦函数增加一个初始相位来表示,实函数的傅立叶变换才是傅立叶变换的特殊形式,这里不解释。

$c_n=\int_{0}^{1}{e^{-2i\pi nt}f(t)dt}$
我们求得这些级数了以后,只需要把系数代回这个公式得到一个坐标

这时,就可以用turtle的goto函数移动到指定的坐标,达到绘制图形的目的

值得思考的

同时函数的傅立叶变换相同,我们计算的级数越多,结果我们越接近我们原本绘制的轨迹,不联系的函数也可以进行傅里叶变换,配合turtle的penup和pendown函数,我们就可以得到断断续续线,绘制过程中的精度也不是越大越好,最佳精度和我们上面分析的级数有关系。

操作

在Adobe illustrator里面设计好自己的图案

图案要一笔带过,中间的线条可以重叠,可以急转弯,但是一定是一笔

然后保存为SVG。 在SVG文件中


把路径复制,

<path class="st0" d='............' />

把省略号中的复制,就是那一大串数字和字母的组合。
保存到ra开头的txt文件中,源码在下面
源码
接下来的,自己琢磨吧…

彩蛋

# 画个绿色的长虫
import turtle as t
def drawSnake(radius, angle, length):
     t.seth(-40)
     for i in range(length):
          t.circle(radius, angle)
          t.circle(-radius, angle)
     t.circle(radius, angle/2)
     t.fd(40)
     t.circle(16, 180)
     t.fd(40*2/3)
t.setup(650, 350, 200, 200)
t.penup()
t.fd(-250)
t.pendown()
t.pensize(25)
t.pencolor('green')
drawSnake(40, 80, 4)
t.down()