码农知识堂 - 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

  • 相关阅读:
    【Redis】Redis 的安装及图形化界面 Redis DeskTop Manager 的安装与使用
    小程序和页面生命周期详解
    微软出品自动化神器Playwright,不用写一行代码(Playwright+Java)系列(三) 之 手把手带你结合TestNG测试框架写一个脚本
    设计一个网络爬虫(Python)
    MySQL与ES数据同步的四种方案及实践演示
    猿创征文|分布式事务常见解决方案
    QT 操作Windows系统服务
    Libra R-CNN: Towards Balanced Learning for Object Detection(2019.4)
    2022“杭电杯”中国大学生算法设计超级联赛(5)1003.Slipper dijkstra
    持续交付的好处
  • 原文地址:https://www.cnblogs.com/lenkaset/p/17628263.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号