17. Coordenadas polares y conversión con coordenadas cartesianas

Un vector del plano puede describirse mediante componentes x e y o mediante una distancia radial y un ángulo; ambas formas representan la misma entidad.

17.1 Dos formas de describir el plano

Las coordenadas cartesianas utilizan desplazamientos sobre dos ejes perpendiculares: (x, y). Las coordenadas polares utilizan una distancia al origen r y un ángulo θ: (r, θ).

La representación cartesiana facilita sumas y operaciones por componentes. La polar hace explícitos el módulo y la orientación, por lo que resulta natural para giros, direcciones radiales y datos de sensores angulares.

No son dos vectores diferentes: (x, y) y (r, θ) son dos descripciones del mismo vector respecto del mismo origen y convención angular.

17.2 Elementos del sistema polar

  • Un polo, equivalente al origen.
  • Un eje polar, habitualmente +x.
  • Una distancia radial r desde el polo.
  • Un ángulo θ medido desde el eje polar.
  • Una convención para el sentido positivo de los ángulos.

Usaremos r ≥ 0 y ángulos positivos en sentido antihorario desde +x.

17.3 De polar a cartesiano

Las componentes son las proyecciones del radio sobre los ejes:

x = r cos θ
y = r sen θ

Para r = 10 m y θ = 30°, x ≈ 8,66 m e y = 5 m.

function polarACartesiano(r, grados) {
  const theta = grados * Math.PI / 180;
  return { x: r * Math.cos(theta), y: r * Math.sin(theta) };
}

console.log(polarACartesiano(10, 30));

17.4 De cartesiano a polar

Recuperamos radio y ángulo mediante:

r = √(x² + y²)
θ = atan2(y, x)

Math.atan2(y, x) devuelve un ángulo entre −π y π y distingue los cuatro cuadrantes.

function cartesianoAPolar(x, y) {
  const r = Math.hypot(x, y);
  const grados = r === 0 ? null : Math.atan2(y, x) * 180 / Math.PI;
  return { r, grados };
}

console.log(cartesianoAPolar(-3, 4));

17.5 Por qué usar atan2 y no atan

La razón y/x es idéntica para vectores opuestos, de modo que Math.atan(y / x) no puede determinar por sí sola el cuadrante. Además, dividir por x falla conceptualmente cuando x = 0.

Ejemplos que atan2 distingue correctamente.
(x, y)atan2(y, x)Orientación
(1, 1)45°Cuadrante I
(−1, 1)135°Cuadrante II
(−1, −1)−135°Cuadrante III
(1, −1)−45°Cuadrante IV

17.6 Grados y radianes

JavaScript utiliza radianes en sus funciones trigonométricas:

radianes = grados × π / 180
grados = radianes × 180 / π

Conviene indicar la unidad angular en nombres como anguloRad o anguloGrados para no mezclarlas.

17.7 Normalizar ángulos

Los ángulos que difieren en vueltas completas representan la misma orientación. Podemos expresar cualquier ángulo dentro de [0°, 360°):

function normalizarGrados(grados) {
  return ((grados % 360) + 360) % 360;
}

console.log(normalizarGrados(-45));
console.log(normalizarGrados(765));

Otra convención común utiliza [−180°, 180°). La elección depende de la interfaz y no cambia el vector.

17.8 El origen y su ángulo indeterminado

Cuando r = 0, todos los ángulos producen x = 0 e y = 0. Por eso el origen no posee una dirección polar única.

Aunque Math.atan2(0, 0) devuelve 0 en JavaScript, una función física debe reconocer el caso y devolver, por ejemplo, null para el ángulo.

17.9 Radios negativos

Algunas formulaciones matemáticas admiten r negativo. El par (−r, θ) representa el mismo punto que (r, θ + 180°). Para evitar duplicidad, en física y programación suele preferirse r ≥ 0.

(−5, 30°) equivale a (5, 210°)

Si una entrada contiene radio negativo, podemos cambiar su signo y sumar 180° al ángulo antes de normalizar.

17.10 Sumar vectores polares

No se suman directamente radios y ángulos. Para sumar vectores polares:

  1. Convertir cada vector a componentes cartesianas.
  2. Sumar x e y por separado.
  3. Convertir la resultante a polar si se necesita módulo y ángulo.
