前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >程序员蠕动的脑神经

程序员蠕动的脑神经

作者头像
我不是费圆
发布2020-12-17 11:21:30
2370
发布2020-12-17 11:21:30
举报
文章被收录于专栏:鲸鱼动画鲸鱼动画
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>程序员蠕动的脑神经</title>
		<style>
			body,
			html {
				margin: 0px;
				padding: 0px;
				position: fixed;
				background: rgb(30, 30, 30);
				cursor: none;
			}
		</style>
		<script>
			window.requestAnimFrame = (function() {
				return (
					window.requestAnimationFrame ||
					window.webkitRequestAnimationFrame ||
					window.mozRequestAnimationFrame ||
					window.oRequestAnimationFrame ||
					window.msRequestAnimationFrame ||
					function(callback) {
						window.setTimeout(callback);
					}
				);
			});

			function init(elemid) {
				let canvas = document.getElementById(elemid),
					c = canvas.getContext("2d"),
					w = (canvas.width = window.innerWidth),
					h = (canvas.height = window.innerHeight);
				c.fillStyle = "rgba(30,30,30,1)";
				c.fillRect(0, 0, w, h);
				return {
					c: c,
					canvas: canvas
				};
			}
		</script>
	</head>
	<body>

		<canvas id="canvas"></canvas>

	</body>
	<script>
		window.onload = function() {
			//functions definition

			//class definition
			class segm {
				constructor(x, y, l) {
					this.b = Math.random() * 1.9 + 0.1;
					this.x0 = x;
					this.y0 = y;
					this.a = Math.random() * 2 * Math.PI;
					this.x1 = this.x0 + l * Math.cos(this.a);
					this.y1 = this.y0 + l * Math.sin(this.a);
					this.l = l;
				}
				update(x, y) {
					this.x0 = x;
					this.y0 = y;
					this.a = Math.atan2(this.y1 - this.y0, this.x1 - this.x0);
					this.x1 = this.x0 + this.l * Math.cos(this.a);
					this.y1 = this.y0 + this.l * Math.sin(this.a);
				}
			}
			class rope {
				constructor(tx, ty, l, b, slq) {
					this.res = l / slq;
					this.l = l;
					this.segm = [];
					this.segm.push(new segm(tx, ty, this.l / this.res));
					for (let i = 1; i < this.res; i++) {
						this.segm.push(
							new segm(this.segm[i - 1].x1, this.segm[i - 1].y1, this.l / this.res)
						);
					}
					this.b = b;
				}
				update(t) {
					this.segm[0].update(t.x, t.y);
					for (let i = 1; i < this.res; i++) {
						this.segm[i].update(this.segm[i - 1].x1, this.segm[i - 1].y1);
					}
				}
				show(t) {
					if (t == "l") {
						c.beginPath();
						for (let i = 0; i < this.segm.length; i++) {
							c.lineTo(this.segm[i].x0, this.segm[i].y0);
						}
						c.lineTo(
							this.segm[this.segm.length - 1].x1,
							this.segm[this.segm.length - 1].y1
						);
						c.strokeStyle = "white";
						c.lineWidth = this.b;
						c.stroke();

						c.beginPath();
						c.arc(this.segm[0].x0, this.segm[0].y0, 1, 0, 2 * Math.PI);
						c.fillStyle = "white";
						c.fill();

						c.beginPath();
						c.arc(
							this.segm[this.segm.length - 1].x1,
							this.segm[this.segm.length - 1].y1,
							2,
							0,
							2 * Math.PI
						);
						c.fillStyle = "white";
						c.fill();
					} else {
						for (let i = 0; i < this.segm.length; i++) {
							c.beginPath();
							c.arc(this.segm[i].x0, this.segm[i].y0, this.segm[i].b, 0, 2 * Math.PI);
							c.fillStyle = "white";
							c.fill();
						}
						c.beginPath();
						c.arc(
							this.segm[this.segm.length - 1].x1,
							this.segm[this.segm.length - 1].y1,
							2, 0, 2 * Math.PI
						);
						c.fillStyle = "white";
						c.fill();
					}
				}
			}

			//setting up canvas
			let c = init("canvas").c,
				canvas = init("canvas").canvas,
				w = (canvas.width = window.innerWidth),
				h = (canvas.height = window.innerHeight),
				ropes = [];

			//variables definition
			let nameOfVariable = "value",
				mouse = {},
				last_mouse = {},
				rl = 50,
				randl = [],
				target = {
					x: w / 2,
					y: h / 2
				},
				last_target = {},
				t = 0,
				q = 10,
				da = [],
				type = "l";

			for (let i = 0; i < 100; i++) {
				ropes.push(
					new rope(
						w / 2,
						h / 2,
						(Math.random() * 1 + 0.5) * 500,
						Math.random() * 0.4 + 0.1,
						Math.random() * 15 + 5
					)
				);
				randl.push(Math.random() * 2 - 1);
				da.push(0);
			}

			//place for objects in animation
			function draw() {

				if (mouse.x) {
					target.errx = mouse.x - target.x;
					target.erry = mouse.y - target.y;
				} else {
					target.errx =
						w / 2 +
						(h / 2 - q) *
						Math.sqrt(2) *
						Math.cos(t) /
						(Math.pow(Math.sin(t), 2) + 1) -
						target.x;
					target.erry =
						h / 2 +
						(h / 2 - q) *
						Math.sqrt(2) *
						Math.cos(t) *
						Math.sin(t) /
						(Math.pow(Math.sin(t), 2) + 1) -
						target.y;
				}

				target.x += target.errx / 10;
				target.y += target.erry / 10;

				t += 0.01;

				for (let i = 0; i < ropes.length; i++) {
					if (randl[i] > 0) {
						da[i] += (1 - randl[i]) / 10;
					} else {
						da[i] += (-1 - randl[i]) / 10;
					}
					ropes[i].update({
						x: target.x +
							randl[i] * rl * Math.cos((i * 2 * Math.PI) / ropes.length + da[i]),
						y: target.y +
							randl[i] * rl * Math.sin((i * 2 * Math.PI) / ropes.length + da[i])
					});
					if (randl[i] > -0.5) {
						type = "l";
					} else {
						type = "o";
					}
					ropes[i].show(type);
				}
				last_target.x = target.x;
				last_target.y = target.y;
			}

			//mouse position
			canvas.addEventListener(
				"mousemove",
				function(e) {
					last_mouse.x = mouse.x;
					last_mouse.y = mouse.y;

					mouse.x = e.pageX - this.offsetLeft;
					mouse.y = e.pageY - this.offsetTop;
				},
				false
			);

			canvas.addEventListener("mouseleave", function(e) {
				mouse.x = false;
				mouse.y = false;
			});

			//animation frame
			function loop() {
				window.requestAnimFrame(loop);
				c.clearRect(0, 0, w, h);
				draw();
			}

			//window resize
			window.addEventListener("resize", function() {
				(w = canvas.width = window.innerWidth),
				(h = canvas.height = window.innerHeight);
				loop();
			});

			//animation runner
			loop();
			setInterval(loop, 1000 / 60);
		};
	</script>
</html>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-11-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档