欢迎光临散文网 会员登陆 & 注册

《虚数不虚》第十一节 电脑绘图指南

2022-11-09 23:29 作者:qazopq  | 我要投稿

写在前面:

1.本文为笔者原创。为了方便理解,我创设了一则《花生漫画》的小故事穿插其中。这是我第一次尝试,不足之处请多多指正。

2.完整的代码在文末给出,供有需要的读者使用。

3.本代码参阅了《虚数不虚》原作者(Stephencwelch)在Github公开的代码,对此笔者深表感谢!

前言:来自莱纳斯的承诺

我们如何用电脑实现这个效果?

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


预备工作

下载Anacoda,打开Jupyter Notebook
这是我的笔记本,里面写好了今天要用到的代码


都准备好了吗?Ready, go!

第一步:开启笔记本图像显示,加载所需第三方库

matplotlib的Logo,强大的开源绘图库

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

这幅史努比的分辨率为500*500,每个像素点由红、绿、蓝按不同比例混合而成

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

我们首先要确定每个像素点的横坐标和纵坐标

第三步:创建每个像素点变换前的坐标 (xInput,yInput)

以及他们变换后的坐标 (xOutput,yOutput)

第四:创白画布用于绘制变换的图像

这里是整个代码的核心,需要用心去理解

 第六步:利用二重循环将每个像素的原坐标变换到新坐标

这里的变换:f(z)=i*z(把图像绕原点逆时针旋转90°)

好,看看我们的结果!

绕原点逆时针旋转90°......诶,怎么图像跑到了这里?

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

我们要改进代码

第七步:我们以画布的中心为新的原点,把坐标轴平移到这里

为了方便,我特意在原点处沿正方向绘制了新的x轴y轴


这便是我们要把坐标轴平移到的位置

第八步,我们对第六步的代码加以修改

加入条件判断,对变换后超出画布边界的点不予绘制

整体平移变换后的像素点,使画布中心成为新的坐标原点

我们再来看一下绕原点逆时针旋转90°的效果:

Success!!
你知道我是怎么做的吗?

正在这时...

这时,莱纳斯的大姐姐上线了!

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

尤其是那种神态,笔者在生活中真遇见过!

第九步:实现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

老实说,笔者看到这么壮观的变换,竟无话可言!

有数学家是这么形容该过程的:

原来的正交的网格变成了彼此正交的抛物线,直观上看就好像是将复平面沿负实半轴剪开,然后绕着原点环抱,形成双层结构。

通过动画,我们窥见了复变换更深层的结构。

这也是我们下一节课要探讨的内容

感谢观看!

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

《虚数不虚》第十一节 电脑绘图指南的评论 (共 条)

分享到微博请遵守国家法律