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,133 @@
|
||||
package basic
|
||||
|
||||
import (
|
||||
"math"
|
||||
|
||||
. "b612.me/astro/tools"
|
||||
)
|
||||
|
||||
func sunTimeWithInstance(jde float64, n int, inst *Instance) float64 {
|
||||
if inst == nil {
|
||||
if n < 0 {
|
||||
return SunTime(jde)
|
||||
}
|
||||
return SunTimeN(jde, n)
|
||||
}
|
||||
// 均时差必须用平黄经 SunLo,真黄经会丢掉中心差。
|
||||
rightAscension := HSunApparentRaNWithInstance(jde, n, inst)
|
||||
time := (SunLo(jde) - 0.0057183 - rightAscension + Nutation2000Bi(jde)*Cos(TrueObliquity(jde))) / 15
|
||||
if time > 23 {
|
||||
time -= 24
|
||||
}
|
||||
return time
|
||||
}
|
||||
|
||||
func sunHeightWithInstance(jd, lon, lat, tz float64, n int, inst *Instance) float64 {
|
||||
if inst == nil {
|
||||
if n < 0 {
|
||||
return SunHeight(jd, lon, lat, tz)
|
||||
}
|
||||
return SunHeightN(jd, lon, lat, tz, n)
|
||||
}
|
||||
return sunObservationStateN(jd, lon, lat, tz, n, inst).altitude
|
||||
}
|
||||
|
||||
// SunTimeWithInstance 太阳均时差 / equation of time with an explicit ephemeris instance.
|
||||
func SunTimeWithInstance(jde float64, inst *Instance) float64 {
|
||||
return sunTimeWithInstance(jde, -1, inst)
|
||||
}
|
||||
|
||||
// SunTimeNWithInstance 太阳均时差(n 变体) / n-parameterised equation of time with an explicit ephemeris instance.
|
||||
func SunTimeNWithInstance(jde float64, n int, inst *Instance) float64 {
|
||||
return sunTimeWithInstance(jde, n, inst)
|
||||
}
|
||||
|
||||
// CulminationTimeWithInstance 太阳中天时刻 / solar culmination time with an explicit ephemeris instance.
|
||||
func CulminationTimeWithInstance(localJD, lon, tz float64, inst *Instance) float64 {
|
||||
if inst == nil {
|
||||
return CulminationTime(localJD, lon, tz)
|
||||
}
|
||||
localJD = math.Floor(localJD)
|
||||
tmp := longitudeOffsetDegrees(tz*15-lon) * 4 / 60
|
||||
return localJD + tmp/24 - SunTimeWithInstance(localJD, inst)/24
|
||||
}
|
||||
|
||||
// CulminationTimeNWithInstance 太阳中天时刻(n 变体) / n-parameterised solar culmination time with an explicit ephemeris instance.
|
||||
func CulminationTimeNWithInstance(localJD, lon, tz float64, n int, inst *Instance) float64 {
|
||||
if inst == nil {
|
||||
return CulminationTimeN(localJD, lon, tz, n)
|
||||
}
|
||||
localJD = math.Floor(localJD)
|
||||
tmp := longitudeOffsetDegrees(tz*15-lon) * 4 / 60
|
||||
return localJD + tmp/24 - SunTimeNWithInstance(localJD, n, inst)/24
|
||||
}
|
||||
|
||||
// SunTimeAngleWithInstance 太阳时角 / solar hour angle with an explicit ephemeris instance.
|
||||
func SunTimeAngleWithInstance(jd, lon, lat, tz float64, inst *Instance) float64 {
|
||||
if inst == nil {
|
||||
return SunTimeAngle(jd, lon, lat, tz)
|
||||
}
|
||||
calculationJD := jd - tz/24
|
||||
siderealTime := Limit360(ApparentSiderealTime(UTC2UT1(calculationJD))*15 + lon)
|
||||
hourAngle := siderealTime - HSunApparentRaWithInstance(UTC2TT(calculationJD), inst)
|
||||
if hourAngle < 0 {
|
||||
hourAngle += 360
|
||||
}
|
||||
return hourAngle
|
||||
}
|
||||
|
||||
// SunTimeAngleNWithInstance 太阳时角(n 变体) / n-parameterised solar hour angle with an explicit ephemeris instance.
|
||||
func SunTimeAngleNWithInstance(jd, lon, lat, tz float64, n int, inst *Instance) float64 {
|
||||
if inst == nil {
|
||||
return SunTimeAngleN(jd, lon, lat, tz, n)
|
||||
}
|
||||
calculationJD := jd - tz/24
|
||||
siderealTime := Limit360(ApparentSiderealTime(UTC2UT1(calculationJD))*15 + lon)
|
||||
hourAngle := siderealTime - HSunApparentRaNWithInstance(UTC2TT(calculationJD), n, inst)
|
||||
if hourAngle < 0 {
|
||||
hourAngle += 360
|
||||
}
|
||||
return hourAngle
|
||||
}
|
||||
|
||||
// SunHeightWithInstance 太阳高度角 / solar altitude with an explicit ephemeris instance.
|
||||
func SunHeightWithInstance(jd, lon, lat, tz float64, inst *Instance) float64 {
|
||||
return sunHeightWithInstance(jd, lon, lat, tz, -1, inst)
|
||||
}
|
||||
|
||||
// SunHeightNWithInstance 太阳高度角(n 变体) / n-parameterised solar altitude with an explicit ephemeris instance.
|
||||
func SunHeightNWithInstance(jd, lon, lat, tz float64, n int, inst *Instance) float64 {
|
||||
return sunHeightWithInstance(jd, lon, lat, tz, n, inst)
|
||||
}
|
||||
|
||||
// LowSunHeightWithInstance 低精度太阳高度角 / low-precision solar altitude with an explicit ephemeris instance.
|
||||
func LowSunHeightWithInstance(jd, lon, lat, tz float64, inst *Instance) float64 {
|
||||
if inst == nil {
|
||||
return LowSunHeight(jd, lon, lat, tz)
|
||||
}
|
||||
calculationJD := jd - tz/24
|
||||
siderealTime := Limit360(ApparentSiderealTime(UTC2UT1(calculationJD))*15 + lon)
|
||||
ra, dec := HSunApparentRaDecWithInstance(UTC2TT(calculationJD), inst)
|
||||
hourAngle := Limit360(siderealTime - ra)
|
||||
return ArcSin(Sin(lat)*Sin(dec) + Cos(dec)*Cos(lat)*Cos(hourAngle))
|
||||
}
|
||||
|
||||
// SunAzimuthWithInstance 太阳方位角 / solar azimuth with an explicit ephemeris instance.
|
||||
func SunAzimuthWithInstance(jd, lon, lat, tz float64, inst *Instance) float64 {
|
||||
return sunAzimuthWithInstance(jd, lon, lat, tz, -1, inst)
|
||||
}
|
||||
|
||||
// SunAzimuthNWithInstance 太阳方位角(n 变体) / n-parameterised solar azimuth with an explicit ephemeris instance.
|
||||
func SunAzimuthNWithInstance(jd, lon, lat, tz float64, n int, inst *Instance) float64 {
|
||||
return sunAzimuthWithInstance(jd, lon, lat, tz, n, inst)
|
||||
}
|
||||
|
||||
func sunAzimuthWithInstance(jd, lon, lat, tz float64, n int, inst *Instance) float64 {
|
||||
if inst == nil {
|
||||
if n < 0 {
|
||||
return SunAzimuth(jd, lon, lat, tz)
|
||||
}
|
||||
return SunAzimuthN(jd, lon, lat, tz, n)
|
||||
}
|
||||
return sunAzimuthN(jd, lon, lat, tz, n, inst)
|
||||
}
|
||||
Reference in New Issue
Block a user