atan和atan2

http://www.ilovematlab.cn/thread-253542-1-1.html

https://en.wikipedia.org/wiki/Atan2


atan2(a,b)是4象限反正切,它的取值不僅取決於正切值a/b,還取決於點 (b, a) 落入哪個象限:

   當點(b, a) 落入第一象限時,atan2(a,b)的範圍是 0 ~ pi/2;
 當點(b, a) 落入第二象限時,atan2(a,b)的範圍是 pi/2 ~ pi;
   當點(b, a) 落入第三象限時,atan2(a,b)的範圍是 -pi~-pi/2;
 當點(b, a) 落入第四象限時,atan2(a,b)的範圍是 -pi/2~0

而 atan(a/b) 僅僅根據正切值爲a/b求出對應的角度 (可以看作僅僅是2象限反正切):
   當 a/b > 0 時,atan(a/b)取值範圍是 0 ~ pi/2;
   當 a/b < 0 時,atan(a/b)取值範圍是 -pi/2~0

故 atan2(a,b) = atan(a/b) 僅僅發生在 點 (b, a) 落入第一象限 (b>0, a>0)或 第四象限(b>0, a<0)。

當點 (b, a) 落入第二、三象限時,很顯然atan2(a,b) 不等於 atan(a/b) ,並且atan2(a,b)也不可能等於 2*atan(a/b) 。

這是因爲,假如點 (b, a) 落入第二象限,則 a/b<0,  故atan(a/b)取值範圍始終是 -pi/2~0,2*atan(a/b) 的取值範圍是-pi~0,然而,atan2(a,b)的範圍是 pi/2 ~ pi,故不可能有atan2(a,b) = 2*atan(a/b) 。假如點(b, a) 落入第三象限,則則 a/b>0 , 故 atan(a/b) 取值範圍是 0 ~ pi/2,2*atan(a/b) 的取值範圍是 0 ~ pi,而此時atan2(a,b)的範圍是 -pi~-pi/2,很顯然,atan2(a,b) = 2*atan(a/b) 


舉個最簡單的例子,a = 1, b = -1,則 atan(a/b) = atan(-1) = -pi/4, 而 atan2(a,b) = 3*pi/4


第二個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°


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