11. Conectamos partículas: dist() y for anidado

Paso 3/4 de práctica 2 "Partículas conectadas"

Las partículas ya se mueven y rebotan. Ahora vamos a dibujar una línea entre cada dos partículas que estén cerca. Para eso necesitamos dos cosas: la función dist() y un bucle for dentro de otro bucle for.

dist(): la distancia entre dos puntos

dist(x1, y1, x2, y2) es una función de p5.js que devuelve la distancia en píxeles entre los puntos (x1, y1) y (x2, y2). Calcula internamente lo mismo que el teorema de Pitágoras, pero sin que tengamos que escribirlo:

let d = dist(px[i], py[i], px[j], py[j]);
// d es la distancia en píxeles entre la partícula i y la partícula j

El for anidado: comparar cada partícula con todas las demás

Para comprobar si dos partículas están cerca necesitamos compararlas de dos en dos. Eso requiere un bucle dentro de otro: el exterior recorre la primera partícula (i), y el interior recorre la segunda (j). En lenguaje natural: «para cada partícula i, compruebo su distancia con cada partícula j»:

../_images/javascript-eg-206.png

Este bloque va dentro de draw(), después del bucle que mueve y dibuja las partículas.

Nota

Vigila dónde declarar la variable dMin.

Revisa no dibujar la línea entre una partícula y ella misma. Si i y j son iguales, no dibujes nada. Para eso usamos un if:

if (i != j && d < dMin) {
  line(px[i], py[i], px[j], py[j]);
}

El programa completo

../_images/javascript-eg-207.png

Nota de rendimiento

Con nb = 50 partículas, el bucle anidado realiza 50 × 50 = 2.500 comparaciones por fotograma. Si aumentas nb a 200 o más y el programa va lento, reduce nb o dMin.

Experimenta

Prueba a cambiar dMin a 50 y luego a 200. ¿Qué efecto tiene sobre la red de conexiones?