前端大杂烩

【canvas】心电图绘制

2023-10-29  本文已影响0人  写写而已
GIF 2023-10-30 18-46-11.gif
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1.0" />
        <title>Document</title>
        <style>
            * {
                margin: 0;
                padding: 0;
            }
            body {
                background-color: #333;
            }
            div {
                padding: 16px;
                width: 400px;
                height: 160px;
                background-color: #fff;
                border-radius: 6px;
                margin: 20px;
                position: relative;
            }
            canvas {
                position: absolute;
                left: 16px;
                top: 16px;
            }
        </style>
    </head>
    <body>
        <div>
            <canvas id="c1" width="400" height="160"></canvas>
            <canvas id="c2" width="400" height="160"></canvas>
        </div>
    </body>
    <script>
        let sd = [100, 180, 170, 60, 100, 100,100, 100, 100, 160, 80, 120, 100, 100, 100, 100, 100, 100, 100, 100]
        /** 画线 */
        let data = []
        function drawLine(ctx, shadow) {
            /** 开始x坐标、开始y坐标、结束x坐标、结束y坐标 */
            let grd = ctx.createLinearGradient(0, 100, 400, 100)
            grd.addColorStop(0, `rgba(14, 185, 160, ${shadow ? 0.1 : 1})`)
            grd.addColorStop(1, `rgba(160, 209, 118, ${shadow ? 0.1 : 1})`)
            // 将渐变赋值给线的样式
            ctx.strokeStyle = grd
            // 高大约170+
            let pyX = shadow ? 6 : 0
            ctx.beginPath()
            let newData = data.map(item => {
                return 160 - (item / 200) * 140
            })
            // console.log(newData)
            // console.log('***********')
            // ctx.moveTo(0, endPoint)
            newData.forEach((item, index) => {
                let x = index * 4
                ctx.lineTo(x, item + pyX)
            })
            ctx.lineWidth = shadow ? 5 : 2
            ctx.stroke()
        }
        function drwaBg(ctx) {
            /*1.绘制网格*/
            /*2.网格的大小*/
            var lineNumber = 6
            var canvasHeight = ctx.canvas.height - lineNumber
            var canvasWidth = ctx.canvas.width
            console.log(canvasWidth, canvasHeight)
            for (var i = 0; i < 6; i++) {
                let endPoint = i * 28 + 10.5
                ctx.beginPath()
                ctx.moveTo(0, endPoint)
                ctx.lineTo(canvasWidth, endPoint)
                ctx.strokeStyle = '#ddd'
                ctx.lineWidth = 1
                ctx.stroke()
            }
        }
        let c1 = document.querySelector('#c1')
        let ctx1 = c1.getContext('2d')
        drwaBg(ctx1)
        let c2 = document.querySelector('#c2')
        let ctx2 = c2.getContext('2d')
        let stop = 0
        let index = 0
        function loop() {
            if(data.length>= 100) {
                data.shift()
            }
            
            data.push(sd[index])
            index++
            if(index>20) {
                index = 0
            } 
            // console.log('-----------')
            // console.log(data)
        
            ctx2.clearRect(0, 0, 1000, 1000)
            drawLine(ctx2)
            drawLine(ctx2, true)
            
            window.requestAnimationFrame(() => {
                if(stop < 5000){
                    loop()
                }
                stop ++
            })
        }
        loop()
        
        
    </script>
</html>

上一篇下一篇

猜你喜欢

热点阅读