A veces es realmente difícil convertir las coordenadas cartesianas en coordenadas (x,y)
polares (r,phi)
. Si bien se puede calcular r = sqrt(x^2+y^2)
con bastante facilidad, a menudo es necesario algún tipo de distinción de los casos cuando se calcula el ángulo phi
debido arcsin
, arccos
y arctan
y todas las demás funciones trigonométricas tener un co-dominio que cada uno sólo vanos medio del círculo.
En muchos idiomas hay incorporados para convertir coordenadas rectangulares a polares, o al menos tienen una atan2
función que, dada (x,y)
, calcula el ángulo phi
.
Tarea
Su tarea es escribir un programa / función que tome dos coordenadas cartesianas (de coma flotante, no ambas cero) (x,y)
y genere el ángulo polar correspondiente phi
, donde phi
debe estar en grados, radianes o grados (con grados me refiero a gradientes que son 1 / 400 del círculo completo), lo que sea más conveniente para usted.
El ángulo se mide en orientación positiva, y tenemos el ángulo cero para (1,0)
.
Detalles
Está prohibido utilizar muebles empotrados que permiten calcular el ángulo phi
dado dos coordenadas, incluyendo atan2
, rect2polar
, argOfComplexNumber
y funciones similares. Sin embargo, puede usar las funciones trigonométricas habituales y sus reversos, que solo requieren un argumento. Cualquier símbolo de unidad es opcional.
El radio r
debe ser no negativo y phi
debe estar en el rango [-360°, 360°]
(no importa si se emite 270°
o no -90°
).
Ejemplos
Input Output
(1,1) 45°
(0,3) 90°
(-1,1) 135°
(-5,0) 180°
(-2,-2) 225°
(0,-1.5) 270°
(4,-5) 308.66°
fuente
Respuestas:
MATL , 12 bytes
El resultado está en radianes.
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
MATL no tiene una
atan
función (síatan2
, pero no se puede usar para este desafío). Entonces recurrí aacos
.fuente
0<?_
, reduciendo unos pocos bytes|
). Pero aquí estoy cambiando signo del resultado basado en el signo de la segunda entrada ,y
. Además,y
puede ser0
, así que no puedo multiplicar pory/abs(y))
JavaScript (ES6),
5040 bytesEl resultado está en radianes. Editar: guarde 10 bytes cuando noté que está permitido que el resultado esté entre -90 ° y 270 °. Versión anterior con
-Math.PI<=result<Math.PI
:fuente
||0
de?x=y=0
caso.MATLAB / Octave, 24 bytes
Esto define una función anónima que produce el resultado en radianes.
Pruébalo con ideone .
fuente
Javascript ES6, 54 bytes
Utiliza radianes.
fuente
Gelatina , 11 bytes (no competitiva)
La salida está en radianes. Desafortunadamente, Jelly tenía un error de signo en sus átomos de división, lo que hace que esta respuesta no compita debido a la corrección de errores requerida.
Pruébalo en línea! o verificar todos los casos de prueba (convertidos a grados).
Cómo funciona
fuente
-1÷0
dado eninf
lugar de-inf
), por lo que es poco probable que afecte a la mayoría de los desafíos.Python 3,
7567 bytes8 bytes gracias a Dennis.
Ideone it!
fuente
and
yor
?and
yor
.pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2
Guarda algunos bytes.&
es un operador bit a bit.APL (Dyalog Unicode) ,
1210 bytes SBCS-2 gracias a ngn.
Función de infijo tácito anónimo. Utiliza la fórmula de alephalpha . Toma
x
como argumento correcto yy
como argumento izquierdo. El resultado está en radianes.Pruébalo en línea!
,
concatenar ely
yx
0J1⊥
Evaluar como base i dígitos (es decir, y i ¹ + x i ⁰)⍟
logaritmo natural de eso∘
luego11○
parte imaginaria de esofuente
11○∘⍟
->12○
argOfComplexNumber
Mathematica, 16 bytes
No estoy seguro de si
Log
se considera como una función integrada que calcula el ángulo dado dos coordenadas.Ejemplo:
fuente
lenguaje de máquina x86 (Linux de 32 bits),
2513 bytes (sin competencia)Para probarlo en línea , compile el siguiente programa C (no olvide
-m32
marcar en x86_64)fuente
J , 10 bytes
Función de infijo tácito anónimo. Utiliza la fórmula de alephalpha . Toma
x
como argumento izquierdo yy
como argumento derecho. El resultado está en radianes.Pruébalo en línea!
j.
calcularx
+y
× i@
luego^.
logaritmo natural de eso11 o.
parte imaginaria de esofuente
Pyth, 26 bytes
theta
en radianesBanco de pruebas.
fuente
𝔼𝕊𝕄𝕚𝕟, 13 caracteres / 17 bytes
Try it here (ES6 browsers only).
Usos
(x<0)*pi+tan(y/x)
.fuente
Python 3, 65 bytes
Esto produce radianes en el rango
[-π/2, 3π/2)
, equivalente a[-90, 270)
grados.fuente
Axioma, 58 bytes
prueba (solo uso acos () devuelve radiantes)
fuente
Python 2 , 59 bytes
Pruébalo en línea!
Salidas en radianes en rango
[-pi,pi)
fuente