feat: 完善时标与天象几何计算并扩展输出接口

- 新增时标、ΔT 模型、质心时间与 UT1 支持
- 改进日月食、月掩、行星事件及路径边界计算
- 完善恒星三维自行与动态距离传播
- 扩展 SVG、GeoJSON、KML 输出与底层距离换算工具
- 整理中英文手册、示例资源及回归测试
This commit is contained in:
2026-09-23 18:55:12 +08:00
parent 1f31a9b5b5
commit 16c62a97d5
503 changed files with 33290 additions and 9471 deletions
+2 -2
View File
@@ -1,3 +1,3 @@
// Package planet 用内置 VSOP87 截断级数求行星黄经、黄纬与日心距离;jd 为 TT 儒略日,角度单位为度,距离单位为 AU。
// Package planet evaluates the built-in truncated VSOP87 series for planetary longitude, latitude and heliocentric distance; jd is a TT Julian day, angles are degrees and distances are AU.
// Package planet 用内置 VSOP87 截断级数求行星黄经、黄纬与日心距离;jde 为 TT 儒略日,角度单位为度,距离单位为 AU。
// Package planet evaluates the built-in truncated VSOP87 series for planetary longitude, latitude and heliocentric distance; jde is a TT Julian day, angles are degrees and distances are AU.
package planet
+34 -34
View File
@@ -201,26 +201,26 @@ var lowMoonBTerms = []lowMoonTerm{
{d: 2, m: -2, mp: 0, f: 1, amp: 107},
}
func MoonLo(JD float64) float64 { //'月球平黄经
T := (JD - 2451545) / 36525
func MoonLo(JDE float64) float64 { //'月球平黄经
T := (JDE - 2451545) / 36525
MoonLo := 218.3164591 + 481267.88134236*T - 0.0013268*T*T + T*T*T/538841 - T*T*T*T/65194000
return MoonLo
}
func SunMoonAngle(JD float64) float64 { // '月日距角
T := (JD - 2451545) / 36525
func SunMoonAngle(JDE float64) float64 { // '月日距角
T := (JDE - 2451545) / 36525
SunMoonAngle := 297.8502042 + 445267.1115168*T - 0.00163*T*T + T*T*T/545868 - T*T*T*T/113065000
return SunMoonAngle
}
func MoonM(JD float64) float64 { // '月平近点角
T := (JD - 2451545) / 36525
func MoonM(JDE float64) float64 { // '月平近点角
T := (JDE - 2451545) / 36525
MoonM := 134.9634114 + 477198.8676313*T + 0.008997*T*T + T*T*T/69699 - T*T*T*T/14712000
return MoonM
}
func MoonLonX(JD float64) float64 { // As Double '月球经度参数(到升交点的平角距离)
T := (JD - 2451545) / 36525
func MoonLonX(JDE float64) float64 { // As Double '月球经度参数(到升交点的平角距离)
T := (JDE - 2451545) / 36525
MoonLonX := 93.2720993 + 483202.0175273*T - 0.0034029*T*T - T*T*T/3526000 + T*T*T*T/863310000
return MoonLonX
}
@@ -237,12 +237,12 @@ func lowMoonTermValue(term lowMoonTerm, D, IsunM, IMoonM, F, E float64, trig fun
}
}
func MoonI(JD float64) float64 {
T := (JD - 2451545) / 36525
D := Limit360(SunMoonAngle(JD))
IsunM := SunM(JD)
IMoonM := MoonM(JD)
F := Limit360(MoonLonX(JD))
func MoonI(JDE float64) float64 {
T := (JDE - 2451545) / 36525
D := Limit360(SunMoonAngle(JDE))
IsunM := SunM(JDE)
IMoonM := MoonM(JDE)
F := Limit360(MoonLonX(JDE))
E := 1 - 0.002516*T - 0.0000074*T*T
A1 := 119.75 + 131.849*T
A2 := Limit360(53.09 + 479264.29*T)
@@ -250,16 +250,16 @@ func MoonI(JD float64) float64 {
for _, term := range lowMoonITerms {
MoonI += lowMoonTermValue(term, D, IsunM, IMoonM, F, E, Sin)
}
MoonI = MoonI + 3958*Sin(A1) + 1962*Sin(MoonLo(JD)-F) + 318*Sin(A2)
MoonI = MoonI + 3958*Sin(A1) + 1962*Sin(MoonLo(JDE)-F) + 318*Sin(A2)
return FR(MoonI)
}
func MoonR(JD float64) float64 {
T := (JD - 2451545) / 36525
D := SunMoonAngle(JD)
IsunM := SunM(JD)
IMoonM := Limit360(MoonM(JD))
F := Limit360(MoonLonX(JD))
func MoonR(JDE float64) float64 {
T := (JDE - 2451545) / 36525
D := SunMoonAngle(JDE)
IsunM := SunM(JDE)
IMoonM := Limit360(MoonM(JDE))
F := Limit360(MoonLonX(JDE))
E := 1 - 0.002516*T - 0.0000074*T*T
var MoonR float64
for _, term := range lowMoonRTerms {
@@ -268,12 +268,12 @@ func MoonR(JD float64) float64 {
return MoonR
}
func MoonB(JD float64) float64 {
T := (JD - 2451545) / 36525
D := Limit360(SunMoonAngle(JD))
IsunM := Limit360(SunM(JD))
IMoonM := Limit360(MoonM(JD))
F := Limit360(MoonLonX(JD))
func MoonB(JDE float64) float64 {
T := (JDE - 2451545) / 36525
D := Limit360(SunMoonAngle(JDE))
IsunM := Limit360(SunM(JDE))
IMoonM := Limit360(MoonM(JDE))
F := Limit360(MoonLonX(JDE))
E := 1 - 0.002516*T - 0.0000074*T*T
A1 := Limit360(119.75 + 131.849*T)
A3 := Limit360(313.45 + 481266.484*T)
@@ -281,19 +281,19 @@ func MoonB(JD float64) float64 {
for _, term := range lowMoonBTerms {
MoonB += lowMoonTermValue(term, D, IsunM, IMoonM, F, E, Sin)
}
MoonB += -2235*Sin(MoonLo(JD)) + 382*Sin(A3) + 175*Sin(A1-F) + 175*Sin(A1+F) + 127*Sin(MoonLo(JD)-IMoonM) - 115*Sin(MoonLo(JD)+IMoonM)
MoonB += -2235*Sin(MoonLo(JDE)) + 382*Sin(A3) + 175*Sin(A1-F) + 175*Sin(A1+F) + 127*Sin(MoonLo(JDE)-IMoonM) - 115*Sin(MoonLo(JDE)+IMoonM)
return MoonB
}
func MoonTrueLo(JD float64) float64 {
return Limit360(MoonLo(JD) + (MoonI(JD) / 1000000))
func MoonTrueLo(JDE float64) float64 {
return Limit360(MoonLo(JDE) + (MoonI(JDE) / 1000000))
}
func MoonTrueBo(JD float64) float64 {
return MoonB(JD) / 1000000
func MoonTrueBo(JDE float64) float64 {
return MoonB(JDE) / 1000000
}
func MoonAway(JD float64) float64 { //'月地距离
MoonAway := 385000.56 + MoonR(JD)/1000
func MoonAway(JDE float64) float64 { //'月地距离
MoonAway := 385000.56 + MoonR(JDE)/1000
return MoonAway
}
+5 -5
View File
@@ -5,21 +5,21 @@ import (
"math"
)
// WherePlanet 天体 xt 在儒略日 jd 的 VSOP 结果 / VSOP result for body xt at Julian day jd.
// WherePlanet 天体 xt 在儒略日 jde 的 VSOP 结果 / VSOP result for body xt at Julian day jde.
//
// xt 取 -1 或 0..7:0 为地球,1..7 依次为水星、金星、火星、木星、土星、天王星、海王星;-1 表示地球,zn 取 0 时给日心黄经。
// zn 取 0 黄经、1 黄纬、2 日心距(AU);xt 或 zn 越界返回 NaN 而不 panic。
// xt is -1 or 0..7 (0 Earth, 1..7 Mercury through Neptune; -1 selects Earth, giving its heliocentric longitude for zn 0).
// zn is 0 longitude, 1 latitude, 2 heliocentric distance in AU; an out-of-range xt or zn yields NaN instead of panicking.
func WherePlanet(xt, zn int, jd float64) float64 {
return WherePlanetN(xt, zn, jd, -1)
func WherePlanet(xt, zn int, jde float64) float64 {
return WherePlanetN(xt, zn, jde, -1)
}
// WherePlanetN 同 WherePlanet 的截断版 / truncated form of WherePlanet.
//
// n < 0 时使用全部项;否则保留约 n 个主项并按比例缩短高阶项。取值域与越界行为同 WherePlanet。
// When n < 0 all terms are used; otherwise roughly n principal terms are kept and higher orders scaled proportionally. Domain and out-of-range behavior match WherePlanet.
func WherePlanetN(xt, zn int, jd float64, n int) float64 {
func WherePlanetN(xt, zn int, jde float64, n int) float64 {
if xt < -1 || xt > 7 || zn < 0 || zn > 2 {
return math.NaN()
}
@@ -31,7 +31,7 @@ func WherePlanetN(xt, zn int, jd float64, n int) float64 {
}
rad := 180.0000 * 3600.0000 / math.Pi
t := (jd - 2451545) / 36525.0000
t := (jde - 2451545) / 36525.0000
t /= 10 // 转为儒略千年数
body := planetViews()[xt]
+20 -20
View File
@@ -3,51 +3,51 @@ package planet
import . "b612.me/astro/tools"
// SunLo 太阳几何黄经
func SunLo(jd float64) float64 {
T := (jd - 2451545) / 365250
func SunLo(jde float64) float64 {
T := (jde - 2451545) / 365250
SunLo := 280.4664567 + 360007.6982779*T + 0.03032028*T*T + T*T*T/49931 - T*T*T*T/15299 - T*T*T*T*T/1988000
return Limit360(SunLo)
}
func SunM(JD float64) float64 {
T := (JD - 2451545) / 36525
func SunM(JDE float64) float64 {
T := (JDE - 2451545) / 36525
sunM := 357.5291092 + 35999.0502909*T - 0.0001559*T*T - 0.00000048*T*T*T
return Limit360(sunM)
}
// Earthe 地球偏心率
func Earthe(JD float64) float64 {
T := (JD - 2451545) / 36525
func Earthe(JDE float64) float64 {
T := (JDE - 2451545) / 36525
Earthe := 0.016708617 - 0.000042037*T - 0.0000001236*T*T
return Earthe
}
func EarthPI(JD float64) float64 {
T := (JD - 2451545) / 36525
func EarthPI(JDE float64) float64 {
T := (JDE - 2451545) / 36525
return 102.93735 + 1.71953*T + 0.00046*T*T
}
func SunMidFun(JD float64) float64 {
T := (JD - 2451545) / 36525
M := SunM(JD)
func SunMidFun(JDE float64) float64 {
T := (JDE - 2451545) / 36525
M := SunM(JDE)
SunMidFun := (1.9146-0.004817*T-0.000014*T*T)*Sin(M) + (0.019993-0.000101*T)*Sin(2*M) + 0.00029*Sin(3*M)
return SunMidFun
}
func SunTrueLo(JD float64) float64 {
SunTrueLo := SunLo(JD) + SunMidFun(JD)
func SunTrueLo(JDE float64) float64 {
SunTrueLo := SunLo(JDE) + SunMidFun(JDE)
return SunTrueLo
}
func SunApparentLo(JD float64) float64 {
T := (JD - 2451545) / 36525
SunApparentLo := SunTrueLo(JD) - 0.00569 - 0.00478*Sin(125.04-1934.136*T)
func SunApparentLo(JDE float64) float64 {
T := (JDE - 2451545) / 36525
SunApparentLo := SunTrueLo(JDE) - 0.00569 - 0.00478*Sin(125.04-1934.136*T)
return SunApparentLo
}
func Distance(jd float64) float64 {
f := SunMidFun(jd)
m := SunM(jd)
e := Earthe(jd)
func Distance(jde float64) float64 {
f := SunMidFun(jde)
m := SunM(jde)
e := Earthe(jde)
return 1.000001018 * (1 - e*e) / (1 + e*Cos(f+m))
}