1. 程式人生 > >canvas實現背景連線

canvas實現背景連線

 

<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8" />
		<title>canvas背景連線</title>
		<meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
		<meta name="apple-mobile-web-app-capable" content="yes">
		<meta name="format-detection" content="telephone=no" />
		<meta name="apple-mobile-web-app-status-bar-style" content="black">
		<link rel="stylesheet" href="css/common.css">
	</head>
	<style type="text/css">
		body {
			padding-top: constant(safe-area-inset-top); //為導航欄+狀態列的高度 88px            
			padding-left: constant(safe-area-inset-left); //如果未豎屏時為0                
			padding-right: constant(safe-area-inset-right); //如果未豎屏時為0                
			padding-bottom: constant(safe-area-inset-bottom); //為底下圓弧的高度 34px       
		}
		
		#canvas {
			display: block;
			background: #000;
			margin: 0 auto;
			
		}
	</style>

	<body>
		<!--------畫布------->
		<canvas id="canvas"></canvas>

		<script>
			// 面向物件組合模式:建構函式放私有屬性  原型裡面放公共的方法(除objcet外,其餘的都有原型)
			function Stayrry() { //建構函式
				//建構函式裡面的this是可以被原型呼叫的,this是指向你當前例項化的物件的
				this.cxt = canvas.getContext('2d'); //構建畫布
				canvas.width = window.innerWidth;
				canvas.height = window.innerHeight;
				this.cW = canvas.width;
				this.cH = canvas.height;
				this.num = 200;
				this.data = []; //儲存粒子的屬性
			}
			Stayrry.prototype = { //原型
				//初始化粒子:實心圓
				init: function() {
					for(var i = 0; i < this.num; i++) {
						this.data[i] = {
							x: Math.random() * this.cW,
							y: Math.random() * this.cH,
							cx: Math.random() * 0.6 - 0.3,
							cy: Math.random() * 0.6 - 0.3
						}
						this.drawCircle(this.data[i].x, this.data[i].y);
					}
					console.log(this.data);
				},
				//繪製粒子
				drawCircle: function(x, y) {
					var cxt = this.cxt;
					cxt.save(); //儲存路徑
					cxt.fillStyle = "red";
					cxt.beginPath(); //開始路徑
					cxt.arc(x, y, 5, 0, Math.PI * 2, false);
					cxt.closePath(); //結束路徑
					cxt.fill(); //填充方法
					cxt.restore(); //釋放路徑
				},
				//繪製線條
				drawLine: function(x1, y1, x2, y2) {
					var cxt = this.cxt;
					var color = cxt.createLinearGradient(x1, y1, x2, y2);
					color.addColorStop(0, "#369");
					color.addColorStop(1, "#333");
					cxt.save();
					cxt.strokeStyle = color;
					cxt.beginPath();
					cxt.moveTo(x1, y1);
					cxt.lineTo(x2, y2);
					cxt.closePath(); //結束路徑
					cxt.stroke(); //線條方法
					cxt.restore(); //釋放路徑
				},
				//粒子運動
				moveCircle: function() {
					var self = this;
					self.cxt.clearRect(0, 0, self.cW, self.cH); //清除畫布
					//模擬的速度增量
					for(var i = 0; i < self.num; i++) { //上一個點
						self.data[i].x += self.data[i].cx;
						self.data[i].y += self.data[i].cy;
						//邊界值判斷
						if(self.data[i].x > self.cW || self.data[i].x < 0) {
							self.data[i].cx = -self.data[i].cx
						}
						if(self.data[i].y > self.cH || self.data[i].y < 0) {
							self.data[i].cy = -self.data[i].cy
						}
						this.drawCircle(self.data[i].x, self.data[i].y);
						//用勾股定理判斷是否連線
						for(var j = i + 1; j < self.num; j++) { //下一個點
							if(Math.pow(self.data[i].x - self.data[j].x, 2) + Math.pow(self.data[i].y - self.data[j].y, 2) < 50 * 50) {
								self.drawLine(self.data[i].x, self.data[i].y, self.data[j].x, self.data[j].y);
							}
						}
					}
				}

			}
			var stayrry = new Stayrry(); //生成的例項化物件,new出來的物件可以呼叫原型上的方法\
			stayrry.init();
			setInterval(function() {
					stayrry.moveCircle();
				}, 3)
				//			canvas:基於原生js操控
				//				1.可以取代頁面中大量生成dom節點的操作
				//				2.大屏資料展示
				//				3.遊戲
				//				4.webgl/three.js基於canvas
		</script>
	</body>

</html>