const desdePolar = (r, g) => ({
  x: r * Math.cos(g * Math.PI / 180),
  y: r * Math.sin(g * Math.PI / 180)
});
const a = desdePolar(5, 20), b = desdePolar(4, 130);
const suma = { x: a.x + b.x, y: a.y + b.y };
console.log(suma, { r: Math.hypot(suma.x, suma.y), grados: Math.atan2(suma.y, suma.x) * 180 / Math.PI });

17.11 Diferencia angular mínima

Restar ángulos directamente puede elegir el giro largo. Entre 350° y 10°, la diferencia útil es 20°, no −340°. Para obtener una diferencia dentro de [−180°, 180°):

function diferenciaAngular(destino, actual) {
  return ((destino - actual + 180) % 360 + 360) % 360 - 180;
}

console.log(diferenciaAngular(10, 350));

El signo indica el sentido del giro según la convención elegida.

17.12 Aplicaciones

  • Representar alcance y orientación de sensores.
  • Ubicar objetos alrededor de un centro.
  • Construir direcciones desde la orientación de un vehículo.
  • Generar puntos sobre circunferencias.
  • Interpretar controles radiales y brújulas.
  • Comparar orientaciones y calcular giros mínimos.

Cuando una operación necesita sumas o productos, suele convenir convertir temporalmente a cartesiano.

17.13 Laboratorio polar-cartesiano

Elegí qué representación controla el vector. También podés arrastrar la punta. La cuadrícula circular muestra radios y los rayos marcan ángulos.

Cartesiano
Radio
Ángulo atan2
Ángulo normalizado
Cuadrante

El mismo vector se muestra en las dos representaciones.

17.14 Extensión a coordenadas cilíndricas

En 3D, las coordenadas cilíndricas agregan una altura z al par polar (r, θ). La conversión es x = r cos θ, y = r sen θ, mientras z se conserva.

Son útiles cuando un problema tiene simetría alrededor de un eje. Las coordenadas esféricas incorporan un segundo ángulo y requieren convenciones adicionales.

17.15 Errores frecuentes

  • Intercambiar seno y coseno sin revisar el eje angular.
  • Pasar grados a funciones que esperan radianes.
  • Usar atan(y/x) y perder el cuadrante.
  • Asignar dirección al vector de radio cero.
  • Sumar radios y ángulos como si fueran componentes cartesianas.
  • Confundir ángulos equivalentes con orientaciones diferentes.
  • No aclarar la convención para ángulos o radios negativos.

17.16 Ejercicio integrador

Dos desplazamientos se expresan en polar: a = (8 m, 25°) y b = (5 m, 140°).

  1. Convertí ambos a componentes.
  2. Calculá la suma cartesiana.
  3. Convertí la resultante a polar.
  4. Normalizá el ángulo a [0°, 360°).
  5. Explicá por qué no sería correcto sumar directamente radios y ángulos.
Ver solución y código

a ≈ (7,25; 3,38) m y b ≈ (−3,83; 3,21) m. La suma es ≈ (3,42; 6,59) m. Su radio es ≈ 7,43 m y su ángulo ≈ 62,58°. Sumar (13 m, 165°) describiría otro vector.

const polar = (r, grados) => {
  const t = grados * Math.PI / 180;
  return { x: r * Math.cos(t), y: r * Math.sin(t) };
};
const a = polar(8, 25), b = polar(5, 140);
const suma = { x: a.x + b.x, y: a.y + b.y };
const radio = Math.hypot(suma.x, suma.y);
const angulo = Math.atan2(suma.y, suma.x) * 180 / Math.PI;
const normalizado = ((angulo % 360) + 360) % 360;
console.log({ a, b, suma, radio, angulo, normalizado });

17.17 Ideas para recordar

  • Cartesiano usa (x, y); polar usa (r, θ).
  • De polar a cartesiano: x = r cos θ, y = r sen θ.
  • De cartesiano a polar: r = hypot(x, y), θ = atan2(y, x).
  • El origen tiene ángulo indeterminado.
  • Ángulos que difieren en vueltas completas son equivalentes.
  • Para sumar vectores polares conviene convertirlos a cartesianas.
  • La diferencia angular mínima evita giros innecesariamente largos.

En el próximo tema estudiaremos cambios de base y transformaciones entre sistemas de referencia.