canvas画出原子运动图

话不多说直接上代码:


 
 
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>原子</title>
	<style>
		*{
			margin: 0;
			padding: 0;
		}
		html{
			height: 100%;
		}
		body{
			margin: 0;
		    height: 100%;
		    background: #fff;
		}
		canvas{
			display: block;
		}
	</style>
</head>
<body>
	<canvas id="mycanvas"></canvas>
	<script>
	 var All;
	 var arr = [];
	 var current = {};
	 function All() {
	 	 this.canvas = document.getElementById('mycanvas');
		 this.ctx = this.canvas.getContext('2d');//创建上下文
		 var windowW = document.documentElement.clientWidth;
         var windowH = document.documentElement.clientHeight;
         if(windowW > 800){//设置数量
           this.num = 100;
         }else{
           this.num = 60;
         }
         this.canvas.width = windowW;//画布宽
         this.canvas.height = windowH;//画布高
         this.x = Math.random() * windowW;//设置随机X坐标
         this.y = Math.random() * windowH;//设置随机Y坐标
         this.mx = Math.random();//
         this.my = Math.random();//
         this.r = Math.random() * 10;//创建随机半径
         // this.current = {'x':null,'y':null};
         this.canvas.onmousemove = function(e){//监听鼠标移动
         	  e = e || this.event;
			  current.y = e.clientY;
              current.x = e.clientX;
         }
         this.canvas.onmouseout = function(){//监听鼠标离开
         	  current.y = null;
              current.x = null;
         }
		 this.init = function(){//初始化
	     	for(var i = 0; i < this.num; i++){
               arr.push(new All());
	     	}
	     	this.draw();//运行
		 }
		 this.drawCircle = function() {//画圆
           this.ctx.beginPath();//开始一个路径
           this.ctx.arc(this.x,this.y,this.r,0,2*Math.PI);//画圆
           this.ctx.fillStyle = '#999';//填充颜色
           this.ctx.fill();//填充
           this.ctx.closePath();//结束路径
		 }
		 this.drawLine = function(loop){//画线
		   let dx = this.x - loop.x;
		   let dy = this.y - loop.y;
		   let d = Math.sqrt(dx * dx + dy * dy);
		   if(d < 150){
			   this.ctx.beginPath();//开始路径
	           this.ctx.moveTo(this.x,this.y);//起始点
	           this.ctx.lineTo(loop.x,loop.y);//连接
	           this.ctx.strokeStyle = '#999';//设置线颜色
	           this.ctx.stroke();//填充
	           this.ctx.closePath();
		   }
		 }
		 this.move = function(w,h) {//圆圈移动,圆圈移动的距离必须在屏幕范围内
            this.mx = (this.x < w && this.x > 0) ? this.mx : (-this.mx); 
            this.my = (this.y < h && this.y > 0) ? this.my : (-this.my); 
            this.x += this.mx / 2;//随机圆心X
            this.y += this.my / 2;//随机圆心Y
		 }
		 this.mouseOn = function(current) {//监听鼠标鼠标
		 	this.ctx.beginPath();//开始路径
		 	this.r = 8;//圆大小
		 	this.ctx.arc(current.x,current.y,this.r,0,2 * Math.PI);//画圆
		 	this.ctx.fillStyle = 'rgba(255,99,71,.8)';//填充颜色
		 	this.ctx.fill();//填充
		 	this.ctx.closePath();//关闭路径
		 }
		 var self = this;
		 this.draw = function() { //画图逻辑
		 	self.ctx.clearRect(0,0,windowW,windowH); //清除画布
		 	for(var i = 0; i < arr.length; i++){ //循环画圆
		 		arr[i].move(windowW,windowH);//移动
		 		arr[i].drawCircle();//画圆
		 		for(var j = i + 1; j < arr.length; j++){ //圆之间连线
		 			arr[i].drawLine(arr[j]);
		 		}
		 	}
		 	//console.log(current.x)
		 	if(current.x){//鼠标跟踪画图
		 		self.mouseOn(current);//跟踪画圆
		 		for(var k = 0; k < arr.length; k++){//连线
                   self.drawLine(arr[k]);
                   self.x = current.x;//定义鼠标起始位置
                   self.y = current.y;

		 		}
		 	}
		 	requestAnimationFrame(self.draw);//帧播放
		 }
	 }
    window.onload = function() {
        All = (new All).init();
	};
	</script>
</body>
</html>
复制可直接运行。

猜你喜欢

转载自blog.csdn.net/mo_jiu/article/details/79912876
今日推荐