Às vezes, é realmente difícil converter coordenadas cartesianas em coordenadas (x,y)
polares (r,phi)
. Enquanto você pode calcular r = sqrt(x^2+y^2)
com bastante facilidade, muitas vezes você precisa de alguma distinção de casos no cálculo do ângulo phi
, pois arcsin
, arccos
e arctan
e todas as outras funções trigonométricas ter um co-domínio que cada um só spans metade do círculo.
Em muitos idiomas, existem embutidos para converter coordenadas retangulares em polares, ou pelo menos possuem uma atan2
função que - dada (x,y)
- calcula o ângulo phi
.
Tarefa
Sua tarefa é escrever um programa / função que use duas coordenadas cartesianas (ponto flutuante, e não zero) (x,y)
e produza o ângulo polar correspondente phi
, onde phi
deve ser em graus, radianos ou notas (com notas, quero dizer graduados que são 1 / 400 do círculo completo), o que for mais conveniente para você.
O ângulo é medido em orientação positiva, e temos o ângulo zero para (1,0)
.
Detalhes
Você não pode usar built-ins que calculam o ângulo phi
dado duas coordenadas, incluindo atan2
, rect2polar
, argOfComplexNumber
e funções similares. No entanto, você pode usar as funções trigonométricas usuais e seus reversos, que levam apenas um argumento. Quaisquer símbolos da unidade são opcionais.
O raio r
deve ser não negativo e phi
deve estar no intervalo [-360°, 360°]
(não importa se você produz 270°
ou não -90°
).
Exemplos
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°
fonte
Respostas:
MATL , 12 bytes
O resultado está em radianos.
Experimente online! Ou verifique todos os casos de teste .
Explicação
O MATL não possui uma
atan
função (possuiatan2
, mas não pode ser usada para esse desafio). Então eu recorriacos
.fonte
0<?_
, raspar fora de alguns bytes|
). Mas aqui eu estou mudando sinal do resultado com base no sinal da segunda entrada ,y
. Além disso,y
pode ser0
, então não posso multiplicar pory/abs(y))
JavaScript (ES6),
5040 bytesO resultado está em radianos. Edit: Salvo 10 bytes quando notei que é permitido que o resultado esteja entre -90 ° e 270 °. Versão anterior com
-Math.PI<=result<Math.PI
:fonte
||0
?x=y=0
caso.MATLAB / oitava, 24 bytes
Isso define uma função anônima que produz o resultado em radianos.
Experimente em ideone .
fonte
Javascript ES6, 54 bytes
Usa radianos.
fonte
Gelatina , 11 bytes (não concorrente)
A saída é em radianos. Infelizmente, Jelly teve um bug de sinal em seus átomos de divisão, tornando essa resposta não competitiva devido à correção de bug necessária.
Experimente online! ou verifique todos os casos de teste (convertidos em graus).
Como funciona
fonte
-1÷0
deu eminf
vez de-inf
), por isso é improvável que afete a maioria dos desafios.Python 3,
7567 bytes8 bytes graças a Dennis.
Ideone it!
fonte
and
eor
?and
eor
.pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2
salva alguns bytes.&
é um operador bit a bit.APL (Dyalog Unicode) ,
1210 bytes SBCS de-2 graças a ngn.
Função de infixo tácito anônimo. Usa a fórmula de alefalpha . Toma
x
como argumento certo ey
como argumento esquerdo. O resultado é em radianos.Experimente online!
,
concatenar oy
ex
0J1⊥
Avalie como dígitos base i (ou seja, y i ¹ + x i ⁰)⍟
logaritmo natural desse∘
então11○
parte imaginária dissofonte
11○∘⍟
->12○
argOfComplexNumber
Mathematica, 16 bytes
Não tenho certeza se
Log
é considerado um built-in que calcula o ângulo dado duas coordenadas.Exemplo:
fonte
linguagem de máquina x86 (Linux de 32 bits),
2513 bytes (não-concorrente)Para experimentá-lo online , compile o seguinte programa C (não esqueça o
-m32
sinalizador em x86_64)fonte
J , 10 bytes
Função de infixo tácito anônimo. Usa a fórmula de alefalpha . Toma
x
como argumento à esquerda ey
como argumento à direita. O resultado é em radianos.Experimente online!
j.
calcularx
+y
× i@
então^.
logaritmo natural desse11 o.
parte imaginária dissofonte
Pitão, 26 bytes
theta
em radianos.Suíte de teste.
fonte
, 13 caracteres / 17 bytes
Try it here (ES6 browsers only).
Usos
(x<0)*pi+tan(y/x)
.fonte
Python 3, 65 bytes
Isso gera radianos no intervalo
[-π/2, 3π/2)
, equivalente a[-90, 270)
graus.fonte
Axioma, 58 bytes
teste (eu uso apenas acos () retorna radiantes)
fonte
Python 2 , 59 bytes
Experimente online!
Saídas em radianos na faixa
[-pi,pi)
fonte