95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Particle Sim
 | |
| localeTitle: Particle Sí
 | |
| ---
 | |
| ## Simulación de partículas en lienzo
 | |
| 
 | |
| En esta guía, vamos a construir una simulación de partículas básica en Canvas usando principios simples de animación.
 | |
| 
 | |
| Queremos configurar una matriz de partículas con aceleraciones y velocidades. Crearemos 100 partículas en puntos aleatorios en el lienzo.
 | |
| 
 | |
| ```js
 | |
| canvas = document.getElementById("canvas"); 
 | |
|  ctx = canvas.getContext('2d'); 
 | |
|  
 | |
|  var particles = []; 
 | |
|  for(var i=0; i<100; i++) { 
 | |
|   particles.push( 
 | |
|     { 
 | |
|       x:Math.random()*canvas.width, 
 | |
|       y:Math.random()*canvas.height, 
 | |
|       vx:0, 
 | |
|       vy:0, 
 | |
|       ax:0, 
 | |
|       ay:0 
 | |
|     } 
 | |
|   ); 
 | |
|  } 
 | |
| ```
 | |
| 
 | |
| En nuestro ciclo de dibujo, renderizamos estas partículas.
 | |
| 
 | |
| ```js
 | |
| function draw() { 
 | |
|   ctx.clearRect(0, 0, canvas.width, canvas.height); 
 | |
|   for(var i=0; i<particles.length; i++) { 
 | |
|     // update state 
 | |
|  
 | |
|     // render state 
 | |
|     ctx.beginPath(); 
 | |
|     ctx.arc(particles[i].x, particles[i].y, 5, 0, 2*Math.PI); 
 | |
|     ctx.fill(); 
 | |
|   } 
 | |
|  
 | |
|   window.requestAnimationFrame(draw); 
 | |
|  } 
 | |
|  window.requestAnimationFrame(draw); 
 | |
| ```
 | |
| 
 | |
| Ahora, todo lo que necesitamos hacer es actualizar la velocidad y la aceleración de cada fotograma. Agregaremos la aceleración a la velocidad y agregaremos la velocidad a la posición.
 | |
| 
 | |
| ```js
 | |
| function draw() { 
 | |
|   for(var i=0; i<particles.length; i++) { 
 | |
|     // update state 
 | |
|     particles[i].x+=particles[i].vx; 
 | |
|     particles[i].y+=particles[i].vy; 
 | |
|     particles[i].vx+=particles[i].ax; 
 | |
|     particles[i].vy+=particles[i].ay; 
 | |
|  
 | |
|     /* render code */ 
 | |
|   } 
 | |
|  
 | |
|   window.requestAnimationFrame(draw); 
 | |
|  } 
 | |
|  window.requestAnimationFrame(draw); 
 | |
| ```
 | |
| 
 | |
| ¡Eso es! Todo lo que tenemos que hacer es crear una fuerza en alguna parte. Vamos a hacerlo con un oyente de clic.
 | |
| 
 | |
| ```js
 | |
| canvas.addEventListener("click", function(e) { 
 | |
|   var clickX = e.clientX-canvas.offsetLeft; 
 | |
|   var clickY = e.clientY-canvas.offsetTop; 
 | |
|   for(var i=0; i<particles.length; i++) { 
 | |
|     var delx = particles[i].x-clickX; 
 | |
|     var dely = particles[i].y-clickY; 
 | |
|     var magnitudeSquared = Math.pow(delx, 2)+Math.pow(dely, 2); 
 | |
|  
 | |
|  
 | |
|     particles[i].ax = 0.1*delx/magnitudeSquared; 
 | |
|     particles[i].ay = 0.1*dely/magnitudeSquared; 
 | |
|  
 | |
|   } 
 | |
|  }); 
 | |
| ```
 | |
| 
 | |
| Esto agrega fuerza a través de la ley del cuadrado inverso. Vea [esta página](#placeholder) para más detalles.
 | |
| 
 | |
| ¡Eso es todo! El codepen final:
 | |
| 
 | |
| Vea el Simulador de [Partículas de](https://codepen.io/alanluo/pen/OjMbpm/) Pluma [(FCC)](https://codepen.io/alanluo/pen/OjMbpm/) de Alan Luo ( [@alanluo](https://codepen.io/alanluo) ) en [CodePen](https://codepen.io) .
 | |
| 
 | |
| #### Más información:
 | |
| 
 | |
| *   [API MDN Canvas](https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API) |