[英]I need to get angle from 0 to 360 degree on python by using atan or atan2 functions
[英]Python atan or atan2, what should I use?
我的公式 f=arctan(ImZ/ReZ)
有兩種選擇:
選項 1(atan):
ImZ=-4.593172163003
ImR=-4.297336384845
>>> z=y/x
>>> f1=math.atan(z)
>>> f1
0.8186613519278327
選項 2 (atan2)
>>> f=math.atan2(y,x)
>>> f
-2.3229313016619604
為什么這兩個結果不同?
Atan 采用單個參數,Atan2 采用兩個參數。使用兩個參數而不是一個參數的目的是收集有關輸入符號的信息,以便返回計算出的角度的適當象限,這對於單參數是不可能的曬黑
Atan2 結果總是在 -pi 和 pi 之間。
math.atan 的文檔字符串:
atan(x) 返回 x 的反正切(以弧度為單位)。
math.atan2 的文檔字符串:
atan2(y, x) 返回 y/x 的反正切(以弧度為單位)。 與 atan(y/x) 不同,x 和 y 的符號都被考慮。
為了非常完整,以下是文檔對 atan2 的說明:
math.atan2(y, x) 以弧度為單位返回 atan(y / x)。 結果介於 -pi 和 pi 之間。 平面中從原點到點 (x, y) 的向量與正 X 軸形成這個角度。 atan2() 的要點是它知道兩個輸入的符號,因此它可以計算角度的正確象限。 例如,atan(1) 和 atan2(1, 1) 都是 pi/4,但 atan2(-1, -1) 是 -3*pi/4。
所以,這是很明確的:由於輸出的標志是不同的ImZ
和ImR
。 與atan
不同, atan2
返回適當的象限。
正如其他人所說,atan2 需要兩個參數才能正確確定輸出角度的象限......
但是,它仍然輸出[-pi,pi]
之間的角度,這並不總是有用(第一和第二象限為正[0,pi]
;第三和第四象限為負[-pi,0]
)。
正如 theodore panagos 所示,可以定義一個返回[0,2pi]
的角度的atan
函數。
改進 theodore panagos 的回答,這是一個使用 numpy 的 python 版本
import numpy
# defining the atan function
myatan = lambda x,y: numpy.pi*(1.0-0.5*(1+numpy.sign(x))*(1-numpy.sign(y**2))\
-0.25*(2+numpy.sign(x))*numpy.sign(y))\
-numpy.sign(x*y)*numpy.arctan((numpy.abs(x)-numpy.abs(y))/(numpy.abs(x)+numpy.abs(y)))
#testing
u = numpy.array([[numpy.sqrt(3.0)/2.0,0.5], # expected: 30
[0.5,numpy.sqrt(3.0)/2.0], # expected: 60
[0.0,1.0], # expected: 90
[-0.5,numpy.sqrt(3.0)/2.0], # expected: 120
[-numpy.sqrt(3.0)/2.0,0.5], # expected: 150
[-1.0,0.0], # expected: 180
[-numpy.sqrt(3.0)/2.0,-0.5], # expected: 210
[-0.5,-numpy.sqrt(3.0)/2.0], # expected: 240
[0.0,-1.0], # expected: 270
[0.5,-numpy.sqrt(3.0)/2.0], # expected: 300
[numpy.sqrt(3.0)/2.0,-0.5], # expected: 330
[1.0,0.0]]) # expected: 0 or 360
theta = myatan(u[:,0],u[:,1])
print(theta * 180.0/numpy.pi) # converting to degrees
輸出:
[ 30. 60. 90. 120. 150. 180. 210. 240. 270. 300. 330. 0.]
它不會准確地輸出 360,但它會一直到它,然后按預期循環
一個公式從 0 逆時針方向有一個角度,即 x 的正軸,
到 2pi 對於任何 x 和 y 值。 對於 x=y=0,結果未定義。
f(x,y)=pi-pi/2*(1+sign(x))*(1-sign(y^2))-pi/4*(2+sign(x))*sign(y)
-sign(x*y)*atan((abs(x)-abs(y))/(abs(x)+abs(y)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.