>  기사  >  웹 프론트엔드  >  기본 JS 및 캔버스 시뮬레이션 심전도 코드 공유

기본 JS 및 캔버스 시뮬레이션 심전도 코드 공유

小云云
小云云원래의
2018-02-05 13:33:041998검색

네이티브 js+canvas를 사용하여 만든 심전도 시뮬레이션용 html 페이지입니다. 프로젝트와 함께 패키징되어 github에 올려져 있기 때문에 vue.js의 단일 페이지 모드를 사용하므로 실제로는 추가로 사용할 필요가 없습니다. 프레임워크와 스타일을 살펴보겠습니다. 이 데모를 완료한 후 이 프로젝트를 함께 해체해 보겠습니다.

1: 페이지에 캔버스를 만듭니다. 페이지에서 심전도의 "선"을 움직이려면 캔버스가 필수적입니다. 프로젝트가 상대적으로 간단하기 때문에 지금까지 페이지의 DOM 요소는 js 부분에 집중되어 있습니다.


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

2: 여러 변수를 정의하고 값을 할당합니다.


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: 캔버스를 초기화하고 캔버스에 다양한 속성을 설정합니다


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의 사용법을 살펴보는 것이 좋습니다. 이는 다시 설명하지 않습니다. ECG가 무한 반복되고 자동으로 실행되기를 원하기 때문에 여기에서는 이를 start() 함수로 캡슐화하여 ECG가 화면의 맨 오른쪽으로 이동할 때 start() 함수를 다시 실행하여 ECG를 생성합니다. 무한.주기입니다

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: 주의 사항 , 이 시점에서 실제로 심전도를 실행할 수 있지만 신체 높이를 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(&#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>

관련 추천:

캔버스는 눈부신 입자 모션 효과를 구현합니다

캔버스 다각형 그리기 예

html2 캔버스는 브라우저 스크린샷을 구현합니다

위 내용은 기본 JS 및 캔버스 시뮬레이션 심전도 코드 공유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.