C++中atan()與atan2()的區別和用法

區別

atan(x)函數接收一個參數。參數類型可參考下列函數聲明。

double atan (double x);
float atan (float x);
long double atan (long double x);
double atan (T x);           // additional overloads for integral types

若有一個座標A(a,b),則函數參數x=b/a。
atan(x)函數返回以弧度爲單位的角度,範圍爲[-pi/2,+pi/2],注意是包含-pi/2和+pi/2的。該角度爲A點和原點的連線與X軸正方向之間的夾角。上方夾角爲正,下方夾角爲負。由此可以看出,atan()函數只能區分一象限和四象限的點。取一象限和三象限任意一點Ai(ai,bi)計算x=bi/ai,x均爲正值。對於二象限和四象限則均爲負值。
atan參考
atan2(y,x)函數接收兩個參數,即一個座標值。參數類型可參考下列函數聲明。

double atan2 (double y     , double x);
float atan2 (float y      , float x);
long double atan2 (long double y, long double x);
double atan2 (Type1 y      , Type2 x);       // additional overloads

atan2(x)函數返回以弧度爲單位的角度,範圍爲[-pi,+pi],注意是包含-pi和+pi的。函數內部考慮了參數x,y 的符號。所以可以區分座標點在哪個象限。

atan2參考

使用示例

static double
normalize(double z)
{
  return atan2(sin(z),cos(z));
}

上述代碼實現了不管輸入多大的角度值(以弧度爲單位),輸出均落在[-pi,+pi]裏。

static double
angle_diff(double a, double b)
{
  double d1, d2;
  a = normalize(a);
  b = normalize(b);
  d1 = a-b;
  d2 = 2*M_PI - fabs(d1);
  if(d1 > 0)
    d2 *= -1.0;
  if(fabs(d1) < fabs(d2))
    return(d1);
  else
    return(d2);
}

上述代碼返回a,b之間的夾角,並且返回值總是落在[-pi,+pi]裏。總是取從a到b夾角小的那部分,如果從a到b爲順時針旋轉返回正值,反之返回負值。

參考文章:
What is the difference between atan and atan2 in C++?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章