- 新增日食、月食、本地可见性、中心线、半影区域、SVG 图示与沙罗周期信息 - 新增行星冲合、留、方照、物理星历、视直径、相位、亮肢角、轨道节点等计算 - 新增木星伽利略卫星位置、现象与接触事件计算 - 新增恒星星表、星座判定、自行修正与观测辅助能力 - 新增 coord、formula、orbit、sundial、lite/sun、lite/moon 等扩展包 - 完善农历年号、月相英文别名、视差角、大气质量、折射、日晷与双星计算 - 增加 NASA、JPL Horizons、IMCCE 等回归测试数据与基线测试 - 重构基础算法文件组织,补充大量公开 API 注释和语义回归测试 - 更新中文和英文 README,补充示例、精度说明、SVG 配图
183 lines
6.9 KiB
Go
183 lines
6.9 KiB
Go
package basic
|
|
|
|
import "sync"
|
|
|
|
type constellationMeta struct {
|
|
code string
|
|
zh string
|
|
en string
|
|
}
|
|
|
|
type constellationBoundary struct {
|
|
code string
|
|
points []constellationPoint
|
|
minRA float64
|
|
maxRA float64
|
|
minDec float64
|
|
maxDec float64
|
|
}
|
|
|
|
var (
|
|
constellationInitOnce sync.Once
|
|
constellationMetas = [...]constellationMeta{
|
|
{code: "AND", zh: "仙女座", en: "Andromeda"},
|
|
{code: "ANT", zh: "唧筒座", en: "Antlia"},
|
|
{code: "APS", zh: "天燕座", en: "Apus"},
|
|
{code: "AQR", zh: "宝瓶座", en: "Aquarius"},
|
|
{code: "AQL", zh: "天鹰座", en: "Aquila"},
|
|
{code: "ARA", zh: "天坛座", en: "Ara"},
|
|
{code: "ARI", zh: "白羊座", en: "Aries"},
|
|
{code: "AUR", zh: "御夫座", en: "Auriga"},
|
|
{code: "BOO", zh: "牧夫座", en: "Bootes"},
|
|
{code: "CAE", zh: "雕具座", en: "Caelum"},
|
|
{code: "CAM", zh: "鹿豹座", en: "Camelopardalis"},
|
|
{code: "CNC", zh: "巨蟹座", en: "Cancer"},
|
|
{code: "CVN", zh: "猎犬座", en: "Canes Venatici"},
|
|
{code: "CMA", zh: "大犬座", en: "Canis Major"},
|
|
{code: "CMI", zh: "小犬座", en: "Canis Minor"},
|
|
{code: "CAP", zh: "摩羯座", en: "Capricornus"},
|
|
{code: "CAR", zh: "船底座", en: "Carina"},
|
|
{code: "CAS", zh: "仙后座", en: "Cassiopeia"},
|
|
{code: "CEN", zh: "半人马座", en: "Centaurus"},
|
|
{code: "CEP", zh: "仙王座", en: "Cepheus"},
|
|
{code: "CET", zh: "鲸鱼座", en: "Cetus"},
|
|
{code: "CHA", zh: "蝘蜓座", en: "Chamaeleon"},
|
|
{code: "CIR", zh: "圆规座", en: "Circinus"},
|
|
{code: "COL", zh: "天鸽座", en: "Columba"},
|
|
{code: "COM", zh: "后发座", en: "Coma Berenices"},
|
|
{code: "CRA", zh: "南冕座", en: "Corona Australis"},
|
|
{code: "CRB", zh: "北冕座", en: "Corona Borealis"},
|
|
{code: "CRV", zh: "乌鸦座", en: "Corvus"},
|
|
{code: "CRT", zh: "巨爵座", en: "Crater"},
|
|
{code: "CRU", zh: "南十字座", en: "Crux"},
|
|
{code: "CYG", zh: "天鹅座", en: "Cygnus"},
|
|
{code: "DEL", zh: "海豚座", en: "Delphinus"},
|
|
{code: "DOR", zh: "剑鱼座", en: "Dorado"},
|
|
{code: "DRA", zh: "天龙座", en: "Draco"},
|
|
{code: "EQU", zh: "小马座", en: "Equuleus"},
|
|
{code: "ERI", zh: "波江座", en: "Eridanus"},
|
|
{code: "FOR", zh: "天炉座", en: "Fornax"},
|
|
{code: "GEM", zh: "双子座", en: "Gemini"},
|
|
{code: "GRU", zh: "天鹤座", en: "Grus"},
|
|
{code: "HER", zh: "武仙座", en: "Hercules"},
|
|
{code: "HOR", zh: "时钟座", en: "Horologium"},
|
|
{code: "HYA", zh: "长蛇座", en: "Hydra"},
|
|
{code: "HYI", zh: "水蛇座", en: "Hydrus"},
|
|
{code: "IND", zh: "印第安座", en: "Indus"},
|
|
{code: "LAC", zh: "蝎虎座", en: "Lacerta"},
|
|
{code: "LEO", zh: "狮子座", en: "Leo"},
|
|
{code: "LMI", zh: "小狮座", en: "Leo Minor"},
|
|
{code: "LEP", zh: "天兔座", en: "Lepus"},
|
|
{code: "LIB", zh: "天秤座", en: "Libra"},
|
|
{code: "LUP", zh: "豺狼座", en: "Lupus"},
|
|
{code: "LYN", zh: "天猫座", en: "Lynx"},
|
|
{code: "LYR", zh: "天琴座", en: "Lyra"},
|
|
{code: "MEN", zh: "山案座", en: "Mensa"},
|
|
{code: "MIC", zh: "显微镜座", en: "Microscopium"},
|
|
{code: "MON", zh: "麒麟座", en: "Monoceros"},
|
|
{code: "MUS", zh: "苍蝇座", en: "Musca"},
|
|
{code: "NOR", zh: "矩尺座", en: "Norma"},
|
|
{code: "OCT", zh: "南极座", en: "Octans"},
|
|
{code: "OPH", zh: "蛇夫座", en: "Ophiuchus"},
|
|
{code: "ORI", zh: "猎户座", en: "Orion"},
|
|
{code: "PAV", zh: "孔雀座", en: "Pavo"},
|
|
{code: "PEG", zh: "飞马座", en: "Pegasus"},
|
|
{code: "PER", zh: "英仙座", en: "Perseus"},
|
|
{code: "PHE", zh: "凤凰座", en: "Phoenix"},
|
|
{code: "PIC", zh: "绘架座", en: "Pictor"},
|
|
{code: "PSC", zh: "双鱼座", en: "Pisces"},
|
|
{code: "PSA", zh: "南鱼座", en: "Piscis Austrinus"},
|
|
{code: "PUP", zh: "船尾座", en: "Puppis"},
|
|
{code: "PYX", zh: "罗盘座", en: "Pyxis"},
|
|
{code: "RET", zh: "网罟座", en: "Reticulum"},
|
|
{code: "SGE", zh: "天箭座", en: "Sagitta"},
|
|
{code: "SGR", zh: "人马座", en: "Sagittarius"},
|
|
{code: "SCO", zh: "天蝎座", en: "Scorpius"},
|
|
{code: "SCL", zh: "玉夫座", en: "Sculptor"},
|
|
{code: "SCT", zh: "盾牌座", en: "Scutum"},
|
|
{code: "SER1", zh: "巨蛇座", en: "Serpens Caput"},
|
|
{code: "SER2", zh: "巨蛇座", en: "Serpens Cauda"},
|
|
{code: "SEX", zh: "六分仪座", en: "Sextans"},
|
|
{code: "TAU", zh: "金牛座", en: "Taurus"},
|
|
{code: "TEL", zh: "望远镜座", en: "Telescopium"},
|
|
{code: "TRI", zh: "三角座", en: "Triangulum"},
|
|
{code: "TRA", zh: "南三角座", en: "Triangulum Australe"},
|
|
{code: "TUC", zh: "杜鹃座", en: "Tucana"},
|
|
{code: "UMA", zh: "大熊座", en: "Ursa Major"},
|
|
{code: "UMI", zh: "小熊座", en: "Ursa Minor"},
|
|
{code: "VEL", zh: "船帆座", en: "Vela"},
|
|
{code: "VIR", zh: "室女座", en: "Virgo"},
|
|
{code: "VOL", zh: "飞鱼座", en: "Volans"},
|
|
{code: "VUL", zh: "狐狸座", en: "Vulpecula"},
|
|
}
|
|
constellationNameZH map[string]string
|
|
constellationNameEN map[string]string
|
|
constellationBoundaries []constellationBoundary
|
|
constellationRayStart = constellationPoint{RA: 277.5, DEC: -100}
|
|
)
|
|
|
|
func initConstellationData() {
|
|
constellationInitOnce.Do(func() {
|
|
initConstellationPolygons()
|
|
constellationNameZH = make(map[string]string, len(constellationMetas))
|
|
constellationNameEN = make(map[string]string, len(constellationMetas))
|
|
constellationBoundaries = make([]constellationBoundary, 0, len(constellationMetas)-2)
|
|
for _, meta := range constellationMetas {
|
|
constellationNameZH[meta.code] = meta.zh
|
|
constellationNameEN[meta.code] = meta.en
|
|
if meta.code == "UMI" || meta.code == "OCT" {
|
|
continue
|
|
}
|
|
points := constellationPolygons[meta.code]
|
|
if len(points) == 0 {
|
|
continue
|
|
}
|
|
boundary := constellationBoundary{
|
|
code: meta.code,
|
|
points: points,
|
|
minRA: points[0].RA,
|
|
maxRA: points[0].RA,
|
|
minDec: points[0].DEC,
|
|
maxDec: points[0].DEC,
|
|
}
|
|
for _, point := range points[1:] {
|
|
if point.RA < boundary.minRA {
|
|
boundary.minRA = point.RA
|
|
}
|
|
if point.RA > boundary.maxRA {
|
|
boundary.maxRA = point.RA
|
|
}
|
|
if point.DEC < boundary.minDec {
|
|
boundary.minDec = point.DEC
|
|
}
|
|
if point.DEC > boundary.maxDec {
|
|
boundary.maxDec = point.DEC
|
|
}
|
|
}
|
|
constellationBoundaries = append(constellationBoundaries, boundary)
|
|
}
|
|
})
|
|
}
|
|
|
|
// ConstellationCode returns the IAU constellation code / 返回 IAU 星座代码。
|
|
func ConstellationCode(ra, dec, jde float64) string {
|
|
return resolveConstellationCode(ra, dec, jde)
|
|
}
|
|
|
|
// ConstellationNameEN returns the English constellation name / 返回英文星座名。
|
|
func ConstellationNameEN(ra, dec, jde float64) string {
|
|
return ConstellationNameByCodeEN(ConstellationCode(ra, dec, jde))
|
|
}
|
|
|
|
// ConstellationNameByCodeZH returns the Chinese name for a code / 返回星座代码对应的中文名。
|
|
func ConstellationNameByCodeZH(code string) string {
|
|
initConstellationData()
|
|
return constellationNameZH[code]
|
|
}
|
|
|
|
// ConstellationNameByCodeEN returns the English name for a code / 返回星座代码对应的英文名。
|
|
func ConstellationNameByCodeEN(code string) string {
|
|
initConstellationData()
|
|
return constellationNameEN[code]
|
|
}
|