const gradient = ctx.createRadialGradient(300, 250, 10, 300, 250, 400); gradient.addColorStop(0, 'rgba(0,255,255,0.7)'); gradient.addColorStop(1, 'rgba(0,0,0,0)'); ctx.beginPath(); ctx.arc(300, 250, 380, 0, Math.PI * 2); ctx.fillStyle = gradient; ctx.fill(); // Dynamic lines connecting particles particles.forEach(particle => { particle.connections.forEach(conn => { ctx.strokeStyle = `rgba(${particle.color.slice(1, -1).split(',').map(c => parseInt(c)).join(',')}, 0.5)`; ctx.beginPath(); ctx.moveTo(particle.x, particle.y); ctx.lineTo(conn.x, conn.y); ctx.stroke(); }); }); requestAnimationFrame(draw); } function update() { particles.forEach(particle => { particle.x += particle.vx; particle.y += particle.vy; // Simple wall collision if (particle.x < 0 || particle.x > canvas.width) particle.vx = -particle.vx; if (particle.y < 0 || particle.y > canvas.height) particle.vy = -particle.vy; const connections = []; particles.forEach(other => { if