Files
astro/jupiter/satellites.go
T
b612 2bf8478639 feat: 完善日月食与月掩几何链路并扩展历法接口
- 新增日月食中心带、偏食带、阴影足迹、等时线、食分线及升落边界计算,支持极区与混合食拓扑
- 新增日食单时刻阴影求解器、站心状态查询、批量采样和 ΔT 覆盖接口
- 重构恒星与行星月掩路径,补充有限盘面接触、站心修正、掩带宽度、极区投影及升落边界
- 扩展 SVG 与 GeoJSON 输出,支持详细面板、全球/极区/地球投影、边界闭合、时间标记和拓扑签名
- 扩展日月食候选搜索、局地搜索、沙罗序列预计算与范围外推,补充系列锚点和成员一致性校验
- 补齐古历纪年、儒略历独有闰日、多公历候选、历法改革跨日及精确日期运算接口
- 优化 ΔT、章动、恒星时、月球地平线、事件根搜索和本地星历缓存,降低重复计算开销并提升边界稳定
2026-09-17 12:27:40 +08:00

79 lines
3.0 KiB
Go

package jupiter
import (
"time"
"b612.me/astro/basic"
)
// GalileanSatellitePosition 木星伽利略卫星视位置 / apparent position of a Galilean satellite.
//
// Jovicentric* 为木心 J2000 平赤道直角坐标与速度,单位 AU / AU-day。
// ApparentRA/Dec 为该卫星的地心天体测量赤经赤纬,单位度。
// OffsetX/OffsetY 以木星中心为原点,分别沿天球东、北方向为正。
// Jovicentric* are Jovicentric J2000 mean-equatorial coordinates and velocities in AU / AU-day.
// ApparentRA/Dec are geocentric astrometric right ascension and declination in degrees.
// OffsetX/OffsetY are measured from Jupiter's center, positive to celestial east and north.
type GalileanSatellitePosition struct {
JovicentricX float64
JovicentricY float64
JovicentricZ float64
JovicentricVX float64
JovicentricVY float64
JovicentricVZ float64
ApparentRA float64
ApparentDec float64
EarthDistance float64
OffsetXArcsec float64
OffsetYArcsec float64
OffsetXJupiterR float64
OffsetYJupiterR float64
OffsetZJupiterR float64
InFrontOfJupiter bool
}
// GalileanSatellitesInfo 四颗伽利略卫星视位置 / apparent positions of the four Galilean satellites.
type GalileanSatellitesInfo struct {
Io GalileanSatellitePosition
Europa GalileanSatellitePosition
Ganymede GalileanSatellitePosition
Callisto GalileanSatellitePosition
}
// Satellites 木星四颗伽利略卫星视位置 / apparent positions of Jupiter's four Galilean satellites.
//
// date 表示观测绝对时刻(UTC),内部换算为该时刻对应的 TT/TDB 历元做 L1 星历求值。
// date is the observing instant in UTC; it is converted to the corresponding TT/TDB epoch for the L1 ephemeris evaluation.
func Satellites(date time.Time) GalileanSatellitesInfo {
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
observations := basic.JupiterGalileanSatelliteObservations(jde)
return GalileanSatellitesInfo{
Io: galileanSatellitePositionFromBasic(observations[0]),
Europa: galileanSatellitePositionFromBasic(observations[1]),
Ganymede: galileanSatellitePositionFromBasic(observations[2]),
Callisto: galileanSatellitePositionFromBasic(observations[3]),
}
}
func galileanSatellitePositionFromBasic(observation basic.JupiterGalileanObservation) GalileanSatellitePosition {
return GalileanSatellitePosition{
JovicentricX: observation.State.X,
JovicentricY: observation.State.Y,
JovicentricZ: observation.State.Z,
JovicentricVX: observation.State.VX,
JovicentricVY: observation.State.VY,
JovicentricVZ: observation.State.VZ,
ApparentRA: observation.RA,
ApparentDec: observation.Dec,
EarthDistance: observation.Distance,
OffsetXArcsec: observation.OffsetXArcsec,
OffsetYArcsec: observation.OffsetYArcsec,
OffsetXJupiterR: observation.OffsetXJupiterRadii,
OffsetYJupiterR: observation.OffsetYJupiterRadii,
OffsetZJupiterR: observation.OffsetZJupiterRadii,
InFrontOfJupiter: observation.InFrontOfJupiter,
}
}