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

  • 相关阅读:
    Java练手任务总结【18】
    Java.lang.Class类 isInstance()方法有什么功能呢?
    Parseval’s Theorem & Parseval’s Identity of Fourier Transform
    01 【入门篇-介绍和安装】
    Handler-源码分析
    软考-高项-论文-信息系统项目的质量管理
    TCP 报文首部的 6 个标记位
    微软Azure OpenAI支持数据微调啦!可打造专属ChatGPT
    vue-router实现history模式配置(生产环境路由失效跟刷新404问题)
    SpringCloud框架(三):微服务优化,Feign的最佳实现方案
  • 原文地址:https://www.cnblogs.com/lenkaset/p/17628263.html
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号