首页 > 其他分享 >使用canvas(2d)+js实现一个简单的傅里叶级数绘制方波图

使用canvas(2d)+js实现一个简单的傅里叶级数绘制方波图

时间:2023-08-14 12:22:43浏览次数:45  
标签:canvas const ctx js 2d x2 var y2 data

先看效果

查看页面右下角,嘿嘿

简要说明

  1. 创建具有不同半径与角速度的圆集合;(截图中展现的效果为5个,代码是30个,运行后效果会不同)
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. 计算某时刻相应圆的位置与旋转角度,并记录"叶圆端点"坐标值(画出来的形状有点怪啊,卧槽)
    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曲线逼近绘制曲线()

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)
    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

标签:canvas,const,ctx,js,2d,x2,var,y2,data
From: https://www.cnblogs.com/lenkaset/p/17628263.html

相关文章

  • js数组去重
    letarr=[1,2,2,2,3,4,5,5];letarr1=[]//方法1indexOf去重arr.map(e=>{if(arr1.indexOf(e)==-1){arr1.push(e)}})console.log(arr1)//方法2es6set去重letarr2=Array.from(newSet(arr))console.log(arr2)//方法3将数组的值保存为对象的key形式(o......
  • JSON WEB TOKEN - 简单的token认证方式 - 告别session和cookie - Java Demo
    JWT简介jwt非常适合前后分离和分布式的应用不必在服务端存储session,本地也不用存储cookie直接存两段信息即可localStorage["jwt"]=jwt;//tokenlocalStorage["name"]=json.name;//token中加密的某个字段,用于后期请求带上校验token是否被改可以把认证......
  • leaflet.js气象风场图制作
    Demo示例<!--https://github.com/onaci/leaflet-velocity--><!DOCTYPEhtml><html><head><title>LeafletVelocityDemo</title><metacharset="utf-8"/></head><body><div......
  • JSON生成Form表单的方法示例
    JSON生成Form表单的方法示例 更新时间:2018年11月21日14:21:14 作者:熟悉的陌生人  JSON表单是一个基于React的抽象组件,它可以把JSON数据格式描述的表单转换成项目中的表单,这篇文章主要介绍了JSON生成Form表单的方法示例,感兴趣的小伙伴们可以参考一下 JSON表单描述......
  • fastjson配置统一的日期格式转换
    importcom.alibaba.fastjson.serializer.SerializeConfig;importcom.alibaba.fastjson.serializer.SerializerFeature;importcom.alibaba.fastjson.serializer.ToStringSerializer;importcom.alibaba.fastjson.support.config.FastJsonConfig;importcom.alibaba.fast......
  • JS6种函数
    1.普通函数2.对象方法函数varo={sayHi:function(){  }}3.构造函数4.绑定事件函数5.定时器函数6.立即执行函数 黑马前端的规定......
  • 基于node.js的健身房会员管理系统
    随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。健身房会员管理系统,主要的模块包括首页、个人中心、会员管理、教练管理、场地信息管理、课程信息管理、订单信息管理、预约信息管理、训练情况管理、留言板管理、系统管......
  • VSCode C++开发环境配置:CMake 调试配置 launch.json
    相关内容VSCodeC++开发环境配置:LLVMclangclangd安装cmakesudoaptinstallcmake安装VSCode插件CMakeCMakeTools编写CMakeLists.txtproject(hello)cmake_minimum_required(VERSION3.15.0)set(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_EXTENSIONSOFF)add......
  • Protobuf vs JSON
    Protobuf(ProtocolBuffers)和JSON都是数据序列化格式,但它们在许多方面有着显著的不同。以下是对两者的一些主要比较:数据大小和速度:Protobuf:由于Protobuf是二进制格式,因此它生成的数据通常比JSON小很多,这使得Protobuf在网络传输中更加高效。同时,Protobuf的解析和序列化......
  • How to use Javascript JSON.stringify similar method in Python All In One
    HowtouseJavascriptJSON.stringifysimilarmethodinPythonAllInOne如何在Python中使用类似JavaScriptJSON.stringify的方法应用场景比较两个数组(列表)对象是否相等/comparestwoarray(list)objectsforequality//jsarr1=[1,2,3]arr2=[1,2,3]......