本帖最后由 MegaPirateNG 于 2018-10-10 21:27 编辑
根据书上写的:
天文学中使用的单位:小时。定义:1小时=15度。(而不是 360 度约等于 23小时56分,在计算 GOTO 的赤经轴移动步数时,会有区别。误差达到 0.28%,长一点儿的 GOTO 就可以误差1步以上。)
=====================================================
赤经/赤纬与方位角/高度角的转换算法。
出处:
http://www.stargazing.net/kepler/altaz.html#twig09
Foxpro 版的代码,这个语言对中文支持比较好,容易看懂一些吧。
*-- 时角计算, 赤道系赤经/赤纬坐标转地平系方位角/高度角
Clear
Public n赤经, n赤纬, n当地经度, n当地纬度
Local n时角, n高度角, n方位角
n当地经度 = 113.9312
n当地纬度 = 22.56
*-- n赤经 = (34 / 60.000000 + 37) / 60.000000 + 18 && 织女星
*-- n赤纬 = 38 + (48 + 08 / 60.000000) / 60.000000 && 织女星
n赤经 = (42 / 60.000000 + 51) / 60.000000 + 19 && 牛朗星
n赤纬 = 8 + (55 + 08 / 60.000000) / 60.000000 && 牛朗星
n时角 = 计算时角(n赤经, n当地经度, 8)
Local n时角度, n时角分, n时角秒
n时角时 = Floor(n时角)
n时角分 = Floor((n时角 - n时角时) * 60)
n时角秒 = ((n时角 - n时角时) * 60 - n时角分) * 60
? Textmerge("时角: <<n时角时>>h<<n时角分>>m<<n时角秒>>s")
n高度角 = 计算高度角(n当地纬度, n赤纬, n时角)
n方位角 = 计算方位角(n赤纬, n高度角, n当地纬度, n时角)
Local n高度角度, n高度角分, n高度角秒, n方位角度, n方位角分, n方位角秒
n高度角度 = Floor(n高度角)
n高度角分 = Floor((n高度角 - n高度角度) * 60)
n高度角秒 = ((n高度角 - n高度角度) * 60 - n高度角分) * 60
n方位角度 = Floor(n方位角)
n方位角分 = Floor((n方位角 - n方位角度) * 60)
n方位角秒 = ((n方位角 - n方位角度) * 60 - n方位角分) * 60
? Textmerge("方位角/高度角: <<n方位角度>>°<<n方位角分>>'<<n方位角秒>>''/<<n高度角度>>°<<n高度角分>>'<<n高度角秒>>''")
Return
Procedure 计算方位角
Lparameters tn赤纬, tn高度角, tn当地纬度, tn时角
Local nDEC, nALT, nLAT, nHA, n方位角
nDEC = tn赤纬 * 3.1415926535897932 / 180
nALT = tn高度角 * 3.1415926535897932 / 180
nLAT = tn当地纬度 * 3.1415926535897932 / 180
nHA = tn时角 * 15 * 3.1415926535897932 / 180
n方位角 = Acos((Sin(nDEC) - Sin(nALT) * Sin(nLAT)) / (Cos(nALT) * Cos(nLAT))) * 180 / 3.1415926535897932
If Sin(nHA) < 0 Then
n方位角 = n方位角
Else
n方位角 = 360 - n方位角
Endif
Return n方位角
Endproc
Procedure 计算高度角
Lparameters tn当地纬度, tn赤纬, tn时角
Local n高度角, nDEC, nLAT, nHA
nDEC = tn赤纬 * 3.1415926535897932 / 180
nLAT = tn当地纬度 * 3.1415926535897932 / 180
nHA = tn时角 * 15 * 3.1415926535897932 / 180
n高度角 = Asin(Sin(nDEC) * Sin(nLAT) + Cos(nDEC) * Cos(nLAT) * Cos(nHA)) * 180 / 3.1415926535897932
Return n高度角
Endproc
Procedure 计算时角
Lparameters tn赤经, tn经度, tn时区, tn年, tn月, tn日, tn时, tn分, tn秒
Local n时角
n时角 = 计算恒星时(tn经度, tn时区, tn年, tn月, tn日, tn时, tn分, tn秒) / 15.000000 - tn赤经
n时角 = n时角 - 24 * Floor(n时角 / 24)
Return n时角
Endproc
Procedure 计算恒星时
Lparameters tn经度, tn时区, tn年, tn月, tn日, tn时, tn分, tn秒
Local n恒星时
n恒星时 = 100.46 + 0.985647 * 计算日期差(tn年, tn月, tn日, tn时, tn分, tn秒) + tn经度 + 15 * 计算标准时间(tn时区, tn时, tn分, tn秒)
n恒星时 = n恒星时 - 360 * Floor(n恒星时 / 360)
*-- ? TEXTMERGE("恒星时: <<n恒星时>>")
Return n恒星时
Endproc
Procedure 计算标准时间
Lparameters tn时区, tn时, tn分, tn秒
Local n标准时间
If Empty(tn时) Then
Local n当前日期时间
n当前日期时间 = Datetime()
tn时 = Hour(n当前日期时间)
tn分 = Minute(n当前日期时间)
tn秒 = Sec(n当前日期时间)
Endif
n标准时间 = (tn秒 / 60.000000 + tn分) / 60.000000 + tn时 - tn时区
*-- ? TEXTMERGE("标准时间: <<n标准时间>>")
Return n标准时间
Endproc
Procedure 计算日期差
Lparameters tn年, tn月, tn日, tn时, tn分, tn秒
Local n日期差
If Empty(tn年) Then
Local n当前日期时间
n当前日期时间 = Datetime()
tn年 = Year(n当前日期时间)
tn月 = Month(n当前日期时间)
tn日 = Day(n当前日期时间)
tn时 = Hour(n当前日期时间)
tn分 = Minute(n当前日期时间)
tn秒 = Sec(n当前日期时间)
Endif
*-- ? Textmerge("计算日期差: <<tn年>>年<<tn月>>月<<tn日>>日 <<tn时>>:<<tn分>>:<<tn秒>>")
n日期差 = Date(tn年, tn月, tn日) - Date(2000, 1, 1)
n日期差 = n日期差 + ((tn秒 / 60.000000 + tn分) / 60.000000 + tn时) / 24.000000 - 0.5
*-- ? Textmerge("日期差: <<n日期差>>")
Return n日期差
Endproc
|