在进行算法编写的时候需要用到atan2, 但是IDL的函数库中并没有内置这个函数, 于是就根据网上已经有的资料将代码由C转到IDL。经网友测试后部分bug已经排除,亲测可行. 希望大家可以把更多的时间用在其他有意义的事情上.
本人IDL经验不多, 如果下面的代码阁下发现改进的地方, 欢迎在底下评论.
C的源码参考: http://www.eeworm.com/read/252366/4408667
注意:本函数的xy和matlab中atan2的xy是相反的。
比如:
matlab:atan2(3,4) = 0.6435
IDL:atan2(4,3) = 0.6435
转译IDL后代码如下:
function atan2,x,y
;此函数和matlab中的atan2输入的xy是相反的x=x*1d0 & y=y*1d0
absy = 0d & absx = 0d & val = 0dIF(x eq 0 and y eq 0)THEN BEGIN
return, 0 ; ERROR!
ENDIFabsy = abs(y) & absx = abs(x)
IF(absy - absx eq absy)THEN BEGIN
IF(y lt 0)THEN BEGIN
return, -!pi/2
ENDIF ELSE BEGIN
return, !pi/2
ENDELSE
ENDIFIF(absx - absy eq absx)THEN BEGIN
val = 0d0
ENDIF ELSE BEGIN
val = atan(y/x)
ENDELSEIF(x gt 0)THEN BEGIN
return, val
ENDIFIF(y lt 0)THEN BEGIN
return, val-!pi
ENDIFreturn, val+!pi
;———————————
; another algorithm
; IF(y gt 0)THEN BEGIN
; IF(x gt 0)THEN BEGIN
; val = atan(y/x)
; ENDIF
; IF(x lt 0)THEN BEGIN
; val = !pi - atan(-y/x)
; ENDIF
; IF(x eq 0)THEN BEGIN
; val = !pi/2
; ENDIF
; ENDIF
; IF(y lt 0)THEN BEGIN
; IF(x gt 0)THEN BEGIN
; val = -atan(-y/x)
; ENDIF
; IF(x lt 0)THEN BEGIN
; val = atan(y/x)-!pi
; ENDIF
; IF(x eq 0)THEN BEGIN
; val = !pi/2*3
; ENDIF
; ENDIF
; IF(y eq 0)THEN BEGIN
; IF(x gt 0)THEN BEGIN
; val = 0
; ENDIF
; IF(x lt 0)THEN BEGIN
; val = !pi
; ENDIF
; IF(x eq 0)THEN BEGIN
; val = 0 ;error
; ENDIF
; ENDIF
; return, val
end