16c62a97d5
- 新增时标、ΔT 模型、质心时间与 UT1 支持 - 改进日月食、月掩、行星事件及路径边界计算 - 完善恒星三维自行与动态距离传播 - 扩展 SVG、GeoJSON、KML 输出与底层距离换算工具 - 整理中英文手册、示例资源及回归测试
138 lines
5.0 KiB
Go
138 lines
5.0 KiB
Go
package basic
|
||
|
||
import "math"
|
||
|
||
const (
|
||
// 线性时标关系的参考历元,不表示各时标读数在此相等。
|
||
barycentricT0JDE = 2443144.5003725
|
||
lgRate = 6.969290134e-10
|
||
lbRate = 1.550519768e-8
|
||
tdb0Seconds = -65.5e-6
|
||
)
|
||
|
||
// tdbPeriodicGroups 按 t 的幂次分组的 TDB−TT 周期项(振幅秒、频率 rad/儒略千年、相位 rad)。
|
||
var tdbPeriodicGroups = [5][][3]float64{
|
||
{
|
||
{0.001656674564, 6283.075849991, 6.240054195},
|
||
{2.2417471e-05, 5753.384884897, 4.296977442},
|
||
{1.3839792e-05, 12566.151699983, 6.19690441},
|
||
{4.770086e-06, 529.690965095, 0.444401603},
|
||
{4.67674e-06, 6069.776754553, 4.021195093},
|
||
{2.256707e-06, 213.299095438, 5.543113262},
|
||
{1.694205e-06, -3.523118349, 5.025132748},
|
||
{1.554905e-06, 77713.77146792, 5.19846709},
|
||
{1.276839e-06, 7860.419392439, 5.988822341},
|
||
{1.193379e-06, 5223.693919802, 3.64982373},
|
||
{1.115322e-06, 3930.20969622, 1.422745069},
|
||
{7.94185e-07, 11506.769769794, 2.322313077},
|
||
{4.47061e-07, 26.2983198, 3.615796498},
|
||
{4.35206e-07, -398.149003408, 4.349338347},
|
||
{6.00309e-07, 1577.343542448, 2.678271909},
|
||
{4.96817e-07, 6208.294251424, 5.696701824},
|
||
{4.86306e-07, 5884.926846583, 0.520007179},
|
||
{4.32392e-07, 74.781598567, 2.435898309},
|
||
{4.68597e-07, 6244.942814354, 5.866398759},
|
||
{3.7551e-07, 5507.553238667, 4.103476804},
|
||
{2.43085e-07, -775.522611324, 3.651837925},
|
||
{1.73435e-07, 18849.227549974, 6.153743485},
|
||
{2.30685e-07, 5856.477659115, 4.773852582},
|
||
{2.03747e-07, 12036.460734888, 4.333987818},
|
||
},
|
||
{
|
||
{0.000102156724, 6283.075849991, 4.249032005},
|
||
{1.706807e-06, 12566.151699983, 4.205904248},
|
||
{2.69668e-07, 213.299095438, 3.400290479},
|
||
{2.65919e-07, 529.690965095, 5.836047367},
|
||
{2.10568e-07, -3.523118349, 6.262738348},
|
||
{7.7996e-08, 5223.693919802, 4.670344204},
|
||
{5.4764e-08, 1577.343542448, 4.53480017},
|
||
{5.9146e-08, 26.2983198, 1.083044735},
|
||
},
|
||
{
|
||
{4.32299e-06, 6283.075849991, 2.642893748},
|
||
{4.06495e-07, 0.0, 4.71238898},
|
||
{1.22605e-07, 12566.151699983, 2.438140634},
|
||
{1.9476e-08, 213.299095438, 1.642186981},
|
||
},
|
||
{
|
||
{1.43388e-07, 6283.075849991, 1.131453581},
|
||
{6.671e-09, 12566.151699983, 0.775148887},
|
||
},
|
||
{
|
||
{3.826e-09, 6283.075849991, 5.705257275},
|
||
{3.03e-10, 12566.151699983, 5.407132842},
|
||
},
|
||
}
|
||
|
||
// 地心近似,不包含观测者位置引起的日周项。
|
||
func tdbPeriodicSeconds(jd float64) float64 {
|
||
t := (jd - 2451545.0) / 365250.0
|
||
sum := 0.0
|
||
for i := len(tdbPeriodicGroups) - 1; i >= 0; i-- {
|
||
group := 0.0
|
||
for _, term := range tdbPeriodicGroups[i] {
|
||
group += term[0] * math.Sin(term[1]*t+term[2])
|
||
}
|
||
sum = sum*t + group
|
||
}
|
||
return sum + 0.00065e-6*math.Sin(6069.776754*t+4.021194) +
|
||
0.00033e-6*math.Sin(213.299095*t+5.543132) -
|
||
0.00196e-6*math.Sin(6208.294251*t+5.696701) -
|
||
0.00173e-6*math.Sin(74.781599*t+2.435900) +
|
||
0.03638e-6*t*t
|
||
}
|
||
|
||
// TCGMinusTTSeconds 返回 TT 时刻的 TCG−TT(秒)/ TCG−TT in seconds at a TT instant.
|
||
func TCGMinusTTSeconds(jd float64) float64 {
|
||
return lgRate / (1 - lgRate) * (jd - barycentricT0JDE) * 86400
|
||
}
|
||
|
||
// TCBMinusTTSeconds 返回 TT 时刻的地心 TCB−TT 近似值(秒)/ geocentric TCB−TT approximation in seconds at a TT instant.
|
||
func TCBMinusTTSeconds(jd float64) float64 {
|
||
return (lbRate*(jd-barycentricT0JDE)*86400 + tdbPeriodicSeconds(jd) - tdb0Seconds) / (1 - lbRate)
|
||
}
|
||
|
||
// TDBMinusTTSeconds 返回 TT 时刻的地心 TDB−TT 近似值(秒)/ geocentric TDB−TT approximation in seconds at a TT instant.
|
||
func TDBMinusTTSeconds(jd float64) float64 { return tdbPeriodicSeconds(jd) }
|
||
|
||
// TT2TCG 地球时转地心坐标时 / converts TT to TCG.
|
||
func TT2TCG(ttJDE float64) float64 { return ttJDE + TCGMinusTTSeconds(ttJDE)/86400 }
|
||
|
||
// TCG2TT 地心坐标时转地球时 / converts TCG to TT.
|
||
func TCG2TT(tcgJDE float64) float64 { return tcgJDE - lgRate*(tcgJDE-barycentricT0JDE) }
|
||
|
||
// TT2TCB 地球时转太阳系质心坐标时,采用地心近似 / converts TT to TCB using a geocentric approximation.
|
||
func TT2TCB(ttJDE float64) float64 { return ttJDE + TCBMinusTTSeconds(ttJDE)/86400 }
|
||
|
||
// TCB2TT 是 TT2TCB 的逆 / inverts TT2TCB.
|
||
func TCB2TT(tcbJDE float64) float64 {
|
||
// TDB 与 TT 相差不超过 2 ms,拿 TDB 读数当初值可少迭代两轮。
|
||
tt := TCB2TDB(tcbJDE)
|
||
for i := 0; i < 3; i++ {
|
||
tt = tcbJDE - TCBMinusTTSeconds(tt)/86400
|
||
}
|
||
return tt
|
||
}
|
||
|
||
// TT2TDB 地球时转太阳系质心力学时,采用地心近似 / converts TT to TDB using a geocentric approximation.
|
||
func TT2TDB(ttJDE float64) float64 { return ttJDE + TDBMinusTTSeconds(ttJDE)/86400 }
|
||
|
||
// TDB2TT 是 TT2TDB 的逆 / inverts TT2TDB.
|
||
func TDB2TT(tdbJDE float64) float64 {
|
||
tt := tdbJDE - TDBMinusTTSeconds(tdbJDE)/86400
|
||
for i := 0; i < 3; i++ {
|
||
tt = tdbJDE - TDBMinusTTSeconds(tt)/86400
|
||
}
|
||
return tt
|
||
}
|
||
|
||
// TCB2TDB 太阳系质心坐标时转质心力学时 / converts TCB to TDB.
|
||
func TCB2TDB(tcbJDE float64) float64 {
|
||
return tcbJDE + (tdb0Seconds/86400 - lbRate*(tcbJDE-barycentricT0JDE))
|
||
}
|
||
|
||
// TDB2TCB 太阳系质心力学时转质心坐标时 / converts TDB to TCB.
|
||
func TDB2TCB(tdbJDE float64) float64 {
|
||
return tdbJDE + (lbRate*(tdbJDE-barycentricT0JDE)-tdb0Seconds/86400)/(1-lbRate)
|
||
}
|