先看效果

查看页面右下角,嘿嘿

简要说明

  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(2d)+js实现一个简单的傅里叶级数绘制方波图的更多相关文章

  1. js实现一个简单钟表动画(javascript+html5 canvas)

    第一次在博客园注册发博.有一次去人家单位开标,看到开标网站上有个钟表动画,一时兴起,就写了个简单的钟表动画. 用js和html5 canvas对象实现一个简单钟表程序 主要用到的就是h5的canvas ...

  2. 用JS做一个简单的电商产品放大镜功能

    使用js制作一个简单的产品放大图 购物网站的产品页经常会放有一个产品展示图区.该图区有一个功能就是产品图的放大功能,移动左侧的焦点区域,可以放大细节部分观看,详情如下图.实现该功能的方法也非常简单. ...

  3. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  4. JS实现一个简单的计算器

    使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除.效果如上: 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择 ...

  5. php+js实现一个简单的用户管理系统

    php + js 实现一个简单的用户管理系统 说实话,我对PHP是抵触的,但是我们的WEB课程刚好学的就是这个,不得已看了看,下面是用PHP实现的一个简单的用户管理系统. 我们首先来看一下目录结构 a ...

  6. JS事件 编程练习-自制计算器 使用JS完成一个简单的计算器功能。实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除。

    编程练习 使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElement ...

  7. SharePoint创建一个简单的Visio Web部件图

    SharePoint创建一个简单的Visio Web部件图 Visio有很多强大的Mash-up混聚功能,使它能够轻松集成到SharePoint 2010中. 1. 打开Visio 2010,创建新的 ...

  8. JS写一个简单日历

    JS写一个日历,配合jQuery操作DOM <!DOCTYPE html> <html> <head> <meta charset="UTF-8&q ...

  9. 学习用node.js建立一个简单的web服务器

    一.建立简单的Web服务器涉及到Node.js的一些基本知识点: 1.请求模块 在Node.js中,系统提供了许多有用的模块(当然你也可以用JavaScript编写自己的模块,以后的章节我们将详细讲解 ...

  10. Three.js构造一个简单的房间

    主要研究three.js在3D场景中基本使用:画一个简单的房子.房子上画门和玻璃.房间内放一个床.定义鼠标事件可以移动场景.动画的使用等. 1.Three.js画的一个简单的房子,模拟地板以及四堵墙 ...

随机推荐

  1. 2022-08-03:以下go语言代码输出什么?A:2;B:3;C:1;D:0。 package main import “fmt“ func main() { slice := []i

    2022-08-03:以下go语言代码输出什么?A:2:B:3:C:1:D:0. package main import "fmt" func main() { slice := ...

  2. 2022-07-27:小红拿到了一个长度为N的数组arr,她准备只进行一次修改, 可以将数组中任意一个数arr[i],修改为不大于P的正数(修改后的数必须和原数不同), 并使得所有数之和为X的倍数。

    2022-07-27:小红拿到了一个长度为N的数组arr,她准备只进行一次修改, 可以将数组中任意一个数arr[i],修改为不大于P的正数(修改后的数必须和原数不同), 并使得所有数之和为X的倍数. ...

  3. 2021-10-03:合并两个有序数组。非递减数组nums1和nums2。合并这两个数组并放在nums1中。力扣88。

    2021-10-03:合并两个有序数组.非递减数组nums1和nums2.合并这两个数组并放在nums1中.力扣88. 福大大 答案2021-10-03: 从右往左遍历nums1和nums2,谁大拷贝 ...

  4. 这10个Lambda表达式必须掌握,简化你的代码,提高生产力

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名 ...

  5. airasia Superapp × HMS Core:便捷出行,悦享全程

    2023年5月9日-5月11日,HUAWEI P60系列及旗舰产品发布会在欧洲德国.中东非阿联酋.亚太马来西亚.拉美墨西哥陆续举办,为消费者带来高端影像旗舰HUAWEI P60 Pro及系列全场景智能 ...

  6. IDEA output 输出中文乱码解决方案

    1. 事发场景 最近在用idea 运行 spring 的项目发现运行之后 tomcat 的 output 输出 中文是乱码样子 2. 解决方法 点击右上角tomcat旁边的小三角 下拉框 点击Edit ...

  7. nginx: [emerg] https protocol requires SSL support in /usr/local/nginx/conf/nginx.conf:50

    最近在nginx中配置一个443端口 一.安装nginx 首先得先安装个nginx 1.安装依赖包 # 一键安装上面四个依赖 [root@dex ~]# yum -y install gcc zlib ...

  8. PowerShell脚本的基础知识

    参考文档https://learn.microsoft.com/zh-cn/powershell/scripting/samples/viewing-object-structure--get-mem ...

  9. 一篇文章带你入门HBase

    本文已收录至Github,推荐阅读 Java随想录 微信公众号:Java随想录 目录 HBase特性 Hadoop的限制 基本概念 NameSpace Table RowKey Column Time ...

  10. [ARM汇编]计算机原理与数制基础—1.1.3 二进制补码

    在计算机中,为了表示有符号整数(即正数和负数),通常采用二进制补码表示法.二进制补码不仅可以表示负数,还能简化计算机的加法和减法运算.接下来,我们将介绍二进制补码的概念及其计算方法. 原码.反码和补码 ...