最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

原生js和canvas模拟心电图代码分享

来源:动视网 责编:小采 时间:2020-11-27 20:03:54
文档

原生js和canvas模拟心电图代码分享

原生js和canvas模拟心电图代码分享:使用原生js+canvas制作的模拟心电图的html页面,因为和项目一起打包放到了github上,所以使用了vue.js的单页模式,实际上你不需要使用任何额外的框架和样式,也可以完成这个demo,现在让我们一起来拆解这个项目吧!1:在页面上创建一个canvas画布,要让
推荐度:
导读原生js和canvas模拟心电图代码分享:使用原生js+canvas制作的模拟心电图的html页面,因为和项目一起打包放到了github上,所以使用了vue.js的单页模式,实际上你不需要使用任何额外的框架和样式,也可以完成这个demo,现在让我们一起来拆解这个项目吧!1:在页面上创建一个canvas画布,要让


使用原生js+canvas制作的模拟心电图的html页面,因为和项目一起打包放到了github上,所以使用了vue.js的单页模式,实际上你不需要使用任何额外的框架和样式,也可以完成这个demo,现在让我们一起来拆解这个项目吧!

1:在页面上创建一个canvas画布,要让心电图的“线”在我们的页面上动起来,canvas是必不可少的。因为项目比较简单,到此为止页面上的DOM元素已经写完了,主要的工作量集中在js部分

<p class="heartBeat">
   <canvas id="can">Canvas画板</canvas>
 </p>

2:定义几个变量并赋值,运行时会需要用到这些变量进行计算

var can = document.getElementById('can'),//画布对象
 pan,//获取2D图像API接口
 index = 0,//用来接收setinerval的值
 flag = true,//用来控制心电图折线的运行方向
 wid = document.body.clientWidth,//获取浏览器宽度
 hei = document.body.clientHeight,//获取浏览器高度
 x = 0,//心电图的“点”在画布上的x轴坐标,从0开始
 y = hei/2;//心电图的“点”在画布上的y轴坐标,从页面y轴居中位置开始

3:初始化画布,给画布设置各种属性

function start(){
 can.height = hei;//设置画布高度
 can.width = wid;//设置画布宽度
 pan = can.getContext("2d");//获取2D图像API接口
 pan.strokeStyle = "#08b95a";//设置画笔颜色
 pan.lineJoin = "round";//设置画笔轨迹基于圆点拼接
 pan.lineWidth = 9;//设置画笔粗细
 pan.beginPath();//开始一条画笔的路径
 pan.moveTo(x,y);//定位我们的“落笔点”
 index = setInterval(move,1);//让我们的画笔动起来
 };

可以看到,在这里我们还没有涉及到“画”的动作,仅仅只是初始化了画布尺寸,使画布充满屏幕,同时定义了画笔的颜色、粗细、落笔点等操作,然后使用setInterval方法让画笔不停地按照我们计算的路线运动,如果你对setInterval方法不是很熟悉,建议你看下 setInterVal用法 ,这里不再敷述。因为我们想要让心电图无限循环且自动执行,所以在这里将它封装为start()函数,这样当心电图运动到屏幕最右方时,我们重新执行这个start()函数,就可以实现让心电图无限循环了

4.让心电图动起来!可以说,前面的步骤都没有什么难度,真正的核心代码在于让我们的心电图动起来,并且是按照我们希望的路线前进,下面我们就让心电图真正活过来

function move(){
 x++;//x轴是始终运动的,所以x一直自增
 if(x < 100){
 //前100px,我们不希望做垂直运动,让点只沿垂直方向运动即可,所以不做任何操作
 }else{
 if(x >= wid - 100){
 //最后的100px,同样希望心电图只做水平运动,不会上下波动,所以不做任何操作
 }else{
 //为了让心电图看起来更加逼真,我们希望心电图在运动时每次的波峰和波谷都是随机的,这样更类似于人类的心跳,所以我们给它一个随机值z
 var z = Math.random()*280;

 if(y <= z){
 //画布的坐标是从左上角开始计算的,也就是最左上角的点的坐标是(0,0),y是当前画笔所在坐标的y轴,假如y小于z,就代表y已经到达波峰位置,准备开始向波谷运动
 flag = true
 }
 if((hei - y) <= z){
 //假如当前画笔在y轴的坐标y距离浏览器底部hei的差值已经小于随机值z,代表当前的画笔已经运行到波谷位置,准备转向波峰位置运动
 flag = false
 }
 if(flag){
 //假如flag为true,代表画笔仍然向波谷位置前进,需要花点功夫理解的是,因为画布左上角的点的坐标是(0,0),所以y的值越大,画笔在y轴的位置越靠近浏览器底部,所以向波谷运动时,y的值是不断增加的,同时为了让波峰波谷更陡峭,我这里设置y += 5,
 y+=5
 }else{
 //假如flag为false,表示向波峰运动,y的值是不断减小的
 y-=5
 }
 }
 }
 if(x == wid){
 //当画笔运动到浏览器右侧边缘,停止绘图
 pan.closePath();
 //清除循环
 clearInterval(index);
 //将index置零,准备下一次循环
 index = 0;
 //重新定位画笔到屏幕左侧上下居中的位置
 x = 0;
 y = hei/2;
 flag = true;
 //重新进行下一次心电图的绘制
 start();
 }
 //lineTo和stroke函数负责描绘运动轨迹
 pan.lineTo(x,y);
 pan.stroke();
 }

5:注意事项,到这里实际上心电图已经可以运行起来了,但是要注意的是,设置你的body高度为100%,否则画布可能无法撑满整个页面

html,body{
 width: 100%;
 height: 100%;
 margin: 0;
 }

项目完整代码:

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>模拟心电图</title>
 <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
 <style>
 html,body{
 width: 100%;
 height: 100%;
 margin: 0;
 }
 </style>
</head>
<body>
<p id="canvas">
 <canvas id="can">Canvas画板</canvas>
</p>

<script src="js/vue.min.js"></script>
<script>
 var can = document.getElementById('can'),
 pan,
 index = 0,
 flag = true,
 wid = document.body.clientWidth,
 hei = document.body.clientHeight,
 x = 0,
 y = hei/2;
 start();
 function start(){
 can.height = hei;
 can.width = wid;
 pan = can.getContext("2d");//获取2D图像API接口
 pan.strokeStyle = "#08b95a";//设置画笔颜色
 pan.lineJoin = "round";//设置画笔轨迹基于圆点拼接
 pan.lineWidth = 9;//设置画笔粗细
 pan.beginPath();
 pan.moveTo(x,y);
 index = setInterval(move,1);
 };
 function move(){
 x++;
 if(x < 100){

 }else{
 if(x >= wid - 100){

 }else{
 var z = Math.random()*280;
 if(y <= z){
 flag = true
 }
 if((hei - y) <= z){
 flag = false
 }
 if(flag){
 y+=5
 }else{
 y-=5
 }
 }
 }
 if(x == wid){
 pan.closePath();
 clearInterval(index);
 index = 0;
 x = 0;
 y = hei/2;
 flag = true;
 start();
 }
 pan.lineTo(x,y);
 pan.stroke();
 }

 /* */

</script>
</body>
</html>

文档

原生js和canvas模拟心电图代码分享

原生js和canvas模拟心电图代码分享:使用原生js+canvas制作的模拟心电图的html页面,因为和项目一起打包放到了github上,所以使用了vue.js的单页模式,实际上你不需要使用任何额外的框架和样式,也可以完成这个demo,现在让我们一起来拆解这个项目吧!1:在页面上创建一个canvas画布,要让
推荐度:
标签: 代码 心电图 canvas
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top