區別
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 的符號。所以可以區分座標點在哪個象限。
使用示例
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爲順時針旋轉返回正值,反之返回負值。