ホームページ  >  記事  >  ウェブフロントエンド  >  ネイティブ js とキャンバスでシミュレートされた心電図コード共有

ネイティブ js とキャンバスでシミュレートされた心電図コード共有

小云云
小云云オリジナル
2018-02-05 13:33:042043ブラウズ

ネイティブ js+ca​​nvas を使用して作成された心電図シミュレーション用の 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。