1. 程式人生 > >C語言中的atan和atan2

C語言中的atan和atan2

在C語言的math.h或C++中的cmath中有兩個求反正切的函式atan(double x)與atan2(double y,double x)  他們返回的值是弧度 要轉化為角度再自己處理下。 前者接受的是一個正切值(直線的斜率)得到夾角,但是由於正切的規律性本可以有兩個角度的但它卻只返回一個,因為atan的值域是從-90~90 也就是它只處理一四象限,所以一般不用它。 第二個atan2(double y,double x) 其中y代表已知點的Y座標 同理x ,返回值是此點與遠點連線與x軸正方向的夾角,這樣它就可以處理四個象限的任意情況了,它的值域相應的也就是-180~180了 例如: 例1:斜率是1的直線的夾角 cout<<atan(1.0)*180/PI;//45° cout<<atan2(1.0,1.0)*180/PI;//45° 第一象限 cout<<atan2(-1.0,-1.0)*180/PI;//-135°第三象限 後兩個斜率都是1 但是atan只能求出一個45° 例2:斜率是-1的直線的角度 cout<<atan(-1.0)*180/PI;//-45° cout<<atan2(-1.0,1.0)*180/PI;//-45° y為負 在第四象限 cout<<atan2(1.0,-1.0)*180/PI;//135° x為負 在第二象限   常用的不是求過原點的直線的夾角 往往是求一個線段的夾角 這對於atan2就更是如魚得水了 例如求A(1.0,1.0) B(3.0,3.0)這個線段AB與x軸正方向的夾角 用atan2表示為 atan2(y2-y1,x2-x1) 即 atan2(3.0-1.0,3.0-1.0) 它的原理就相當於把A點平移到原點B點相應變成B’(x2-x1,y2-y1)點 這樣就又回到先前了 例三: A(0.0,5.0) B(5.0,10.0) 線段AB的夾角為 cout<<atan2(5.0,5.0)*180/PI;//45° _