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.
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:
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:
θ = 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.
| (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:
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.
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:
- Convertir cada vector a componentes cartesianas.
- Sumar x e y por separado.
- 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.
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°).
- Convertí ambos a componentes.
- Calculá la suma cartesiana.
- Convertí la resultante a polar.
- Normalizá el ángulo a [0°, 360°).
- 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.