Spaces:
Configuration error
Configuration error
| const canvas = document.getElementById('networkCanvas'); | |
| const ctx = canvas.getContext('2d'); | |
| let particles = []; | |
| let isDragging = false; | |
| let dragParticle = null; | |
| const maxParticles = 100; // Maximum number of particles | |
| const dragAreaRadius = 10; // Increased area for easier dragging | |
| // Function to resize canvas based on aspect ratio | |
| function resizeCanvas() { | |
| canvas.width = window.innerWidth; | |
| canvas.height = Math.min(window.innerHeight, 400); // Maintain a max height of 400px | |
| } | |
| // Adjust the canvas size when the window resizes | |
| window.addEventListener('resize', resizeCanvas); | |
| // Initialize canvas size | |
| resizeCanvas(); | |
| class Particle { | |
| constructor(x, y) { | |
| this.x = x; | |
| this.y = y; | |
| this.radius = 4; | |
| this.color = `rgba(0, 255, 204, 1)`; | |
| this.speedX = (Math.random() - 0.5) * 2; // Random horizontal speed | |
| this.speedY = (Math.random() - 0.5) * 2; // Random vertical speed | |
| } | |
| update() { | |
| if (!isDragging || dragParticle !== this) { | |
| this.x += this.speedX; | |
| this.y += this.speedY; | |
| // Bounce off the edges of the canvas | |
| if (this.x < 0 || this.x > canvas.width) { | |
| this.speedX *= -1; | |
| } | |
| if (this.y < 0 || this.y > canvas.height) { | |
| this.speedY *= -1; | |
| } | |
| } | |
| } | |
| draw() { | |
| ctx.beginPath(); | |
| ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false); | |
| ctx.fillStyle = this.color; | |
| ctx.fill(); | |
| } | |
| isMouseOver(mouseX, mouseY) { | |
| // Increase the draggable area by checking if the mouse is within a larger radius | |
| return Math.hypot(mouseX - this.x, mouseY - this.y) < dragAreaRadius; | |
| } | |
| } | |
| function connectParticles() { | |
| for (let i = 0; i < particles.length; i++) { | |
| for (let j = i + 1; j < particles.length; j++) { | |
| const distance = Math.hypot(particles[i].x - particles[j].x, particles[i].y - particles[j].y); | |
| if (distance < 150) { | |
| ctx.beginPath(); | |
| ctx.moveTo(particles[i].x, particles[i].y); | |
| ctx.lineTo(particles[j].x, particles[j].y); | |
| ctx.strokeStyle = `rgba(0, 255, 204, ${1 - distance / 150})`; | |
| ctx.stroke(); | |
| } | |
| } | |
| } | |
| } | |
| function initParticles(num) { | |
| for (let i = 0; i < num; i++) { | |
| particles.push(new Particle(Math.random() * canvas.width, Math.random() * canvas.height)); | |
| } | |
| } | |
| function animate() { | |
| ctx.clearRect(0, 0, canvas.width, canvas.height); | |
| particles.forEach(particle => { | |
| particle.update(); | |
| particle.draw(); | |
| }); | |
| connectParticles(); | |
| requestAnimationFrame(animate); | |
| } | |
| // Handle mouse click to create a new particle | |
| canvas.addEventListener('click', (e) => { | |
| const rect = canvas.getBoundingClientRect(); | |
| const mouseX = e.clientX - rect.left; | |
| const mouseY = e.clientY - rect.top; | |
| const newParticle = new Particle(mouseX, mouseY); | |
| particles.push(newParticle); | |
| // Limit the number of particles to the maximum | |
| if (particles.length > maxParticles) { | |
| particles.shift(); // Remove the oldest particle | |
| } | |
| }); | |
| // Handle mouse down for dragging | |
| canvas.addEventListener('mousedown', (e) => { | |
| const rect = canvas.getBoundingClientRect(); | |
| const mouseX = e.clientX - rect.left; | |
| const mouseY = e.clientY - rect.top; | |
| for (let particle of particles) { | |
| if (particle.isMouseOver(mouseX, mouseY)) { | |
| isDragging = true; | |
| dragParticle = particle; | |
| break; | |
| } | |
| } | |
| }); | |
| // Handle mouse move for dragging | |
| canvas.addEventListener('mousemove', (e) => { | |
| if (isDragging && dragParticle) { | |
| const rect = canvas.getBoundingClientRect(); | |
| const mouseX = e.clientX - rect.left; | |
| const mouseY = e.clientY - rect.top; | |
| dragParticle.x = mouseX; | |
| dragParticle.y = mouseY; | |
| } | |
| }); | |
| // Handle mouse up to stop dragging | |
| canvas.addEventListener('mouseup', () => { | |
| isDragging = false; | |
| dragParticle = null; | |
| }); | |
| // Initialize and start the animation | |
| initParticles(maxParticles); | |
| animate(); |