IDL语言的atan2函数

在进行算法编写的时候需要用到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 = 0d

IF(x eq 0 and y eq 0)THEN BEGIN
return, 0 ; ERROR!
ENDIF

absy = 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
ENDIF

IF(absx - absy eq absx)THEN BEGIN
val = 0d0
ENDIF ELSE BEGIN
val = atan(y/x)
ENDELSE

IF(x gt 0)THEN BEGIN
return, val
ENDIF

IF(y lt 0)THEN BEGIN
return, val-!pi
ENDIF

return, 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值