- 新增日食、月食、本地可见性、中心线、半影区域、SVG 图示与沙罗周期信息 - 新增行星冲合、留、方照、物理星历、视直径、相位、亮肢角、轨道节点等计算 - 新增木星伽利略卫星位置、现象与接触事件计算 - 新增恒星星表、星座判定、自行修正与观测辅助能力 - 新增 coord、formula、orbit、sundial、lite/sun、lite/moon 等扩展包 - 完善农历年号、月相英文别名、视差角、大气质量、折射、日晷与双星计算 - 增加 NASA、JPL Horizons、IMCCE 等回归测试数据与基线测试 - 重构基础算法文件组织,补充大量公开 API 注释和语义回归测试 - 更新中文和英文 README,补充示例、精度说明、SVG 配图
138 lines
4.6 KiB
Go
138 lines
4.6 KiB
Go
package saturn
|
|
|
|
import (
|
|
"time"
|
|
|
|
"b612.me/astro/basic"
|
|
"b612.me/astro/calendar"
|
|
"b612.me/astro/planet"
|
|
)
|
|
|
|
// N variants keep the same semantics as the non-N APIs; n < 0 means full series.
|
|
|
|
// ApparentLoN 视黄经(截断版) / truncated apparent ecliptic longitude.
|
|
func ApparentLoN(date time.Time, n int) float64 {
|
|
jde := calendar.Date2JDE(date.UTC())
|
|
return basic.SaturnApparentLoN(basic.TD2UT(jde, true), n)
|
|
}
|
|
|
|
// ApparentBoN 视黄纬(截断版) / truncated apparent ecliptic latitude.
|
|
func ApparentBoN(date time.Time, n int) float64 {
|
|
jde := calendar.Date2JDE(date.UTC())
|
|
return basic.SaturnApparentBoN(basic.TD2UT(jde, true), n)
|
|
}
|
|
|
|
// ApparentRaN 视赤经(截断版) / truncated apparent right ascension.
|
|
func ApparentRaN(date time.Time, n int) float64 {
|
|
jde := calendar.Date2JDE(date.UTC())
|
|
return basic.SaturnApparentRaN(basic.TD2UT(jde, true), n)
|
|
}
|
|
|
|
// ApparentDecN 视赤纬(截断版) / truncated apparent declination.
|
|
func ApparentDecN(date time.Time, n int) float64 {
|
|
jde := calendar.Date2JDE(date.UTC())
|
|
return basic.SaturnApparentDecN(basic.TD2UT(jde, true), n)
|
|
}
|
|
|
|
// ApparentRaDecN 视赤经赤纬(截断版) / truncated apparent right ascension and declination.
|
|
func ApparentRaDecN(date time.Time, n int) (float64, float64) {
|
|
jde := calendar.Date2JDE(date.UTC())
|
|
return basic.SaturnApparentRaDecN(basic.TD2UT(jde, true), n)
|
|
}
|
|
|
|
// ApparentMagnitudeN 视星等(截断版) / truncated apparent magnitude.
|
|
func ApparentMagnitudeN(date time.Time, n int) float64 {
|
|
jde := calendar.Date2JDE(date.UTC())
|
|
return basic.SaturnMagN(basic.TD2UT(jde, true), n)
|
|
}
|
|
|
|
// EarthDistanceN 地球距离(截断版) / truncated Earth distance.
|
|
func EarthDistanceN(date time.Time, n int) float64 {
|
|
jde := calendar.Date2JDE(date.UTC())
|
|
return basic.EarthSaturnAwayN(basic.TD2UT(jde, true), n)
|
|
}
|
|
|
|
// SunDistanceN 太阳距离(截断版) / truncated Sun distance.
|
|
func SunDistanceN(date time.Time, n int) float64 {
|
|
jde := calendar.Date2JDE(date.UTC())
|
|
return planet.WherePlanetN(5, 2, basic.TD2UT(jde, true), n)
|
|
}
|
|
|
|
// AltitudeN 高度角(截断版) / truncated altitude angle.
|
|
func AltitudeN(date time.Time, lon, lat float64, n int) float64 {
|
|
jde := basic.Date2JDE(date)
|
|
_, loc := date.Zone()
|
|
timezone := float64(loc) / 3600.0
|
|
return basic.SaturnHeightN(jde, lon, lat, timezone, n)
|
|
}
|
|
|
|
// ZenithN 天顶距(截断版) / truncated zenith distance.
|
|
func ZenithN(date time.Time, lon, lat float64, n int) float64 {
|
|
return 90 - AltitudeN(date, lon, lat, n)
|
|
}
|
|
|
|
// AzimuthN 方位角(截断版) / truncated azimuth angle.
|
|
func AzimuthN(date time.Time, lon, lat float64, n int) float64 {
|
|
jde := basic.Date2JDE(date)
|
|
_, loc := date.Zone()
|
|
timezone := float64(loc) / 3600.0
|
|
return basic.SaturnAzimuthN(jde, lon, lat, timezone, n)
|
|
}
|
|
|
|
// HourAngleN 时角(截断版) / truncated hour angle.
|
|
func HourAngleN(date time.Time, lon float64, n int) float64 {
|
|
jde := basic.Date2JDE(date)
|
|
_, loc := date.Zone()
|
|
timezone := float64(loc) / 3600.0
|
|
return basic.SaturnHourAngleN(jde, lon, timezone, n)
|
|
}
|
|
|
|
// CulminationTimeN 中天时间(截断版) / truncated culmination time.
|
|
func CulminationTimeN(date time.Time, lon float64, n int) time.Time {
|
|
if date.Hour() > 12 {
|
|
date = date.Add(time.Hour * -12)
|
|
}
|
|
jde := basic.Date2JDE(date)
|
|
_, loc := date.Zone()
|
|
timezone := float64(loc) / 3600.0
|
|
calcJde := basic.SaturnCulminationTimeN(jde, lon, timezone, n) - timezone/24.0
|
|
return basic.JDE2DateByZone(calcJde, date.Location(), false)
|
|
}
|
|
|
|
// RiseTimeN 升起时间(截断版) / truncated rise time.
|
|
func RiseTimeN(date time.Time, lon, lat, height float64, aero bool, n int) (time.Time, error) {
|
|
var aeroFloat float64
|
|
if aero {
|
|
aeroFloat = 1
|
|
}
|
|
if date.Hour() > 12 {
|
|
date = date.Add(time.Hour * -12)
|
|
}
|
|
jde := basic.Date2JDE(date)
|
|
_, loc := date.Zone()
|
|
timezone := float64(loc) / 3600.0
|
|
riseJde, err := basic.SaturnRiseTimeN(jde, lon, lat, timezone, aeroFloat, height, n)
|
|
return riseSetResult(date, riseJde, err)
|
|
}
|
|
|
|
// DownTimeN 落下时间别名(截断版) / truncated down-time alias.
|
|
func DownTimeN(date time.Time, lon, lat, height float64, aero bool, n int) (time.Time, error) {
|
|
return SetTimeN(date, lon, lat, height, aero, n)
|
|
}
|
|
|
|
// SetTimeN 落下时间(截断版) / truncated set time.
|
|
func SetTimeN(date time.Time, lon, lat, height float64, aero bool, n int) (time.Time, error) {
|
|
var aeroFloat float64
|
|
if aero {
|
|
aeroFloat = 1
|
|
}
|
|
if date.Hour() > 12 {
|
|
date = date.Add(time.Hour * -12)
|
|
}
|
|
jde := basic.Date2JDE(date)
|
|
_, loc := date.Zone()
|
|
timezone := float64(loc) / 3600.0
|
|
riseJde, err := basic.SaturnSetTimeN(jde, lon, lat, timezone, aeroFloat, height, n)
|
|
return riseSetResult(date, riseJde, err)
|
|
}
|