feat: 完善时标与天象几何计算并扩展输出接口
- 新增时标、ΔT 模型、质心时间与 UT1 支持 - 改进日月食、月掩、行星事件及路径边界计算 - 完善恒星三维自行与动态距离传播 - 扩展 SVG、GeoJSON、KML 输出与底层距离换算工具 - 整理中英文手册、示例资源及回归测试
This commit is contained in:
+2
-2
@@ -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
@@ -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
@@ -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
@@ -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))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user