feat: 引入可切换星历模型并扩展天象观测链路
- 新增半解析、旧模型、自定义与多源堆叠星历实例,提供 Context、Instance、SPK 读取及状态与视位置计算 - 统一太阳、月球和行星实例接口,扩展黄经穿越、留、相位、最近角距、偕日可见、任意高度升落、轨道节点及凌日等天象查询 - 完善日月食、月掩与凌日的月缘剖面、有限盘面接触、站心修正、局地可见性、全球路径和地图输出 - 新增 SVG、GeoJSON、KML 天象输出及凌日、月掩和月缘地形相关缓存与几何求解 - 新增恒星星表导入与查询,支持 CSV、Hipparcos、BSC5、Stellarium 等格式及名称、交叉标识、锥面检索和星等过滤 - 补充 IAU 2006、地球定向、折射消光、大气观测、轨道传播及半解析行星/月球数据支持 - 将默认未来民用时标切换为 TimeScaleLeapHour,更新 2027–2400 农历速查表、中文日期解析和时区边界处理 - 增加事件基线、跨模型回归、几何边界、月缘地形和输出契约测试,完善中英文手册、示例资源、NOTICE 与忽略规则
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"math"
|
||||
|
||||
"b612.me/astro/internal/ephem"
|
||||
"b612.me/astro/planet"
|
||||
. "b612.me/astro/tools"
|
||||
)
|
||||
|
||||
func moonCalcNewNWithInstance(coordIndex int, jd float64, n int, inst *Instance) float64 {
|
||||
if inst == nil {
|
||||
return planet.WhereMoonN(coordIndex, jd, n)
|
||||
}
|
||||
if inst.Model() != ephem.Custom {
|
||||
return planet.WhereMoonModelN(inst.Model(), coordIndex, jd, n)
|
||||
}
|
||||
if lo, bo, distAU, ok := instanceStateEcliptic(ephem.Moon, jd, inst); ok {
|
||||
switch coordIndex {
|
||||
case 0:
|
||||
return lo * math.Pi / 180
|
||||
case 1:
|
||||
return bo * math.Pi / 180
|
||||
case 2:
|
||||
return distAU * astronomicalUnitKM
|
||||
}
|
||||
}
|
||||
return math.NaN()
|
||||
}
|
||||
|
||||
// MoonCalcNewWithInstance 指定星历实例的月球几何量 / lunar geometry with an explicit ephemeris instance.
|
||||
func MoonCalcNewWithInstance(coordIndex int, jd float64, inst *Instance) float64 {
|
||||
return moonCalcNewNWithInstance(coordIndex, jd, -1, inst)
|
||||
}
|
||||
|
||||
// MoonCalcNewNWithInstance 指定星历实例的月球几何量(n 变体) / n-parameterised lunar geometry with an explicit ephemeris instance.
|
||||
func MoonCalcNewNWithInstance(coordIndex int, jd float64, n int, inst *Instance) float64 {
|
||||
return moonCalcNewNWithInstance(coordIndex, jd, n, inst)
|
||||
}
|
||||
|
||||
// HMoonTrueLoWithInstance 指定星历实例的月球真黄经 / true lunar longitude with an explicit ephemeris instance.
|
||||
func HMoonTrueLoWithInstance(jde float64, inst *Instance) float64 {
|
||||
return HMoonTrueLoNWithInstance(jde, -1, inst)
|
||||
}
|
||||
|
||||
// HMoonTrueLoNWithInstance 指定星历实例的月球真黄经(n 变体) / n-parameterised true lunar longitude with an explicit ephemeris instance.
|
||||
func HMoonTrueLoNWithInstance(jde float64, n int, inst *Instance) float64 {
|
||||
return Limit360(moonCalcNewNWithInstance(0, jde, n, inst) * 180 / math.Pi)
|
||||
}
|
||||
|
||||
// HMoonTrueBoWithInstance 指定星历实例的月球真黄纬 / true lunar latitude with an explicit ephemeris instance.
|
||||
func HMoonTrueBoWithInstance(jde float64, inst *Instance) float64 {
|
||||
return HMoonTrueBoNWithInstance(jde, -1, inst)
|
||||
}
|
||||
|
||||
// HMoonTrueBoNWithInstance 指定星历实例的月球真黄纬(n 变体) / n-parameterised true lunar latitude with an explicit ephemeris instance.
|
||||
func HMoonTrueBoNWithInstance(jde float64, n int, inst *Instance) float64 {
|
||||
return moonCalcNewNWithInstance(1, jde, n, inst) * 180 / math.Pi
|
||||
}
|
||||
|
||||
// HMoonAwayWithInstance 指定星历实例的月地距离 / lunar distance with an explicit ephemeris instance.
|
||||
func HMoonAwayWithInstance(jde float64, inst *Instance) float64 {
|
||||
return HMoonAwayNWithInstance(jde, -1, inst)
|
||||
}
|
||||
|
||||
// HMoonAwayNWithInstance 指定星历实例的月地距离(n 变体) / n-parameterised lunar distance with an explicit ephemeris instance.
|
||||
func HMoonAwayNWithInstance(jde float64, n int, inst *Instance) float64 {
|
||||
return moonCalcNewNWithInstance(2, jde, n, inst)
|
||||
}
|
||||
|
||||
// HMoonApparentLoWithInstance 指定星历实例的月球视黄经 / apparent lunar longitude with an explicit ephemeris instance.
|
||||
func HMoonApparentLoWithInstance(jde float64, inst *Instance) float64 {
|
||||
return HMoonApparentLoNWithInstance(jde, -1, inst)
|
||||
}
|
||||
|
||||
// HMoonApparentLoNWithInstance 指定星历实例的月球视黄经(n 变体) / n-parameterised apparent lunar longitude with an explicit ephemeris instance.
|
||||
func HMoonApparentLoNWithInstance(jde float64, n int, inst *Instance) float64 {
|
||||
if lo, _, _, _, ok, err := vectorApparentWithInstance(ephem.Moon, jde, n, inst); err != nil {
|
||||
return math.NaN()
|
||||
} else if ok {
|
||||
return lo
|
||||
}
|
||||
return HMoonTrueLoNWithInstance(jde, n, inst) + Nutation2000Bi(jde)
|
||||
}
|
||||
|
||||
// HMoonGeocentricApparentRaDecWithInstance 指定星历实例的月球地心视赤经纬 / apparent geocentric lunar right ascension and declination with an explicit ephemeris instance.
|
||||
func HMoonGeocentricApparentRaDecWithInstance(jde float64, inst *Instance) (float64, float64) {
|
||||
return HMoonGeocentricApparentRaDecNWithInstance(jde, -1, inst)
|
||||
}
|
||||
|
||||
// HMoonGeocentricApparentRaDecNWithInstance 指定星历实例的月球地心视赤经纬(n 变体) / n-parameterised apparent geocentric lunar right ascension and declination with an explicit ephemeris instance.
|
||||
func HMoonGeocentricApparentRaDecNWithInstance(jde float64, n int, inst *Instance) (float64, float64) {
|
||||
return moonApparentRaDecN(jde, n, inst)
|
||||
}
|
||||
|
||||
// HMoonTrueRaDecWithInstance 指定星历实例的月球真赤经纬 / true lunar right ascension and declination with an explicit ephemeris instance.
|
||||
func HMoonTrueRaDecWithInstance(jde float64, inst *Instance) (float64, float64) {
|
||||
return moonApparentRaDecN(jde, -1, inst)
|
||||
}
|
||||
|
||||
// HMoonApparentRaDecWithInstance 指定星历实例的月球站心视赤经纬 / topocentric apparent lunar right ascension and declination with an explicit ephemeris instance.
|
||||
func HMoonApparentRaDecWithInstance(jd, lon, lat, tz float64, inst *Instance) (float64, float64) {
|
||||
jde := UTC2TT(jd) - tz/24
|
||||
ra, dec := HMoonTrueRaDecWithInstance(jde, inst)
|
||||
away := HMoonAwayWithInstance(jde, inst) / astronomicalUnitKM
|
||||
return TopocentricRaDec(ra, dec, lat, lon, jd-tz/24, away, 0)
|
||||
}
|
||||
Reference in New Issue
Block a user