Простой способ держать углы от -179 до 180 градусов - PullRequest
33 голосов
/ 23 февраля 2010

Есть ли простой способ преобразовать угол (в градусах) между -179 и 180? Я уверен, что мог бы использовать mod (%) и некоторые операторы if, но это выглядит ужасно:


//Make angle between 0 and 360
angle%=360;

//Make angle between -179 and 180
if (angle>180) angle-=360;

Просто кажется, что должна быть простая математическая операция, которая будет выполнять оба оператора одновременно. Возможно, мне просто нужно создать статический метод для конвертации.

Ответы [ 15 ]

2 голосов
/ 14 сентября 2012

Ну, еще одно решение, только с одним делением и без циклов.

static double normalizeAngle(double angle)
{
    angle %= 360.0; // [0..360) if angle is positive, (-360..0] if negative
    if (angle > 180.0) // was positive
        return angle - 360.0; // was (180..360) => returning (-180..0)
    if (angle <= -180.0) // was negative
        return angle + 360.0; // was (-360..180] => returning (0..180]
    return angle; // (-180..180]
}
1 голос
/ 23 февраля 2010
int angle = -394;

// shortest
angle %= 360;
angle = angle < -170 ? angle + 360 : (angle > 180 ? angle - 380 : angle);

// cleanest
angle %= 360;
if (angle < -179) angle += 360;
else if (angle > 180) angle -= 360;
0 голосов
/ 05 октября 2017

Вот мой вклад. Кажется, работает для всех углов без проблем с краями. Это быстро. Это может сделать n180 [360000359] = -1 почти мгновенно. Обратите внимание, как функция Sign помогает выбрать правильный логический путь и позволяет использовать один и тот же код для разных углов.

храповик

n180[a_] := 
 If[Abs[Mod[a, If[Sign[a] == 0, 360, Sign[a] 360]]] <= 180, 
  Mod[a, If[Sign[a] == 0, 360, Sign[a] 360]], 
  Mod[a, If[Sign[a] == 0, 360, -Sign[a] 360]]]
0 голосов
/ 25 марта 2016

Лучше использовать библиотечные функции. Они обрабатывают особые случаи, такие как NaN и бесконечности.

public static double normalizeAngleDegrees(double angle) {
    return Math.toDegrees(Math.atan2(Math.sin(Math.toRadians(angle)), Math.cos(Math.toRadians(angle))));
}   
0 голосов
/ 23 февраля 2010

Как насчет

(angle % 360) - 179

Это на самом деле вернет результаты, отличные от наивного подхода, представленного в вопросе, но оно сохранит угол между указанными границами. (Я полагаю, что это может сделать это неправильным ответом, но я оставлю это здесь, если это решит подобную проблему других людей).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...