码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 使用canvas(2d)+js实现一个简单的傅里叶级数绘制方波图


    先看效果#

    查看页面右下角,嘿嘿

    简要说明#

    1. 创建具有不同半径与角速度的圆集合;(截图中展现的效果为5个,代码是30个,运行后效果会不同)
    Copy
    const getCircles = (N = 10) => { const ret = []; for (let i = 0; i < N; i += 1) { ret.push({ r: 100 / (i * 2 + 1), ω: i * 2 + 1, φ: 0 }); } return ret; }; const circles = getCircles(30);
    1. 计算某时刻相应圆的位置与旋转角度,并记录"叶圆端点"坐标值(画出来的形状有点怪啊,卧槽)
    Copy
    let x = 0; let y = 0; circles.forEach((c) => { drawCircle(ctx, x, y, c); const st = { x, y }; x += c.r * Math.cos((c.ω * idx * Math.PI) / 180); y += c.r * Math.sin((c.ω * idx * Math.PI) / 180); const sp = { x, y }; drawVector(ctx, st, sp); }); points.push(x); points.push(y);

    3.将"叶圆端点"坐标集合使用bezier曲线逼近绘制曲线()

    Copy
    function drawSolve(ctx, data, k = null, color = null) { if (k === null) k = 1; var size = data.length; var last = size - 4; ctx.strokeStyle = color || "#Fff0f0"; ctx.beginPath(); ctx.moveTo(data[0], data[1]); for (var i = 0; i < size - 2; i += 2) { var x0 = i ? data[i - 2] : data[0]; var y0 = i ? data[i - 1] : data[1]; var x1 = data[i + 0]; var y1 = data[i + 1]; var x2 = data[i + 2]; var y2 = data[i + 3]; var x3 = i !== last ? data[i + 4] : x2; var y3 = i !== last ? data[i + 5] : y2; var cp1x = x1 + ((x2 - x0) / 6) * k; var cp1y = y1 + ((y2 - y0) / 6) * k; var cp2x = x2 - ((x3 - x1) / 6) * k; var cp2y = y2 - ((y3 - y1) / 6) * k; ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x2, y2); } ctx.stroke(); }
    1. 方波y值取"叶圆端点"坐标,x值随意;绘制方波图(依旧使用bezier)
    Copy
    pssine.unshift(y); if (pssine.length > canvas.height * canvas.width) { pssine.pop(); } const pp = []; pssine.forEach((p, i) => { pp.push(i / 2 + 200); pp.push(p); }); drawSolve(ctx, pp, null, "#0000ff");

    总结#

    大概就实现了此功能;但许多细节没有深究;需要优化;源码:fourier

    参考#

    一组点怎么平滑地用曲线连接呢?
    使用贝塞尔曲线绘制多点连接曲线
    Catmull-Rom Spline

  • 相关阅读:
    外部中断1电平触发
    RMAN备份数据库_重启RMAN备份
    python代码规范PEP 8——常见的规范错误与解决办法
    110. 平衡二叉树
    基于Python实现可变形深度人脸特征插值编解码网络
    使用 IDEA 的 Dedis 插件连接 Redis 服务器
    遥感数据经纬度(0-360)转(-180,180)
    全国计算机等级考试python(未来教育)
    做废20个账号才总结出的短视频运营干货
    aio-3588SJD4 qt环境配置记录
  • 原文地址:https://www.cnblogs.com/lenkaset/p/17628263.html
  • 最新文章
  • 【FHE】我们如何实现同态加密推理(八):SiLU 的密文化——两条路径,和一个 8 字节的开关
    SQLcl 中 c/old/new 替换变量为何失效?先定位再替换
    不让模型写作文,直接从它脑子里读答案:Jev 决策在 .NET 的两条路线
    Halo插件:支持GitHub的图床附件策略
    电视投屏界的“一股清流”!SimpleTVCast 6.0.0-beta 抢先体验:无需TV端App,界面大换血!✨
    华三VXLAN集中式网关实战指南:Spine多活网关 + 双活接入(M-LAG)
    软件更好写之后口碑会更重要
    大 O、大 Omega、大 Theta 的区别,O(n) 复杂度是什么意思
    Java标签跳转:一个鲜为人知但却很实用的小技巧
    多智能体系统论文速读
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号