- 新增日食、月食、本地可见性、中心线、半影区域、SVG 图示与沙罗周期信息 - 新增行星冲合、留、方照、物理星历、视直径、相位、亮肢角、轨道节点等计算 - 新增木星伽利略卫星位置、现象与接触事件计算 - 新增恒星星表、星座判定、自行修正与观测辅助能力 - 新增 coord、formula、orbit、sundial、lite/sun、lite/moon 等扩展包 - 完善农历年号、月相英文别名、视差角、大气质量、折射、日晷与双星计算 - 增加 NASA、JPL Horizons、IMCCE 等回归测试数据与基线测试 - 重构基础算法文件组织,补充大量公开 API 注释和语义回归测试 - 更新中文和英文 README,补充示例、精度说明、SVG 配图
130 lines
5.4 KiB
Go
130 lines
5.4 KiB
Go
// Package coord 坐标工具包 / coordinate utility package.
|
||
//
|
||
// 本包面向用户提供常用坐标变换、恒星时、岁差、站心和地平坐标封装。
|
||
// 所有角度输入和输出默认使用度;恒星时输出使用小时。
|
||
// date 按绝对时刻使用,内部会转换为 UTC 后计算。
|
||
package coord
|
||
|
||
import (
|
||
"time"
|
||
|
||
"b612.me/astro/basic"
|
||
)
|
||
|
||
// Ecliptic 黄道坐标 / ecliptic coordinates.
|
||
type Ecliptic struct {
|
||
Lon float64 // 黄经,单位度 / ecliptic longitude in degrees.
|
||
Lat float64 // 黄纬,单位度 / ecliptic latitude in degrees.
|
||
}
|
||
|
||
// Equatorial 赤道坐标 / equatorial coordinates.
|
||
type Equatorial struct {
|
||
RA float64 // 赤经,单位度 / right ascension in degrees.
|
||
Dec float64 // 赤纬,单位度 / declination in degrees.
|
||
}
|
||
|
||
// Horizontal 地平坐标 / horizontal coordinates.
|
||
type Horizontal struct {
|
||
Azimuth float64 // 方位角,正北为0,顺时针增加 / azimuth from north clockwise, degrees.
|
||
Altitude float64 // 高度角,单位度 / altitude in degrees.
|
||
Zenith float64 // 天顶距,单位度 / zenith distance in degrees.
|
||
HourAngle float64 // 时角,单位度 / hour angle in degrees.
|
||
}
|
||
|
||
func jdeUTC(date time.Time) float64 {
|
||
return basic.Date2JDE(date.UTC())
|
||
}
|
||
|
||
// EclipticToEquatorial 黄道坐标转赤道坐标 / converts ecliptic to equatorial coordinates.
|
||
func EclipticToEquatorial(date time.Time, lon, lat float64) Equatorial {
|
||
ra, dec := basic.LoBoToRaDec(jdeUTC(date), lon, lat)
|
||
return Equatorial{RA: ra, Dec: dec}
|
||
}
|
||
|
||
// EquatorialToEcliptic 赤道坐标转黄道坐标 / converts equatorial to ecliptic coordinates.
|
||
func EquatorialToEcliptic(date time.Time, ra, dec float64) Ecliptic {
|
||
lon, lat := basic.RaDecToLoBo(jdeUTC(date), ra, dec)
|
||
return Ecliptic{Lon: lon, Lat: lat}
|
||
}
|
||
|
||
// Precess 岁差修正 / precesses equatorial coordinates from one date to another.
|
||
func Precess(from, to time.Time, ra, dec float64) Equatorial {
|
||
nextRA, nextDec := basic.Precess(ra, dec, jdeUTC(from), jdeUTC(to))
|
||
return Equatorial{RA: nextRA, Dec: nextDec}
|
||
}
|
||
|
||
// EclipticObliquity 黄赤交角 / ecliptic obliquity.
|
||
func EclipticObliquity(date time.Time, nutation bool) float64 {
|
||
return basic.EclipticObliquity(jdeUTC(date), nutation)
|
||
}
|
||
|
||
// Nutation2000B IAU 2000B 章动 / IAU 2000B nutation.
|
||
func Nutation2000B(date time.Time) (longitude, obliquity float64) {
|
||
return basic.Nutation2000B(jdeUTC(date))
|
||
}
|
||
|
||
// Nutation1980 IAU 1980 章动 / IAU 1980 nutation.
|
||
func Nutation1980(date time.Time) (longitude, obliquity float64) {
|
||
return basic.Nutation1980(jdeUTC(date))
|
||
}
|
||
|
||
// MeanSiderealTime 平恒星时,单位小时 / mean sidereal time in hours.
|
||
func MeanSiderealTime(date time.Time) float64 {
|
||
return basic.MeanSiderealTime(jdeUTC(date))
|
||
}
|
||
|
||
// ApparentSiderealTime 真恒星时,单位小时 / apparent sidereal time in hours.
|
||
func ApparentSiderealTime(date time.Time) float64 {
|
||
return basic.ApparentSiderealTime(jdeUTC(date))
|
||
}
|
||
|
||
// HourAngle 时角 / hour angle.
|
||
//
|
||
// ra 为瞬时赤经;observerLon 为观测者经度,东正西负。
|
||
// ra is apparent right ascension; observerLon is east-positive longitude.
|
||
func HourAngle(date time.Time, ra, observerLon float64) float64 {
|
||
return basic.StarHourAngle(jdeUTC(date), ra, observerLon, 0)
|
||
}
|
||
|
||
// EquatorialToHorizontal 赤道坐标转地平坐标 / converts equatorial to horizontal coordinates.
|
||
//
|
||
// ra/dec 为瞬时赤经赤纬;observerLon/observerLat 为观测者经纬度,东正西负、北正南负。
|
||
// ra/dec are apparent coordinates; observerLon/observerLat are east-positive and north-positive.
|
||
func EquatorialToHorizontal(date time.Time, ra, dec, observerLon, observerLat float64) Horizontal {
|
||
jde := jdeUTC(date)
|
||
altitude := basic.StarHeight(jde, ra, dec, observerLon, observerLat, 0)
|
||
return Horizontal{
|
||
Azimuth: basic.StarAzimuth(jde, ra, dec, observerLon, observerLat, 0),
|
||
Altitude: altitude,
|
||
Zenith: 90 - altitude,
|
||
HourAngle: basic.StarHourAngle(jde, ra, observerLon, 0),
|
||
}
|
||
}
|
||
|
||
// TopocentricEquatorial 地心赤道坐标转站心赤道坐标 / converts geocentric to topocentric equatorial coordinates.
|
||
//
|
||
// distanceAU 为目标天体到地心距离,单位 AU;height 为观测者海拔,单位米。
|
||
// distanceAU is geocentric distance in AU; height is observer elevation in meters.
|
||
func TopocentricEquatorial(date time.Time, ra, dec, observerLon, observerLat, distanceAU, height float64) Equatorial {
|
||
topRA, topDec := basic.TopocentricRaDec(ra, dec, observerLat, observerLon, jdeUTC(date), distanceAU, height)
|
||
return Equatorial{RA: topRA, Dec: topDec}
|
||
}
|
||
|
||
// TopocentricEcliptic 地心黄道坐标转站心黄道坐标 / converts geocentric to topocentric ecliptic coordinates.
|
||
//
|
||
// distanceAU 为目标天体到地心距离,单位 AU;height 为观测者海拔,单位米。
|
||
// distanceAU is geocentric distance in AU; height is observer elevation in meters.
|
||
func TopocentricEcliptic(date time.Time, lon, lat, observerLon, observerLat, distanceAU, height float64) Ecliptic {
|
||
topLon := basic.TopocentricLo(lon, lat, observerLat, observerLon, jdeUTC(date), distanceAU, height)
|
||
topLat := basic.TopocentricBo(lon, lat, observerLat, observerLon, jdeUTC(date), distanceAU, height)
|
||
return Ecliptic{Lon: topLon, Lat: topLat}
|
||
}
|
||
|
||
// AngularSeparation 角距离 / angular separation.
|
||
//
|
||
// 输入为两组赤道坐标,单位度;返回角距离,单位度。
|
||
// Inputs are two equatorial coordinates in degrees; return value is in degrees.
|
||
func AngularSeparation(ra1, dec1, ra2, dec2 float64) float64 {
|
||
return basic.StarAngularSeparation(ra1, dec1, ra2, dec2)
|
||
}
|