前言:

最近在【编程德鲁伊】的【傅里叶级数可视化】章节中,练习了傅里叶级数基础原理的可视化,演示了周期方波曲线,可以分解为一系列正弦波曲线:

这次拿学到的知识做个实验,试试喜闻乐见的【用傅里叶级数画画】,并尽可能简单直观的解释一下原理。

自认为简单直观的原理解释

之前练习的可视化,都是在二维空间进行,例如正弦波:

方波(通过傅里叶级数):

图中左半边的圆周(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画任意图形...相关推荐

  1. 用python画叶子_今天学会傅里叶画画,明天就是初音未来 - 如何用Python和Blender画任意图形...

    前言: 最近在[编程德鲁伊]的[傅里叶级数可视化]章节中,练习了傅里叶级数基础原理的可视化,演示了周期方波曲线,可以分解为一系列正弦波曲线: 这次拿学到的知识做个实验,试试喜闻乐见的[用傅里叶级数画画 ...

  2. python海龟绘图画海螺_我学会了画画100字

    我学会了画画100字 时间:05-09 作者: 篇一:我学会了画画[100字] 杜昊航 今天下午上了美术课,美术课佷有意思,今天把我们上节课画的钟表.楼房.轮船.蘑菇都涂了颜色.我把送货物的轮船涂完了 ...

  3. python采集直播_天天再看斗鱼直播?教你如何用Python技术抓取弹幕

    说起来,弹幕这种东西的出现,真的给众多网友带来无数的欢乐源泉. 当然,密集恐惧症患者慎入,毕竟某些视频的弹幕可谓是刷得密密麻麻的. 整个屏幕看的不是剧情,是弹幕. 以前是磕CP很快乐,现在是磕着弹幕也 ...

  4. python爱心代码_「含蓄优雅表白神器」程序员式用python代码画爱心(附详细教程)...

    还能用python代码画爱心?还有这种操作?这是什么原理? 不相信python代码可以画爱心?先来一张效果图来看看效果吧! 用python代码画爱心的思路是怎样的? 1.怎么画心形曲线 2.怎么填满心 ...

  5. python画菊花_网传“菊花厂月薪13K”15道硬核Python面试题,值得一看!

    见过面试题也不少了,总之了一句话:面试前备好功课,面试中临危不乱,面试后谦虚有礼!这只是我本人总结的一些面试三要素,需要的可以参考参考,话不多了,今天为大家找了网传菊花厂比较硬核的15道面试题,希望能 ...

  6. python 释放内存_学了4年C++后,我转向了Python

    作者 | asya f 编译 | Lisa C++ 已经学不动了,现在换 Python 还来得及吗?一位四年工作经验的 C++ 程序员亲述转型历程,这不仅仅是语言上的转变,而是代码思维甚至工作环境的转 ...

  7. 如何用python做俄罗斯方块_你的童年有俄罗斯方块吗?教你用 Python 实现俄罗斯方块!...

    是为数不多的游戏类电子产品,对小孩子更是有着不可抗拒的魔力,在当时如果哪个小孩买了一个小游戏机,大伙一定迅速围上去- 俄罗斯方块作为其中一款小游戏,尽管规则简单.只有黑白双色,但其对当时游戏玩家的影响 ...

  8. python本科生就业_准备报学习机构学习大数据、Java或者python,是计算机专业的本科生,请问选择哪种就业发展比较好?...

    谢邀.对比java和python后者还算是小语种.不知道楼主的具体情况如何.根据个人情况,建议先学java,毕竟你目前的需求是尽快找到更合适的技术工作,java择业面相对较宽,虽然也难学,但学习资源丰 ...

  9. python 取反_自从用了这招pandas 空数据处理方法,python编程速度提升了不少

    今天为大家带来的内容是:自从用了这招pandas 空数据处理方法,python编程速度提升了不少 文章内容主要介绍了pandas 空数据处理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工 ...

最新文章

  1. 02 数据类型 (向量 数据框 矩阵和列表
  2. CVPR 2020 | 腾讯优图17篇论文入选,含类比学习、人脸识别、物体检测、行人重识别等领域...
  3. springBoot(19):定时任务
  4. python统计分析---6.主成分分析
  5. Variant 数组
  6. HDU1418 抱歉【数学】
  7. html css js介绍ppt,HTML+CSS+JS-入门基础.ppt
  8. 身份证前6位匹配户籍地址对应的数据地区sql脚本(里面包含json版本的)
  9. 秋天视频批量生成GIF V1.32
  10. VS2017生成可执行程序,执行提示“不是有效的win32应用程序”
  11. 新能源行业商业采购协同系统:赋能新能源行业采购业务,提升产业协同
  12. 带你学开源项目:RxLifecycle-当Activity被destory时自动暂停网络请求
  13. 恢复W ndows10系统方法步骤,教你windows10的映像文件还原系统
  14. 航班管理系统-机票预订
  15. POJ 3691 AcWing 1053 修复DNA
  16. 重新定义超频 解读NVIDIA的Shader频率
  17. Java培训机构之我见
  18. 华为发布BB智能观影产品:Vision Glass
  19. 数据分析师的就业前景和薪资待遇如何?
  20. 一文详细了解针对蓝牙智能应用的超低功耗无线MCU芯片CC2640

热门文章

  1. Bootstrap的x-editable行编辑
  2. eclipse全局搜索_Eclipse如何进行全局搜索和单页面搜索?
  3. abaqus的python安装文件在哪_python、abaqus执行脚本路径
  4. pythontkinter在一块区域中绘图_用Python中的tkinter模块作图(续)
  5. java批量生成订单号_【笔记6-支付及订单模块】从0开始 独立完成企业级Java电商网站开发(服务端)...
  6. 【Java】14 JDBC编程学习总结
  7. Scala,Spark和IDEA学习笔记
  8. ?线程池为什么可以复用,我是蒙圈了。。。
  9. 微信公众号支付开发全过程(java版)
  10. svn教程----示例二:测试人员拥有读权限