使用canvas(2d)+js实现一个简单的傅里叶级数绘制方波图
先看效果
查看页面右下角,嘿嘿

简要说明
- 创建具有不同半径与角速度的圆集合;(截图中展现的效果为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);
- 计算某时刻相应圆的位置与旋转角度,并记录"叶圆端点"坐标值(画出来的形状有点怪啊,卧槽)
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();
}
- 方波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(2d)+js实现一个简单的傅里叶级数绘制方波图的更多相关文章
- js实现一个简单钟表动画(javascript+html5 canvas)
第一次在博客园注册发博.有一次去人家单位开标,看到开标网站上有个钟表动画,一时兴起,就写了个简单的钟表动画. 用js和html5 canvas对象实现一个简单钟表程序 主要用到的就是h5的canvas ...
- 用JS做一个简单的电商产品放大镜功能
使用js制作一个简单的产品放大图 购物网站的产品页经常会放有一个产品展示图区.该图区有一个功能就是产品图的放大功能,移动左侧的焦点区域,可以放大细节部分观看,详情如下图.实现该功能的方法也非常简单. ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
- JS实现一个简单的计算器
使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除.效果如上: 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择 ...
- php+js实现一个简单的用户管理系统
php + js 实现一个简单的用户管理系统 说实话,我对PHP是抵触的,但是我们的WEB课程刚好学的就是这个,不得已看了看,下面是用PHP实现的一个简单的用户管理系统. 我们首先来看一下目录结构 a ...
- JS事件 编程练习-自制计算器 使用JS完成一个简单的计算器功能。实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除。
编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...
- SharePoint创建一个简单的Visio Web部件图
SharePoint创建一个简单的Visio Web部件图 Visio有很多强大的Mash-up混聚功能,使它能够轻松集成到SharePoint 2010中. 1. 打开Visio 2010,创建新的 ...
- JS写一个简单日历
JS写一个日历,配合jQuery操作DOM <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...
- 学习用node.js建立一个简单的web服务器
一.建立简单的Web服务器涉及到Node.js的一些基本知识点: 1.请求模块 在Node.js中,系统提供了许多有用的模块(当然你也可以用JavaScript编写自己的模块,以后的章节我们将详细讲解 ...
- Three.js构造一个简单的房间
主要研究three.js在3D场景中基本使用:画一个简单的房子.房子上画门和玻璃.房间内放一个床.定义鼠标事件可以移动场景.动画的使用等. 1.Three.js画的一个简单的房子,模拟地板以及四堵墙 ...
随机推荐
- 2023-04-12:使用 Go 重写 FFmpeg 的 extract_mvs.c 工具程序,提取视频中的运动矢量信息。
2023-04-12:使用 Go 重写 FFmpeg 的 extract_mvs.c 工具程序,提取视频中的运动矢量信息. 答案2023-04-12: 主要的过程包括: 打开输入视频文件并查找视频流信 ...
- phpstudy-pikachu-字符型注入(get)
在查询栏输入1,点击查询获得查询格式 ?name=1'&submit=查询 *捷径 ' or 1=1 --+ *非捷径 ?name=1' and 1=2 --+ 2--+&submit ...
- wireshark基本使用
Wireshark 是一种开源.跨平台的网络数据包分析工具,能够嗅探和调查实时流量并检查数据包捕获 (PCAP).它通常 被用作最好的数据包分析工具之一. 数据包过滤操作 ip过滤器 IP 过滤器帮助 ...
- 【技术积累】Python中的NumPy库【一】
NumPy库是什么 NumPy是Python科学计算的核心库之一,用来进行科学计算,数值分析等矩阵运算.主要提供了以下几种功能: 1.多维数组(ndarray)对象,可以进行快速的数值计算和数组操作: ...
- 【快应用】addEventListener()方法无法监听动画事件
[关键词] 动画监听.动态改变 [问题背景] Style中设置动画样式,然后在onshow生命周期中调用addEventListener()方法去监听动画事件,无法监听到,该方法无任何回调返回 问题 ...
- JavaScript 显示数据
JavaScript 显示数据 JavaScript 可以通过不同的方式来输出数据: 使用 window.alert() 弹出警告框. 使用 document.write() 方法将内容写到 HTML ...
- springboot下拦截器的单例模式写法
最近在学习springboot的时候,要把用户登录的做一个拦截,又想到了不采用new对象方式,于是想到使用单例模式来进行构造拦截器对象,所以下面看代码. (不知道这个是不是要写成单例模式,也许是我最近 ...
- ELK8.8部署安装并配置xpark认证
ELK8.8部署安装并配置xpark认证 介绍 主要记录下filebeat+logstash+elasticsearch+kibana抽取过滤存储展示应用日志文件的方式:版本基于8.8,并开启xp ...
- 基于JavaFX的扫雷游戏实现(一)——整体概述
我在不要更新挑战中坚持了一年,你也来试试吧(咕咕咕)! 好言归正传,本次更新带来的是经典游戏扫雷,基于JavaFX实现.篇幅有限,文章主要介绍核心操作实现,不会列出所有代码.需要完整源码或是想预览 ...
- 一次oracle行级锁导致的问题
分析问题:我在plsql/developer是用的system用户连接的数据库,而在crt用 sqlplus / as sysdba 连接数据库,是sys用户.现在在plsql/developer ...