python画方波_今天学会傅里叶画画,明天就是初音未来 - 如何用Python和Blender画任意图形...
前言:
最近在【編程德魯伊】的【傅里葉級數可視化】章節中,練習了傅里葉級數基礎原理的可視化,演示了周期方波曲線,可以分解為一系列正弦波曲線:
這次拿學到的知識做個實驗,試試喜聞樂見的【用傅里葉級數畫畫】,并盡可能簡單直觀的解釋一下原理。
自認為簡單直觀的原理解釋
之前練習的可視化,都是在二維空間進行,例如正弦波:
方波(通過傅里葉級數):
圖中左半邊的圓周(Epicycle)和右半邊正弦波/方波的關系:左半邊是一個運動點,在一個圓周或多個圓周組合上隨著時間t轉動;
右半邊,是將時間t映射到橫軸x軸上,縱軸仍是運動點當前的y值保持不變。
也就是說,把時間域轉換為空間域,就能從一個圓周得到正弦曲線,或者從一系列圓周組合,得到方波曲線。
我們把方波可視化左右兩邊的運動點軌跡也畫出來:
左半邊由一系列圓周(Epicycle)組成的軌跡,與右半邊的方波(Square)軌跡,其實只是同一個運動點在不同空間里的展現方式而已。
豁然開朗有沒有!!!(此處插入打賞掌聲!)
為了說的更清楚一些,接下來把空間域從二維換到三維,時間t不再映射到x軸,而是映射到z軸上:
上圖從正面看過去,仍是一個圓周,而在三維空間里旋轉坐標軸,從側面看過去時,它實際上就是一個正弦曲線。
方波的也一樣:
正面的橙色軌跡,轉換角度,從側面看,就是方波的曲線。
再次豁然開朗有沒有!!!
進一步,根據傅里葉級數原理,為了得到方波(橙色),就要想辦法得到組成方波的一系列正弦波(金黃色):
換一個視角,為了得到最終的運動軌跡(橙色),就要想辦法得到組成軌跡的一系列Epicycle圓周(金黃色):
而這個橙色的運動軌跡,可以是各種形狀,也就是說,無論想畫什么圖形,只要按照傅里葉級數的原理,找到一系列Epicycle圓周,就可以畫出來了!
金豬報喜
傅里葉本尊
怎么樣,這樣去理解傅里葉級數畫畫的原理,是不是容易了一些?
接下來要解決的,就是如何為“任意”圖案找到對應的一組Epicycle圓周的問題。
從數學上講,就是求傅里葉級數里每個子項對應的傅里葉系數(a和b):
各項系數a和b都找到后,合起來就可以得到f(x)。
求傅里葉系數的方法有很多,積分、傅里葉變換等。
詳細的原理推導,我還沒有復習重修,所以對于如何把大象裝冰箱的回答,仍然是:
1.打開冰箱門;2.把大象裝進去;3.關門。
直接對圖案軌跡進行傅里葉變換,即可得到傅里葉系數。
而在計算機程序里,所有的數據都是離散的,所以實際上程序里用的是離散傅里葉變換。
關于這個環節,參考資源較多,尤其是用Web前端/JavaScript/p5.js做的不少,列在后面。
本文的配圖和動畫,是用 Blender + Python 完成:
等等老鄉,還沒完。
從上圖里傅里葉的配色就能看出,我其實原本是打算畫 Miku 醬的(初音未來):
然而碼到用時方恨不會,關于傅里葉畫畫這個問題,其實更難的是找到合適的圖案軌跡,并不是隨便一個圖都能輕松畫出來的,這也是為什么上文中,我給任意圖案的“任意”兩字加了引號。
從數學上講,在一些特定條件的約束下,一個函數才能用傅里葉級數來表達。
而找出這個圖案軌跡的過程,復雜度遠超用傅里葉級數畫軌跡本身。
后面將附上其他高人的文章供參考。
本文投入的精力僅能畫簡單的軌跡線,所以Miku就換成了傅里葉他老人家 :
最終效果(三個視角):
參考資源
Talk is cheap. Show me the code!
本文中提到的傅里葉級數基本原理可視化,文章可從公眾號菜單“筆記教程-編程德魯伊”獲得。
絕大部分開源在這里:
https://github.com/avantcontra/coding-druid
本文傅里葉畫畫的實驗代碼,可在知識星球中獲取,感謝已經加入星球的朋友們。
在知識星球里你將持續獲得實驗代碼和無限次答疑。
詳情請點擊:關于贊賞和內部知識星球。
請猛戳下方贊賞或喜歡作者,buy me a coffee!
您的金錢鼓勵是我前進的動力。
微信公眾號/知乎專欄/知識星球:實驗編程
Cheers~
Contra
總結
以上是生活随笔為你收集整理的python画方波_今天学会傅里叶画画,明天就是初音未来 - 如何用Python和Blender画任意图形...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么把动态图从python弄下来_Pyt
- 下一篇: 怎样用python绘制简单的图形_使用p