La distancia indica qué tan separados están dos puntos. Se obtiene con el teorema de Pitágoras y permite resolver problemas de proximidad, alcance, colisiones, selección y movimiento en gráficos 2D.
Conocer las posiciones A y B no nos dice de inmediato qué tan lejos están. Para medir su separación necesitamos un valor que no dependa de la orientación: la distancia. Esta medida siempre es cero o positiva y se expresa en las mismas unidades que las coordenadas.
En una escena, la distancia puede decidir si un personaje alcanzó un objetivo, si el puntero está cerca de un control o si dos objetos circulares se tocan.
Dados A = (x₁, y₁) y B = (x₂, y₂), la diferencia horizontal y la diferencia vertical forman los catetos de un triángulo rectángulo. El segmento directo entre A y B es su hipotenusa.
Primero restamos las coordenadas correspondientes. El orden elegido no cambia la distancia final porque las diferencias se elevan al cuadrado.
Si A = (2, 1) y B = (7, 5), entonces Δx = 5 y Δy = 4. Estos valores describen cuánto habría que desplazarse horizontal y verticalmente para ir de A hasta B.
En un triángulo rectángulo, el cuadrado de la hipotenusa es igual a la suma de los cuadrados de los catetos:
Sustituyendo las diferencias obtenemos la fórmula general:
Calculemos la distancia entre A = (1, 2) y B = (5, 5):
Este es el conocido triángulo 3-4-5. Aunque A y B se encuentren en otros cuadrantes, el procedimiento es exactamente el mismo.
Arrastra los puntos A y B. La simulación dibuja el triángulo rectángulo, calcula Δx, Δy y la distancia, y comprueba si B se encuentra dentro del alcance circular definido alrededor de A.
Intercambiar A y B cambia los signos de Δx y Δy, pero no modifica la distancia. Esto permite comprobar visualmente su propiedad simétrica.
Math.hypot calcula la raíz cuadrada de la suma de cuadrados y expresa directamente la intención del programa:
function distancia(a, b) {
const dx = b.x - a.x;
const dy = b.y - a.y;
return Math.hypot(dx, dy);
}
const a = { x: 1, y: 2 };
const b = { x: 5, y: 5 };
console.log(distancia(a, b));
También podría escribirse Math.sqrt(dx * dx + dy * dy). Ambas expresiones producen el mismo resultado.
Cuando solo necesitamos saber si una distancia es menor que un límite, podemos comparar los cuadrados. Así evitamos calcular una raíz cuadrada en cada comprobación.
function estaDentroDelAlcance(a, b, alcance) {
const dx = b.x - a.x;
const dy = b.y - a.y;
return dx * dx + dy * dy <= alcance * alcance;
}
console.log(
estaDentroDelAlcance({ x: 0, y: 0 }, { x: 3, y: 4 }, 5)
);
Esta optimización resulta útil al comprobar miles de partículas, enemigos o puntos en cada cuadro.
La fórmula funciona en cualquier unidad, pero ambos puntos deben pertenecer al mismo sistema. Si un punto está en metros del mundo y otro en píxeles de pantalla, el resultado no tendrá un significado válido.
Con una escala de 20 píxeles por unidad, una distancia de 5 unidades se muestra como 100 píxeles. El zoom altera el tamaño visual, pero no la distancia lógica del mundo.
La fórmula estudiada calcula la distancia euclídea, es decir, la longitud de la línea recta. No es la única manera de medir separación.
| Métrica | Fórmula | Uso frecuente |
|---|---|---|
| Euclídea | √(Δx² + Δy²) | Movimiento libre y radios circulares |
| Manhattan | |Δx| + |Δy| | Cuadrículas con movimiento horizontal y vertical |
| Máximo | máx(|Δx|, |Δy|) | Cuadrículas que permiten diagonales |
La métrica correcta depende de los movimientos permitidos y de la geometría del problema.
Math.hypot(dx, dy) implementa directamente el cálculo.La distancia convierte dos posiciones en una medida única de separación. Su relación con Pitágoras permite comprender la fórmula y aplicarla correctamente en problemas de proximidad, alcance y movimiento.
En el próximo tema utilizaremos las coordenadas de dos extremos para encontrar el punto medio de un segmento.