Иногда действительно трудно преобразовать декартовы координаты (x,y)
в полярные (r,phi)
. Несмотря на то, что вы можете вычислить r = sqrt(x^2+y^2)
довольно легко, вам часто нужно различать случаи при расчете угла, phi
потому что arcsin
, arccos
и, как arctan
и все другие тригонометрические функции, имеют совместную область, каждая из которых охватывает только половину круга.
Во многих языках есть встроенные модули для преобразования прямоугольных координат в полярные или, по крайней мере, atan2
функции, которая - учитывая (x,y)
- вычисляет угол phi
.
задача
Ваша задача - написать программу / функцию, которая принимает две (с плавающей точкой, а не обе нулевые) декартовы координаты (x,y)
и выводит соответствующий полярный угол phi
, где phi
он должен быть в градусах, радианах или градусах (с оценками я имею в виду градианы, которые равны 1 / 400 полного круга), в зависимости от того, что вам удобнее.
Угол измеряется в положительной ориентации, и у нас есть нулевой угол для (1,0)
.
Детали
Вы не можете использовать встроенные модули , которые вычисляют угол phi
дал две координаты, в том числе atan2
, rect2polar
, argOfComplexNumber
и другие подобные функции. Однако вы можете использовать обычные тригонометрические функции и их обращения, которые принимают только один аргумент. Любые условные обозначения являются необязательными.
Радиус r
должен быть неотрицательным и phi
должен находиться в диапазоне [-360°, 360°]
(не важно, выводите вы 270°
или -90°
).
Примеры
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°
источник
Ответы:
MATL , 12 байт
Результат в радианах.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
У MATL нет
atan
функции (она естьatan2
, но ее нельзя использовать для этой задачи). Поэтому я прибегнул кacos
.источник
0<?_
, сбрив несколько байтов|
). Но здесь я меняю знак результата на основе знака второго входа ,y
. Кроме того,y
может быть0
, поэтому я не могу умножить наy/abs(y))
JavaScript (ES6),
5040 байтРезультат в радианах. Редактировать: Сохранено 10 байт, когда я заметил, что результат может быть между -90 ° и 270 °. Предыдущая версия с
-Math.PI<=result<Math.PI
:источник
||0
?x=y=0
дела.MATLAB / Octave, 24 байта
Это определяет анонимную функцию, которая производит результат в радианах.
Попробуйте это на Ideone .
источник
Javascript ES6, 54 байта
Использует радианы.
источник
Желе , 11 байт (не конкурирует)
Вывод в радианах. К сожалению, у Jelly была ошибка знака в его атомах деления, что делало этот ответ неконкурентным из-за требуемого исправления ошибки.
Попробуйте онлайн! или проверьте все контрольные примеры (в градусах).
Как это устроено
источник
-1÷0
далinf
вместо-inf
), так что это вряд ли повлияет на большинство задач.Python 3,
7567 байт8 байтов благодаря Денису.
Идео это!
источник
and
иor
?and
иor
.pi*(x<0==y)or atan(y/(hypot(x,y)+x))*2
сохраняет несколько байтов.&
побитовый оператор.APL (Dyalog Unicode) ,
1210 байтов SBCS-2 благодаря нгн.
Анонимная негласная инфиксная функция. Использует формулу алефальфа . Принимает в
x
качестве правого аргумента и вy
качестве левого аргумента. Результат в радианах.Попробуйте онлайн!
,
объединитьy
иx
0J1⊥
Оценить как базовые цифры i (т. Е. Y i ¹ + x i ⁰)⍟
натуральный логарифм этого∘
тогда11○
мнимая часть этогоисточник
11○∘⍟
->12○
argOfComplexNumber
Mathematica, 16 байтов
Я не уверен,
Log
считается ли это встроенным, который рассчитывает угол с учетом двух координат.Пример:
источник
машинный язык x86 (32-битный Linux),
2513 байтов (неконкурентный)Для того, чтобы попробовать его в Интернете , скомпилируйте следующую программу на C (не забудьте
-m32
флаг x86_64)источник
J , 10 байт
Анонимная негласная инфиксная функция. Использует формулу алефальфа . Принимает
x
как левый аргумент иy
как правый аргумент. Результат в радианах.Попробуйте онлайн!
j.
рассчитатьx
+y
× я@
тогда^.
натуральный логарифм этого11 o.
мнимая часть этогоисточник
Pyth, 26 байт
theta
в радианах.Тестирование.
источник
𝔼𝕊𝕄𝕚𝕟 13 символов / 17 байт
Try it here (ES6 browsers only).
Использует
(x<0)*pi+tan(y/x)
.источник
Python 3, 65 байт
Это выводит радианы в диапазоне
[-π/2, 3π/2)
, эквивалентном[-90, 270)
градусам.источник
Аксиома, 58 байт
test (я использую только acos (), он возвращает радианты)
источник
Python 2 , 59 байт
Попробуйте онлайн!
Выходы в радианах в диапазоне
[-pi,pi)
источник