zoukankan      html  css  js  c++  java
  • 原生JS实现动态折线图

    原生JS实现动态折线图

    <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title>原生JS实现动态折线图</title>
    	</head>
    	<body>
    	<canvas id="canvas"></canvas>
    		<script>
    			let N = new CreateMovingLineDiagram();
    			//N.SetData.cavaswidth = 800//改变canvas宽度
    			N.play();
    			
    			function CreateMovingLineDiagram() {
    				let _this = this;
    				//默认参数
    				_this.SetData = {
    					canvasid: "#canvas",// 画布ID
    					canvas 600,//画布宽度
    					canvasheight: 400,//画布高度
    					segmentationNum: 50,//分段数,将画布宽度分割成多少分
    					MoveSpeed: 100,//移动速度
    					IsShowsegmentationBool: true,//是否开启分段显示
    					IsCurveBool: true//true使用曲线绘图,false使用直线绘图
    				}
    				_this.play = function() {
    					let canvas = document.querySelector(_this.SetData.canvasid); //获取Canvas元素
    					canvas.width = _this.SetData.canvaswidth; //设置画布宽
    					canvas.height = _this.SetData.canvasheight; //设置画布高
    					
    					let context = canvas.getContext("2d"); //使用Context绘画2D
    					let segmentation = _this.SetData.segmentationNum //分段数
    					let Speed = _this.SetData.MoveSpeed //绘画速度
    					let XYAttr = []; //分段坐标数组
    					let XZ = canvas.width / segmentation //得到每一段的X坐标
    					let XW = 0; //已生成的X坐标
    					let IsShowsegmentation = _this.SetData.IsShowsegmentationBool; //是否显示分段线
    					let IsCurve = _this.SetData.IsCurveBool; //是否绘画曲线
    					
    					//进入页面先创建空数组
    					for (var i = 0; i < segmentation + 1; i++) {
    						XYAttr.push({
    							"X": XW,
    							"Y": canvas.height / 2
    						})
    						if (XW != canvas.width) {
    							XW += XZ;
    						}
    					}
    					
    					setInterval(function() {
    						canvas.height = canvas.height; //先清除画布
    						if (IsShowsegmentation) {
    							for (var i = 0; i < segmentation + 1; i++) {
    								//画线
    								context.moveTo((i * XZ), 0);
    								context.lineTo((i * XZ), canvas.height)
    								context.strokeStyle = "#aaa";
    								context.stroke();
    								context.beginPath();
    							}
    						}
    					
    						for (var i = 0; i < XYAttr.length; i++) {
    							if (IsCurve) {
    								//绘制曲线
    								if (i > 0) {
    									context.beginPath();
    									context.moveTo(XYAttr[i - 1].X, XYAttr[i - 1].Y);
    									context.quadraticCurveTo(XYAttr[i - 1].X, XYAttr[i].Y, XYAttr[i].X, XYAttr[i].Y);
    					
    								}
    					
    							} else {
    								//绘制直线
    								if (i > 0) {
    									context.beginPath();
    									context.moveTo(XYAttr[i - 1].X, XYAttr[i - 1].Y);
    									context.lineTo(XYAttr[i].X, XYAttr[i].Y)
    								}
    							}
    					
    							context.strokeStyle = "coral";
    							context.stroke();
    						}
    					
    						XYAttr.splice(0, 1);
    						//随机数据
    						round = Math.floor(Math.random() * canvas.height);
    					
    						for (var i = 0; i < XYAttr.length; i++) {
    							XYAttr[i].X = XYAttr[i].X - (XZ * 2)
    						}
    					
    						XYAttr.push({
    							"X": XW,
    							"Y": round
    						})
    					
    					}, Speed)
    				}
    			}
    			
    			
    		</script>
    	</body>
    
    </html>
    

    效果图
    在这里插入图片描述
    基础代码就是以上写的了,更多高级拓展靠你们的脑袋了,如大佬有更好的做法可以在评论和我说,感激不尽

  • 相关阅读:
    python中range函数与列表中删除元素
    python碎片记录(一)
    Coursera在线学习---第八节.K-means聚类算法与主成分分析(PCA)
    Coursera在线学习---第七节.支持向量机(SVM)
    Coursera在线学习---第六节.构建机器学习系统
    Coursera在线学习---第五节.Logistic Regression
    梯度下降法与迭代结束条件
    利用并查集求最大生成树和最小生成树(nlogn)
    字符串二分查找
    map容器
  • 原文地址:https://www.cnblogs.com/LRolinx/p/13850358.html
Copyright © 2011-2022 走看看