Как отобразить atan2 () в градусах 0-360 - PullRequest
87 голосов
/ 21 августа 2009

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 ().

Спасибо за вашу помощь, ребята, с общим решением и кодом.

Обновление : Я превратил ответ Эриккалена в функцию с хорошими длинными именами переменных, поэтому я пойму его через 6 месяцев. Возможно, это поможет другому iPhone.

float PointPairToBearingDegrees(CGPoint startingPoint, CGPoint endingPoint)
{
    CGPoint originPoint = CGPointMake(endingPoint.x - startingPoint.x, endingPoint.y - startingPoint.y); // get origin point to origin by subtracting end from start
    float bearingRadians = atan2f(originPoint.y, originPoint.x); // get bearing in radians
    float bearingDegrees = bearingRadians * (180.0 / M_PI); // convert to degrees
    bearingDegrees = (bearingDegrees > 0.0 ? bearingDegrees : (360.0 + bearingDegrees)); // correct discontinuity
    return bearingDegrees;
}

Ответы [ 14 ]

0 голосов
/ 25 ноября 2018

Формула для диапазона значений от 0 до 360 градусов.

f (x, y) = 180-90 * (1 + знак (x)) * (1 знак (y ^ 2)) - 45 * (2 + знак (x)) * знак (y)

     -(180/pi())*sign(x*y)*atan((abs(x)-abs(y))/(abs(x)+abs(y)))
0 голосов
/ 03 февраля 2017
theta_rad = Math.Atan2(y,x);
if(theta_rad < 0)
  theta_rad = theta_rad + 2 * Math.PI;    //if neg., add 2 PI to it
theta_deg = (theta_rad/M_PI*180) ;        //convert from radian to degree

//or
theta_rad = Math.Atan2(y,x);
theta_rad = (theta_rad < 0) ? theta_rad + 2 * Math.PI : theta_rad;
theta_deg = (theta_rad/M_PI*180) ;

-1 градус становится (-1 + 360) = 359 град.
-179 градусов становится (-179 + 360) = 181 градус

0 голосов
/ 09 октября 2016
double degree = fmodf((atan2(x, y) * (180.0 / M_PI)) + 360, 360);

Возвращается градус от 0 ° до 360 ° против часовой стрелки, 0 ° в 3 часа.

0 голосов
/ 19 мая 2016

Геосфера пакетов R будет рассчитывать подшипникRhumb, который является постоянной линией направления с учетом исходной точки и восточного / северного направления. Восток и север должны быть в матрице или векторе. Начальная точка для розы ветров - 0,0. Следующий код, похоже, легко решает проблему:

windE<-wind$uasE
windN<-wind$vasN
wind_matrix<-cbind(windE, windN)
wind$wind_dir<-bearingRhumb(c(0,0), wind_matrix)
wind$wind_dir<-round(wind$wind_dir, 0)
...