Spaces:
Runtime error
Runtime error
File size: 3,650 Bytes
c0adbf1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
let w, h;
const ctx = canvas.getContext("2d");
const { sin, cos, PI, hypot, min, max } = Math;
function spawn() {
const pts = many(333, () => {
return {
x: rnd(innerWidth),
y: rnd(innerHeight),
len: 0,
r: 0
};
});
const pts2 = many(9, (i) => {
return {
x: cos((i / 9) * PI * 2),
y: sin((i / 9) * PI * 2)
};
});
let seed = rnd(100)
let tx = rnd(innerWidth);
let ty = rnd(innerHeight);
let x = rnd(innerWidth)
let y = rnd(innerHeight)
let kx = rnd(0.8, 0.8)
let ky = rnd(0.8, 0.8)
let walkRadius = pt(rnd(50,50), rnd(50,50))
let r = innerWidth / rnd(100, 150);
function paintPt(pt){
pts2.forEach((pt2) => {
if (!pt.len )
return
drawLine(
lerp(x + pt2.x * r, pt.x, pt.len * pt.len),
lerp(y + pt2.y * r, pt.y, pt.len * pt.len),
x + pt2.x * r,
y + pt2.y * r
);
});
drawCircle(pt.x, pt.y, pt.r);
}
return {
follow(x,y) {
tx = x;
ty = y;
},
tick(t) {
const selfMoveX = cos(t*kx+seed)*walkRadius.x;
const selfMoveY = sin(t*ky+seed)*walkRadius.y;
let fx = tx + selfMoveX;
let fy = ty + selfMoveY;
x += min(innerWidth/100, (fx - x)/10)
y += min(innerWidth/100, (fy - y)/10)
let i = 0
pts.forEach((pt) => {
const dx = pt.x - x,
dy = pt.y - y;
const len = hypot(dx, dy);
let r = min(2, innerWidth / len / 5);
pt.t = 0;
const increasing = len < innerWidth / 10
&& (i++) < 8;
let dir = increasing ? 0.1 : -0.1;
if (increasing) {
r *= 1.5;
}
pt.r = r;
pt.len = max(0, min(pt.len + dir, 1));
paintPt(pt)
});
}
}
}
const spiders = many(2, spawn)
addEventListener("pointermove", (e) => {
spiders.forEach(spider => {
spider.follow(e.clientX, e.clientY)
})
});
requestAnimationFrame(function anim(t) {
if (w !== innerWidth) w = canvas.width = innerWidth;
if (h !== innerHeight) h = canvas.height = innerHeight;
ctx.fillStyle = "#000";
drawCircle(0, 0, w * 10);
ctx.fillStyle = ctx.strokeStyle = "#fff";
t/=1000
spiders.forEach(spider => spider.tick(t))
requestAnimationFrame(anim);
});
function recalc(X, Y) {
tx = X;
ty = Y;
}
function rnd(x = 1, dx = 0) {
return Math.random() * x + dx;
}
function drawCircle(x, y, r, color) {
ctx.beginPath();
ctx.ellipse(x, y, r, r, 0, 0, PI * 2);
ctx.fill();
}
function drawLine(x0, y0, x1, y1) {
ctx.beginPath();
ctx.moveTo(x0, y0);
many(100, (i) => {
i = (i + 1) / 100;
let x = lerp(x0, x1, i);
let y = lerp(y0, y1, i);
let k = noise(x/5+x0, y/5+y0) * 2;
ctx.lineTo(x + k, y + k);
});
ctx.stroke();
}
function many(n, f) {
return [...Array(n)].map((_, i) => f(i));
}
function lerp(a, b, t) {
return a + (b - a) * t;
}
function noise(x, y, t = 101) {
let w0 = sin(0.3 * x + 1.4 * t + 2.0 +
2.5 * sin(0.4 * y + -1.3 * t + 1.0));
let w1 = sin(0.2 * y + 1.5 * t + 2.8 +
2.3 * sin(0.5 * x + -1.2 * t + 0.5));
return w0 + w1;
}
function pt(x,y){
return {x,y}
} |