《虛數(shù)不虛》第十一節(jié) 電腦繪圖指南
寫在前面:
1.本文為筆者原創(chuàng)。為了方便理解,我創(chuàng)設了一則《花生漫畫》的小故事穿插其中。這是我第一次嘗試,不足之處請多多指正。
2.完整的代碼在文末給出,供有需要的讀者使用。
3.本代碼參閱了《虛數(shù)不虛》原作者(Stephencwelch)在Github公開的代碼,對此筆者深表感謝!

前言:來自萊納斯的承諾

今天,就讓萊納斯教大家怎么實現(xiàn)它!



預備工作



都準備好了嗎?Ready, go!
第一步:開啟筆記本圖像顯示,加載所需第三方庫

第二步:導入一張JPEG圖像,我今天選擇的是——史努比!

在下一步操作之前,我們要明確圖像的橫坐標和縱坐標

第三步:創(chuàng)建每個像素點變換前的坐標 (xInput,yInput)
以及他們變換后的坐標?(xOutput,yOutput)
第四步:創(chuàng)建空白畫布,用于繪制變換后的圖像

?第六步:利用二重循環(huán)將每個像素的原坐標變換到新坐標
這里的變換:f(z)=i*z(把圖像繞原點逆時針旋轉(zhuǎn)90°)
好,看看我們的結(jié)果!

為什么圖像的原點跑到了左下角?

第七步:我們以畫布的中心為新的原點,把坐標軸平移到這里
為了方便,我特意在原點處沿正方向繪制了新的x軸和y軸:

第八步,我們對第六步的代碼加以修改
①加入條件判斷,對變換后超出畫布邊界的點不予繪制
②整體平移變換后的像素點,使畫布中心成為新的坐標原點
我們再來看一下繞原點逆時針旋轉(zhuǎn)90°的效果:


正在這時...


露西是女強人,是《花生漫畫》中塑造很成功的一名角色,筆者很喜歡她。



第九步:實現(xiàn)f(z)=z2
我們只需要將第8行的代碼改成:
就可以實現(xiàn)指數(shù)為2的冪變換。實際操作中,我們需要把圖像縮小才能容納變換后的圖像,我選擇的縮放比例是0.00308
結(jié)果




進階指南
制作屬于你的復變函數(shù)動畫

第十步:平移圖像

如果你仔細看了我之前的代碼,你便不難想到,只需將原來的
z=x+i*y??改寫成??z=(x+Δx)+i*(y+Δy)? 就可以了
其中(Δx,Δy)便是向x軸,y軸正向移動的位移。
最后一步:制作動畫

我們知道,動畫是由一幀幀圖片組成,每張都都有細微的差別
我們可以通過引入一個循環(huán),讓程序生成一系列圖片。
我們先看最簡單的例子:從原點開始,沿x軸正向平移
f(z)=z+10*frame
frame=1,2,3...,30
我們得到了30張圖片,就差用把它們拼接成GIF了


看起來很無聊,但我們已經(jīng)制作第一幅數(shù)學動畫!
最后,我們來制作f(z)=z到f(z)=z2的漸變動畫

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

有數(shù)學家是這么形容該過程的:
原來的正交的網(wǎng)格變成了彼此正交的拋物線,直觀上看就好像是將復平面沿負實半軸剪開,然后繞著原點環(huán)抱,形成雙層結(jié)構(gòu)。
通過動畫,我們窺見了復變換更深層的結(jié)構(gòu)。
這也是我們下一節(jié)課要探討的內(nèi)容


最后說一句:從網(wǎng)頁復制代碼時,請檢查縮進。