atan2(y, x)
имеет этот разрыв на 180 °, где он переключается на -180 ° .,0 ° по часовой стрелке.
Как сопоставить диапазон значений 0 ° .,360 °?
вот мой код:
CGSize deltaPoint = CGSizeMake(endPoint.x - startPoint.x, endPoint.y - startPoint.y);
float swipeBearing = atan2f(deltaPoint.height, deltaPoint.width);
Я вычисляя направление считывания сенсорного события , учитывая startPoint
и endPoint
, как XY точки Структуры. Код предназначен для iPhone, но atan2f()
подойдет любой поддерживаемый язык .
Ответы:
источник
(x >= 0 ? x : (2*PI + x)) * 180/PI
как в(x < 0 ? 2*PI + x : x) * 180/PI
Решение с использованием Modulo
Простое решение, подходящее для всех случаев.
Объяснение
Положительно: от 1 до 180
Если вы измените любое положительное число от 1 до 180 на 360, вы получите точно такое же число, которое вы ввели. Здесь Mod просто гарантирует, что эти положительные числа будут возвращены как одно и то же значение.
Отрицательные: от -180 до -1
Использование мода здесь вернет значения в диапазоне от 180 до 359 градусов.
Особые случаи: 0 и 360
Использование мода означает, что возвращается 0, что делает его безопасным решением для 0-359 градусов.
источник
-1 % 360 = -1
Просто добавьте 360 °, если ответ от atan2 меньше 0 °.
источник
Или, если вам не нравится ветвление, просто отмените два параметра и добавьте к ответу 180 °.
(Добавление 180 ° к возвращаемому значению прекрасно помещает его в диапазон 0–360, но меняет угол. Отрицание обоих входных параметров возвращает его обратно.)
источник
@erikkallen близок, но не совсем прав.
Это должно работать в C ++: (в зависимости от того, как реализован fmod, он может быть быстрее или медленнее, чем условное выражение)
В качестве альтернативы вы можете сделать это:
поскольку (x, y) и (-x, -y) отличаются по углам на 180 градусов.
источник
У меня есть 2 решения, которые, кажется, работают для всех комбинаций положительных и отрицательных x и y.
1) Злоупотребление atan2 ()
Согласно документации, atan2 принимает параметры y и x в указанном порядке. Однако, если вы измените их, вы можете сделать следующее:
2) Правильно используйте atan2 () и затем конвертируйте
источник
@Jason S: ваш вариант "fmod" не будет работать в совместимой со стандартами реализации. Стандарт C ясен и ясен (7.12.10.1, «функции fmod»):
таким образом,
на самом деле это просто подробное переписывание:
Ваше третье предложение, однако, верно.
источник
Вот что я обычно делаю:
источник
Я составил формулу для определения угла от 0 до 360
источник
Альтернативным решением является использование функции mod (), определенной как:
function mod(a, b) {return a - Math.floor (a / b) * b;}
Затем с помощью следующей функции получается угол между точками ini (x, y) и end (x, y) . Угол выражается в градусах, нормированных на [0, 360] град. и северная привязка 360 градусов.
источник
Геосфера пакетов R вычислит пеленг Rhumb, который является постоянной линией пеленга с учетом исходной точки и направления на восток / север. Ориентация на восток и север должны быть в матрице или векторе. Начальная точка розы ветров - 0,0. Следующий код, кажется, легко решает проблему:
источник
-1 градус становится (-1 + 360) = 359 градусов
-179 градусов становится (-179 + 360) = 181 градус
источник
Math.PI
? Это то же самое, что иM_PI
?Это вернет градус от 0 ° -360 ° против часовой стрелки, 0 ° соответствует 3 часам.
источник
Формула, имеющая диапазон значений от 0 до 360 градусов.
f (x, y) = 180-90 * (1 + знак (x)) * (1-знак (y ^ 2)) - 45 * (2 + sign (x)) * sign (y)
источник
Вот какой-нибудь javascript. Просто введите значения x и y.
источник