Czasami naprawdę trudno jest przekonwertować współrzędne kartezjańskie na współrzędne (x,y)
biegunowe (r,phi)
. Chociaż można obliczyć r = sqrt(x^2+y^2)
dość łatwo, często trzeba jakieś rozróżnienie przypadków przy obliczaniu kąta phi
ponieważ arcsin
, arccos
i arctan
wszystkie inne funkcje trygonometryczne mają współpracę domenę że każdy tylko przęseł pół okręgu.
W wielu językach są wbudowane atan2
funkcje przekształcania współrzędnych prostokątnych na biegunowe lub przynajmniej mają funkcję, która - biorąc pod uwagę (x,y)
- oblicza kąt phi
.
Zadanie
Twoim zadaniem jest napisanie programu / funkcji, która przyjmuje dwie (zmiennoprzecinkowe, nie oba zerowe) współrzędne kartezjańskie (x,y)
i generuje odpowiedni kąt biegunowy phi
, gdzie phi
musi być w stopniach, radianach lub stopniach (za stopniami mam na myśli gradianów, które są 1 / 400 pełnego koła), w zależności od tego, które jest dla Ciebie wygodniejsze.
Kąt jest mierzony w dodatniej orientacji, a my mamy kąt zerowy dla (1,0)
.
Detale
Użytkownik nie może używać Zabudowy że obliczenie kąta phi
podane dwie współrzędne, włącznie z atan2
, rect2polar
, argOfComplexNumber
i podobne funkcje. Można jednak użyć zwykłych funkcji trygonometrycznych i ich odwrotności, które wymagają tylko jednego argumentu. Wszelkie symbole jednostek są opcjonalne.
Promień r
musi być nieujemny i phi
musi mieścić się w zakresie [-360°, 360°]
(nie ma znaczenia, czy dane wyjściowe 270°
czy -90°
).
Przykłady
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°
źródło
Odpowiedzi:
MATL , 12 bajtów
Wynik jest w radianach.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
MATL nie ma
atan
funkcji (maatan2
, ale nie można jej użyć do tego wyzwania). Więc uciekłem się doacos
.źródło
0<?_
, goląc kilka bajtów|
). Ale tu mam zmieniając znak wyniku opartej na znak drugiego wejścia ,y
. Poza tymy
może być0
, więc nie mogę pomnożyć przezy/abs(y))
JavaScript (ES6),
5040 bajtówWynik jest w radianach. Edycja: Zapisałem 10 bajtów, gdy zauważyłem, że wynik może wynosić od -90 ° do 270 °. Poprzednia wersja z
-Math.PI<=result<Math.PI
:źródło
||0
za?x=y=0
przypadku.MATLAB / Octave, 24 bajty
Definiuje to anonimową funkcję, która daje wynik w radianach.
Wypróbuj na ideone .
źródło
JavaScript ES6, 54 bajty
Korzysta z radianów.
źródło
Galaretka , 11 bajtów (niekonkurencyjna)
Dane wyjściowe podano w radianach. Niestety, Jelly miał błąd znakowy w atomach podziału, przez co odpowiedź ta nie była konkurencyjna z powodu wymaganej poprawki błędu.
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe (przeliczone na stopnie).
Jak to działa
źródło
-1÷0
podanyinf
zamiast-inf
), więc jest mało prawdopodobne, aby wpłynęło to na większość wyzwań.Python 3,
7567 bajtów8 bajtów dzięki Dennisowi.
Ideone to!
źródło
and
ior
?and
ior
.pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2
oszczędza kilka bajtów.&
jest operatorem bitowym.APL (Dyalog Unicode) ,
1210 bajtów SBCS-2 dzięki ngn.
Anonimowa funkcja ukrytej poprawki. Wykorzystuje formułę Alephalpha . Przyjmuje
x
jako prawy argument iy
lewy argument. Wynik w radianach.Wypróbuj online!
,
połączyćy
ix
0J1⊥
Oblicz jako podstawowe cyfry i (tj. Y i ¹ + x i ⁰)⍟
logarytm naturalny tego∘
następnie11○
wymyślona część tegoźródło
11○∘⍟
->12○
argOfComplexNumber
Mathematica, 16 bajtów
Nie jestem pewien, czy
Log
jest uważany za wbudowany, który oblicza kąt na podstawie dwóch współrzędnych.Przykład:
źródło
język maszynowy x86 (32-bitowy system Linux),
2513 bajtów (niekonkurencyjny)Aby wypróbować online , skompiluj następujący program C (nie zapomnij
-m32
flagi na x86_64)źródło
J , 10 bajtów
Anonimowa funkcja ukrytej poprawki. Wykorzystuje formułę Alephalpha . Przyjmuje
x
jako lewy argument iy
prawy argument. Wynik w radianach.Wypróbuj online!
j.
obliczyćx
+y
× i@
następnie^.
logarytm naturalny tego11 o.
wymyślona część tegoźródło
Pyth, 26 bajtów
theta
w radianach.Zestaw testowy.
źródło
𝔼𝕊𝕄𝕚𝕟, 13 znaków / 17 bajtów
Try it here (ES6 browsers only).
Zastosowania
(x<0)*pi+tan(y/x)
.źródło
Python 3, 65 bajtów
Daje to w radianach zakres
[-π/2, 3π/2)
odpowiadający[-90, 270)
stopniom.źródło
Aksjomat, 58 bajtów
test (używam tylko acos () zwraca promienie)
źródło
Python 2 , 59 bajtów
Wypróbuj online!
Wyjścia w radianach w zasięgu
[-pi,pi)
źródło