首页 > web前端 > js教程 > 原生js和canvas模拟心电图代码分享

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

小云云
发布: 2018-02-05 13:33:04
原创
2198 人浏览过

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

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


1

2

3

<p class="heartBeat">

   <canvas id="can">Canvas画板</canvas>

 </p>

登录后复制

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


1

2

3

4

5

6

7

8

var can = document.getElementById(&#39;can&#39;),//画布对象

    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:初始化画布,给画布设置各种属性


1

2

3

4

5

6

7

8

9

10

11

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

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%,否则画布可能无法撑满整个页面


1

2

3

4

5

html,body{

   width: 100%;

   height: 100%;

   margin: 0;

  }

登录后复制

项目完整代码:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

<!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(&#39;can&#39;),

    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>

登录后复制

相关推荐:

Canvas实现炫丽的粒子运动效果

canvas多边形的画法示例

html2 canvas实现浏览器截图

以上是原生js和canvas模拟心电图代码分享的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
怎么实现 JavaScript点与圆的位置关系
来自于 1970-01-01 08:00:00
0
0
0
JavaScript钩子函数是什么?
来自于 1970-01-01 08:00:00
0
0
0
c++ 调用javascript
来自于 1970-01-01 08:00:00
0
0
0
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板