Files
astro/basic/sun_observation_ephemeris_instance.go
T
b612 044f2f4381 feat: 引入可切换星历模型并扩展天象观测链路
- 新增半解析、旧模型、自定义与多源堆叠星历实例,提供 Context、Instance、SPK 读取及状态与视位置计算
- 统一太阳、月球和行星实例接口,扩展黄经穿越、留、相位、最近角距、偕日可见、任意高度升落、轨道节点及凌日等天象查询
- 完善日月食、月掩与凌日的月缘剖面、有限盘面接触、站心修正、局地可见性、全球路径和地图输出
- 新增 SVG、GeoJSON、KML 天象输出及凌日、月掩和月缘地形相关缓存与几何求解
- 新增恒星星表导入与查询,支持 CSV、Hipparcos、BSC5、Stellarium 等格式及名称、交叉标识、锥面检索和星等过滤
- 补充 IAU 2006、地球定向、折射消光、大气观测、轨道传播及半解析行星/月球数据支持
- 将默认未来民用时标切换为 TimeScaleLeapHour,更新 2027–2400 农历速查表、中文日期解析和时区边界处理
- 增加事件基线、跨模型回归、几何边界、月缘地形和输出契约测试,完善中英文手册、示例资源、NOTICE 与忽略规则
2026-10-15 23:54:15 +08:00

134 lines
4.8 KiB
Go

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)
}