使用原生js+canvas实现模拟心电图的实例


Posted in Javascript onSeptember 20, 2017

从2015年2月转行进入IT行业,到现在也有将近两年的时间了,从最开始的java到现在的前端,前进的路上一直靠自己摸索,一路走到现在,前端大神是绝对谈不上的,最多算一只刚入门的菜鸟。

从最开始的懵懵懂懂,到现在学着开始写github、写博客,其实技术上没有太多可写的,毕竟自己也才刚刚入门,只能说是按照自己的兴趣,写点有意思的小项目,项目上存在的问题,也希望大神能够予以指正,目前这个demo的功能已经实现,后期我会对样式、代码等方面进行优化。

项目运行效果:

使用原生js+canvas实现模拟心电图的实例

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

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

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

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>
<div id="canvas">
  <canvas id="can">Canvas画板</canvas>
</div>

<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实现模拟心电图的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
Dec 27 Javascript
jquery等待效果示例
May 01 Javascript
jQuery获取上传文件的名称的正则表达式
May 21 Javascript
深入探究JavaScript中for循环的效率问题及相关优化
Mar 13 Javascript
详细谈谈javascript的对象
Jul 31 Javascript
jQuery验证表单格式的使用方法
Jan 10 Javascript
解决浏览器会自动填充密码的问题
Apr 28 Javascript
基于BootStrap multiselect.js实现的下拉框联动效果
Jul 28 Javascript
vue 自定义组件 v-model双向绑定、 父子组件同步通信的多种写法
Nov 27 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
Dec 10 Javascript
js实现mp3录音通过websocket实时传送+简易波形图效果
Jun 12 Javascript
JavaScript经典案例之简易计算器
Aug 24 Javascript
Vue.js项目模板搭建图文教程
Sep 20 #Javascript
从对象列表中获取一个对象的方法,依据关键字和值
Sep 20 #Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
Sep 20 #Javascript
jquery 一键复制到剪切板的实例
Sep 20 #jQuery
angularjs利用directive实现移动端自定义软键盘的示例
Sep 20 #Javascript
集合Bootstrap自定义confirm提示效果
Sep 19 #Javascript
微信小程序使用Socket的实例
Sep 19 #Javascript
You might like
菜鸟学PHP之Smarty入门
2007/01/04 PHP
destoon之一键登录设置
2014/06/21 PHP
php+mysqli使用预处理技术进行数据库查询的方法
2015/01/28 PHP
PHP页面转UTF-8中文编码乱码的解决办法
2015/10/20 PHP
PHP回调函数概念与用法实例分析
2017/11/03 PHP
Ajax+Json 级联菜单实现代码
2009/10/27 Javascript
js动态创建表格,删除行列的小例子
2013/07/20 Javascript
javascript模拟订火车票和退票示例
2014/04/24 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
实例代码详解javascript实现窗口抖动及qq窗口抖动
2016/01/04 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
Javascript将数值转换为金额格式(分隔千分位和自动增加小数点)
2016/06/22 Javascript
js选择器全面解析
2016/06/27 Javascript
Bootstrap输入框组件简单实现代码
2017/03/06 Javascript
微信小程序获取手机网络状态的方法【附源码下载】
2017/12/08 Javascript
vue+django实现一对一聊天功能的实例代码
2019/07/17 Javascript
详解ECMAScript2019/ES10新属性
2019/12/06 Javascript
JS倒计时两种实现方式代码实例
2020/07/27 Javascript
解决Python中字符串和数字拼接报错的方法
2016/10/23 Python
Python正则表达式教程之三:贪婪/非贪婪特性
2017/03/02 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
使用python实现unix2dos和dos2unix命令的例子
2019/08/13 Python
python使用nibabel和sitk读取保存nii.gz文件实例
2020/07/01 Python
实例教程 利用html5和css3打造一款创意404页面
2014/10/20 HTML / CSS
HTML5不支持frameset的两种解决方法
2016/11/14 HTML / CSS
教师读书活动总结
2014/05/07 职场文书
小学生运动会通讯稿
2014/09/23 职场文书
购房协议书范本
2014/10/02 职场文书
建党伟业电影观后感
2015/06/01 职场文书
2015年暑期见闻
2015/07/14 职场文书
nginx前后端同域名配置的方法实现
2021/03/31 Servers
Python实现科学占卜 让视频自动打码
2022/04/09 Python