《虚数不虚》第十一节 电脑绘图指南
写在前面:
1.本文为笔者原创。为了方便理解,我创设了一则《花生漫画》的小故事穿插其中。这是我第一次尝试,不足之处请多多指正。
2.完整的代码在文末给出,供有需要的读者使用。
3.本代码参阅了《虚数不虚》原作者(Stephencwelch)在Github公开的代码,对此笔者深表感谢!

前言:来自莱纳斯的承诺

今天,就让莱纳斯教大家怎么实现它!



预备工作



都准备好了吗?Ready, go!
第一步:开启笔记本图像显示,加载所需第三方库

第二步:导入一张JPEG图像,我今天选择的是——史努比!

在下一步操作之前,我们要明确图像的横坐标和纵坐标

第三步:创建每个像素点变换前的坐标 (xInput,yInput)
以及他们变换后的坐标 (xOutput,yOutput)
第四步:创建空白画布,用于绘制变换后的图像

第六步:利用二重循环将每个像素的原坐标变换到新坐标
这里的变换:f(z)=i*z(把图像绕原点逆时针旋转90°)
好,看看我们的结果!

为什么图像的原点跑到了左下角?

第七步:我们以画布的中心为新的原点,把坐标轴平移到这里
为了方便,我特意在原点处沿正方向绘制了新的x轴和y轴:

第八步,我们对第六步的代码加以修改
①加入条件判断,对变换后超出画布边界的点不予绘制
②整体平移变换后的像素点,使画布中心成为新的坐标原点
我们再来看一下绕原点逆时针旋转90°的效果:


正在这时...


露西是女强人,是《花生漫画》中塑造很成功的一名角色,笔者很喜欢她。



第九步:实现f(z)=z²
我们只需要将第8行的代码改成:
就可以实现指数为2的幂变换。实际操作中,我们需要把图像缩小才能容纳变换后的图像,我选择的缩放比例是0.00308
结果




进阶指南
制作属于你的复变函数动画

第十步:平移图像

如果你仔细看了我之前的代码,你便不难想到,只需将原来的
z=x+i*y 改写成 z=(x+Δx)+i*(y+Δy) 就可以了
其中(Δx,Δy)便是向x轴,y轴正向移动的位移。
最后一步:制作动画

我们知道,动画是由一帧帧图片组成,每张都都有细微的差别
我们可以通过引入一个循环,让程序生成一系列图片。
我们先看最简单的例子:从原点开始,沿x轴正向平移
f(z)=z+10*frame
frame=1,2,3...,30
我们得到了30张图片,就差用把它们拼接成GIF了


看起来很无聊,但我们已经制作第一幅数学动画!
最后,我们来制作f(z)=z到f(z)=z²的渐变动画

f(z)=0.03*z^(1 + frame/30)
frame=1,2,3,...,30

有数学家是这么形容该过程的:
原来的正交的网格变成了彼此正交的抛物线,直观上看就好像是将复平面沿负实半轴剪开,然后绕着原点环抱,形成双层结构。
通过动画,我们窥见了复变换更深层的结构。
这也是我们下一节课要探讨的内容


最后说一句:从网页复制代码时,请检查缩进。