医工互联

 找回密码
 注册[Register]

手机动态码快速登录

手机号快速登录

微信登录

微信扫一扫,快速登录

QQ登录

只需一步,快速开始

查看: 190|回复: 0
收起左侧

Canvas案例-实现ECG心电图

[复制链接]

  离线 

发表于 2024-5-11 00:23:01 | 显示全部楼层 |阅读模式
描绘一个ECG心电图

上代码:
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <meta http-equiv="X-UA-Compatible" content="IE=edge">
  6.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7.     <title>canvas绘制心电图</title>
  8. </head>
  9. <body>
  10.     <canvas id="ecg" width="751" height="201" ></canvas>
  11. </body>
  12. </html>
  13. <script>
  14.     var ecgDom = document.getElementById('ecg');
  15.     var ecgDomWidth = ecgDom.width - 1,
  16.         ecgDomHeight = ecgDom.height - 21;
  17.     var addX = ecgDomWidth / 50, // 这个50是横坐标总的中格子数
  18.         addY = ecgDomHeight / 12, // 这个12是纵坐标总的中格子数
  19.         marginL = 0.5;
  20.     /*
  21.     1、context.strokeRect(x,y,width,height); strokeRect() 方法绘制矩形(不填色)。笔触的默认颜色是黑色。
  22.      */
  23.     // canvas 的左上角坐标为 (0,0)
  24.     // 绘制表格的函数,此表格包含大中小三种格子,分别对应三种函数:
  25.     function drawSmallGrid(c_canvas){ // 绘制小格子
  26.         var context = c_canvas.getContext("2d");
  27.         context.fillStyle = '#ff6b64';
  28.         var dotMarginX = addX / 5,
  29.             dotMarginY = addY / 5;
  30.         var i = dotMarginX;
  31.         // let num = 0;
  32.         for (i; i < ecgDomWidth; i += dotMarginX) {
  33.             // console.log(i);
  34.             // if ((i % addX) === 0) { console.log(i); }
  35.             if ((i % addX) !== 0) {    // 列分隔线处不打点
  36.                 for (var j = dotMarginY; j < ecgDomHeight; j += dotMarginY) {
  37.                     if ((j % addY) !== 0) { // 行分割线处不打点
  38.                         console.log('行分割线处不打点', j);
  39.                         // num++;
  40.                         // context.rect(x,y,width,height); 矩形左上角的 x 坐标, 矩形左上角的 y 坐标, 矩形的宽度,以像素计, 矩形的高度,以像素计
  41.                         context.rect(i, j, 1, 0.5);
  42.                     }
  43.                 }
  44.             }
  45.         }
  46.         context.fill();
  47.     }
  48.     function drawMediumGrid(c_canvas){ // 绘制中格子
  49.         var context = c_canvas.getContext("2d");
  50.             context.strokeStyle = "#ff6b64";
  51.             context.strokeWidth=1.5;
  52.             context.setLineDash([3, 3]);
  53.             context.beginPath();
  54.         let num = 0;
  55.         for (var x = marginL; x < ecgDomWidth; x += addX) {
  56.             context.moveTo(x, 0); // moveTo(x,y) 定义线条开始坐标, Y轴的话从0开始描绘
  57.             context.lineTo(x, ecgDomHeight); // lineTo(x,y) 定义线条结束坐标, X轴可以描绘到1000
  58.             context.stroke();
  59.             num++;
  60.         };
  61.         console.log('X轴网格数:', num);
  62.         for (var y = marginL; y < ecgDomHeight; y += addY) {
  63.             context.moveTo(0, y);
  64.             context.lineTo(ecgDomWidth, y);
  65.             context.stroke();
  66.         };
  67.         context.closePath();
  68.         return;
  69.     }
  70.    function drawBigGrid(c_canvas){ // 绘制大格子
  71.         var context = c_canvas.getContext("2d");
  72.             context.strokeStyle = "#ff6b64"; // 设置或返回用于笔触的颜色、渐变或模式。
  73.             context.strokeWidth=1.5;
  74.             context.setLineDash([3, 3]); // 设置线条虚线样式的间距和长度。[3, 0]: 虚线长度为0则绘制成实线
  75.             context.beginPath();  // 起始一条路径,或重置当前路径.
  76.         var bigAddX = ecgDomWidth / 10, // 10表示10s
  77.             bigAddY = ecgDomHeight / 2; // 2表示把Y轴分成2份,分别为正负
  78.         for (var x = marginL; x < ecgDomWidth; x += bigAddX) {
  79.             context.moveTo(x, 0); // moveTo(x,y) 定义线条开始坐标
  80.             context.lineTo(x, ecgDomHeight); // lineTo(x,y) 定义线条结束坐标
  81.             context.stroke(); // stroke() 方法来绘制线条
  82.          };
  83.         for (var y = marginL; y < ecgDomHeight; y += bigAddY) {
  84.             context.moveTo(0, y); // moveTo(x,y) 定义线条开始坐标
  85.             context.lineTo(ecgDomWidth, y); // lineTo(x,y) 定义线条结束坐标
  86.             context.stroke(); // stroke() 方法来绘制线条
  87.         };
  88.         context.closePath(); // 关闭一条打开的子路径
  89.         return;
  90.    }
  91.    function drawBigBorder(c_canvas){ // 绘制边框
  92.         var context = c_canvas.getContext("2d");
  93.             /* context.strokeStyle = "#ff6b64"; // 设置或返回用于笔触的颜色、渐变或模式。
  94.             context.strokeWidth=1.5;
  95.             context.setLineDash([3, 3]); // 设置线条虚线样式的间距和长度。[3, 0]: 虚线长度为0则绘制成实线
  96.             context.beginPath();  // 起始一条路径,或重置当前路径.
  97.             context.moveTo(ecgDomWidth,0);
  98.             context.lineTo(ecgDomWidth,ecgDomHeight);
  99.             context.moveTo(0,ecgDomHeight);
  100.             context.lineTo(ecgDomWidth,ecgDomHeight);
  101.             context.closePath(); // 关闭一条打开的子路径 */
  102.             context.strokeStyle = "#ff6b64";
  103.             context.strokeWidth=1.5;
  104.             context.setLineDash([3, 3]);
  105.             context.beginPath();
  106.             context.moveTo(ecgDomWidth + marginL,0);
  107.             context.lineTo(ecgDomWidth + marginL,ecgDomHeight + 1);
  108.             context.moveTo(0,ecgDomHeight+marginL);
  109.             context.lineTo(ecgDomWidth,ecgDomHeight+marginL);
  110.             console.log('宽高:', ecgDomWidth, ecgDomHeight);
  111.             context.stroke();
  112.         return;
  113.    }
  114.    function drawBigBG(c_canvas){ // 绘制背景
  115.         var context = c_canvas.getContext("2d");
  116.             context.fillStyle = '#FFE9E9';
  117.             context.fillRect(0, 0, ecgDomWidth + 21, ecgDomHeight + 21);
  118.    }
  119.    function drawLabelX(c_canvas){ // 绘制横坐标的label
  120.     var secondLabel = ecgDomWidth / 10;
  121.         var context = c_canvas.getContext("2d");
  122.             context.strokeStyle = '#000';
  123.             context.setLineDash([3, 0]); // 设置线条虚线样式的间距和长度。[3, 0]: 虚线长度为0则绘制成实线
  124.             context.beginPath();  // 起始一条路径,或重置当前路径
  125.             context.strokeWidth=1.5;
  126.             for (var x = marginL; x <= ecgDomWidth + secondLabel; x += secondLabel) {
  127.                 context.moveTo(x, ecgDomHeight); // moveTo(x,y) 定义线条开始坐标
  128.                 context.lineTo(x, ecgDomHeight + secondLabel + 20); // lineTo(x,y) 定义线条结束坐标
  129.                 context.stroke(); // stroke() 方法来绘制线条
  130.             };
  131.             // 绘制底部长线
  132.             context.moveTo(0, ecgDomHeight+marginL+20); // moveTo(x,y) 定义线条开始坐标
  133.             context.lineTo(ecgDomWidth,ecgDomHeight+marginL+20); // lineTo(x,y) 定义线条结束坐标
  134.             context.stroke(); // stroke() 方法来绘制线条
  135.             var textNum = 0;
  136.             for (var x = marginL; x <= ecgDomWidth + secondLabel; x += secondLabel) {
  137.                 context.font="12px Arial";
  138.                 context.fillStyle = "#000";
  139.                 context.fillText(textNum+"s",x+2, ecgDomHeight + 15);
  140.                 textNum++;
  141.                 console.log('textNum:', textNum);
  142.             };
  143.             context.closePath(); // 关闭一条打开的子路径
  144.    }
  145.    // 然后是绘制心电图的函数:
  146.    function drawLine(c_canvas) {
  147.         var ctx = c_canvas.getContext('2d');
  148.             ctx.strokeStyle = "#000"; // 设置或返回用于笔触的颜色、渐变或模式。
  149.             ctx.strokeWidth = 1;
  150.             ctx.setLineDash([3, 0]); // 设置线条虚线样式的间距和长度。[3, 0]: 虚线长度为0则绘制成实线
  151.             ctx.beginPath(); // 起始一条路径,或重置当前路径。
  152.             ctx.moveTo(0.5, 90); // moveTo(x,y) 定义线条开始坐标
  153.             ctx.lineTo(10, 90); // lineTo(x,y) 定义线条结束坐标
  154.         for(var x = 9; x < 90; x++) {
  155.             ctx.lineTo(x * 6, (Math.random() * 10 -5) * 10 + 90)
  156.         }
  157.         ctx.lineTo(650, 90)
  158.         ctx.lineTo(750, 90)
  159.         ctx.stroke(); // stroke() 方法来绘制线条
  160.         ctx.closePath(); // 关闭一条打开的子路径
  161.    }
  162.    // 最后一起调用这些函数:
  163. (function draw(){
  164.      var c_canvas = document.getElementById("ecg");
  165.      var canvas = c_canvas.getContext("2d");
  166.     //  c_canvas.fillStyle = "#ffe9e9";
  167.     //  canvas.fillRect(0, 0, c_canvas.width, c_canvas.height)
  168.      drawBigBG(c_canvas);
  169.      drawSmallGrid(c_canvas);
  170.      drawMediumGrid(c_canvas)
  171.      drawBigGrid(c_canvas);
  172.      drawLine(c_canvas);
  173.      drawBigBorder(c_canvas);
  174.      drawLabelX(c_canvas);
  175.      return;
  176.   })();
  177. </script>
复制代码
效果图:
1.png
回复

使用道具 举报

提醒:禁止复制他人回复等『恶意灌水』行为,违者重罚!
您需要登录后才可以回帖 登录 | 注册[Register] 手机动态码快速登录 微信登录

本版积分规则

发布主题 快速回复 收藏帖子 返回列表 客服中心 搜索
简体中文 繁體中文 English 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french

QQ|RSS订阅|小黑屋|处罚记录|手机版|联系我们|Archiver|医工互联 |粤ICP备2021178090号 |网站地图

GMT+8, 2024-12-22 09:21 , Processed in 0.232943 second(s), 61 queries .

Powered by Discuz!

Copyright © 2001-2023, Discuz! Team.

快速回复 返回顶部 返回列表