16. Normalización de vectores

Normalizar conserva la dirección de un vector y ajusta su longitud a uno. Así podemos separar «hacia dónde» se mueve un objeto de «a qué velocidad» debe hacerlo.

16.1 Introducción

Un vector como (8, 6) contiene dos datos a la vez: dirección y tamaño. En muchas operaciones solo interesa la dirección. La normalización elimina el tamaño y deja un vector unitario.

Esto evita que el movimiento diagonal sea más rápido que el horizontal o vertical y simplifica el control de fuerzas, cámaras y seguimiento de objetivos.

16.2 Vector unitario

Un vector unitario tiene magnitud exactamente igual a uno.

|v̂| = 1

El símbolo v̂ se lee «v sombrero» y suele representar la versión normalizada de v. Hay infinitos vectores unitarios: cada dirección posible tiene uno.

16.3 Fórmula de normalización

Dividimos cada componente por la longitud del vector original:

v̂ = v / |v|
v̂ = (vx / |v|, vy / |v|)

La división escala el vector por el recíproco de su longitud. Si medía 5, multiplicamos por 1/5.

16.4 Ejemplo con (3, 4)

La magnitud de v = (3, 4) es 5. Por lo tanto:

v̂ = (3/5, 4/5) = (0.6, 0.8)

Al comprobar su longitud obtenemos √(0.6² + 0.8²) = 1.

16.5 Interpretación geométrica

Vector original tres cuatro y vector unitario cero punto seis cero punto ocho con la misma dirección
El vector unitario apunta igual que el original, pero termina sobre la circunferencia de radio uno.

La normalización no rota el vector. Solo lo escala hasta que su punta queda sobre el círculo unitario centrado en el origen.

16.6 Misma dirección, otra longitud

Para cualquier vector no nulo, v̂ es un múltiplo positivo de v. Por eso ambos son paralelos y tienen exactamente el mismo sentido.

v = |v| · v̂

Esta ecuación también permite reconstruir un vector de cualquier tamaño a partir de su dirección normalizada.

16.7 El vector nulo

El vector (0, 0) no puede normalizarse porque su magnitud es cero y no se puede dividir por cero. Además, no tiene dirección que conservar.

normalizar(0, 0) no está definido

En un programa se debe comprobar este caso antes de dividir.

16.8 Dirección hacia un objetivo

Para obtener una dirección desde una posición A hasta una posición B, primero restamos y después normalizamos:

dirección = normalizar(B − A)

El resultado apunta al objetivo y tiene longitud uno, sin importar la distancia original.

16.9 Movimiento a rapidez constante

Una vez normalizada la dirección, la multiplicamos por la rapidez deseada:

velocidad = normalizar(dirección) · rapidez

Con esto, todos los movimientos recorren la misma cantidad de unidades por segundo, incluso cuando combinan x e y.

16.10 Simulación interactiva

Modifica el vector original. El vector cian conserva sus componentes y el amarillo muestra su versión unitaria. Activa la circunferencia para verificar visualmente que el resultado mide uno.

Originalv = (3, 4)
Magnitud|v| = 5
Unitariov̂ = (0.6, 0.8)
Estadolongitud 1

16.11 Normalizar en JavaScript

function normalizar(v) {
  const longitud = Math.hypot(v.x, v.y);
  if (longitud === 0) return { x: 0, y: 0 };
  return { x: v.x / longitud, y: v.y / longitud };
}

const v = { x: 3, y: 4 };
const unitario = normalizar(v);
console.log(unitario); // { x: 0.6, y: 0.8 }

La función debe llamarse y su valor de retorno debe mostrarse. Prueba otros componentes:

Entradav = (3, 4)
Longitud original5
Resultado devuelto{ x: 0.6, y: 0.8 }
Comprobaciónlongitud = 1

Devolver {x:0,y:0} para la entrada nula es una decisión práctica habitual; otra opción es devolver null para obligar a tratar el caso especial.

16.12 Entrada diagonal

Si se suman teclas derecha y arriba se obtiene (1, 1), cuya longitud es √2. Sin normalizar, ese movimiento sería aproximadamente 41 % más rápido.

normalizar(1, 1) = (0.707, 0.707)

Luego se multiplica por la rapidez del personaje para que todas las direcciones tengan el mismo ritmo.

16.13 Seguimiento y orientación

En comportamientos de persecución, el vector objetivo − posición cambia según la distancia. Al normalizarlo obtenemos solo la orientación; después elegimos una rapidez independiente de dónde esté el objetivo.

16.14 Fuerzas y empujes

Una dirección normalizada permite aplicar una fuerza de intensidad controlada. Por ejemplo, una explosión puede empujar a cada objeto en la dirección desde el centro hasta él, multiplicada por la potencia elegida.

16.15 Relación con ángulos

Un vector unitario con ángulo θ tiene las componentes (cos θ, sen θ). La trigonometría convierte así un ángulo directamente en una dirección de longitud uno.

(cos θ, sen θ) siempre tiene magnitud 1

16.16 Errores comunes

  • Dividir por cero al normalizar el vector nulo.
  • Olvidar calcular la raíz cuadrada en la magnitud.
  • Normalizar una posición cuando se necesitaba un desplazamiento.
  • Usar el vector normalizado como si conservara la velocidad original.
  • Normalizar después de multiplicar por la rapidez y perder esa rapidez.
  • Modificar el vector original cuando debe conservarse.

16.17 Qué debes recordar

  • Un vector normalizado tiene longitud uno.
  • v̂ = v / |v| para v ≠ 0.
  • La normalización conserva dirección y sentido.
  • El vector nulo requiere un tratamiento especial.
  • Una dirección normalizada se multiplica por rapidez para crear velocidad.
  • Evita que el movimiento diagonal sea más rápido.

16.18 Conclusión

Normalizar permite trabajar con direcciones puras. Al separar dirección y magnitud, el código de movimiento se vuelve predecible y las velocidades, fuerzas y orientaciones se controlan con precisión.

En el próximo tema usaremos vectores para expresar dirección y desplazamiento entre posiciones.