Compare commits

...

6 Commits

@ -7,10 +7,12 @@ import (
"time"
)
var defDeltaTFn = DefaultDeltaT
/*
@name:
@dec: 1582
@
@name:
@dec: 1582
@
*/
func JDECalc(Year, Month int, Day float64) float64 {
if Month == 1 || Month == 2 {
@ -29,7 +31,7 @@ func JDECalc(Year, Month int, Day float64) float64 {
}
/*
@name:
@name:
*/
func GetNowJDE() (NowJDE float64) {
Time := float64(time.Now().Second())/3600.0/24.0 + float64(time.Now().Minute())/60.0/24.0 + float64(time.Now().Hour())/24.0
@ -91,7 +93,36 @@ func dt_cal(y float64) float64 { //传入年, 返回世界时UT与原子时
res := d[i+1] + d[i+2]*t1 + d[i+3]*t2 + d[i+4]*t3
return (res)
}
func DeltaT(Date float64, IsJDE bool) (Result float64) { //传入年或儒略日,传出为秒
func DeltaT(date float64, isJDE bool) float64 {
return defDeltaTFn(date, isJDE)
}
func SetDeltaTFn(fn func(float64, bool) float64) {
if fn != nil {
defDeltaTFn = fn
}
}
func GetDeltaTFn() func(float64, bool) float64 {
return defDeltaTFn
}
func OldDefaultDeltaT(Date float64, IsJDE bool) (Result float64) { //传入年或儒略日,传出为秒
var Year float64
if IsJDE {
dates := JDE2Date(Date)
Year = float64(dates.Year()) + float64(dates.YearDay())/365.0
} else {
Year = Date
}
if Year < 2100 && Year >= 2010 {
return dt_cal(Year)
}
return DefaultDeltaT(Date, IsJDE)
}
func DefaultDeltaT(Date float64, IsJDE bool) (Result float64) { //传入年或儒略日,传出为秒
var Year float64
if IsJDE {
dates := JDE2Date(Date)
@ -120,6 +151,7 @@ func DeltaT(Date float64, IsJDE bool) (Result float64) { //传入年或儒略日
}
return
}
func TD2UT(JDE float64, UT2TD bool) float64 { // true 世界时转力学时CCfalse 力学时转世界时VV
Deltat := DeltaT(JDE, true)
@ -235,8 +267,8 @@ func GetLunar(year, month, day int, tz float64) (lmonth, lday int, leap bool, re
}
jieqi := GetOneYearJQ(year) //一年的节气
moon := GetOneYearMoon(float64(year)) //一年朔月日
winter1 := jieqi[1] //第一年冬至日
winter2 := jieqi[25] //第二年冬至日
winter1 := jieqi[1] - 8.0/24 + tz //第一年冬至日
winter2 := jieqi[25] - 8.0/24 + tz //第二年冬至日
for k, v := range moon {
if tz != 8.0/24 {
v = v - 8.0/24 + tz
@ -334,8 +366,8 @@ func GetSolar(year, month, day int, leap bool, tz float64) float64 {
}
jieqi := GetOneYearJQ(year) //一年的节气
moon := GetOneYearMoon(float64(year)) //一年朔月日
winter1 := jieqi[1] //第一年冬至日
winter2 := jieqi[25] //第二年冬至日
winter1 := jieqi[1] - 8.0/24 + tz //第一年冬至日
winter2 := jieqi[25] - 8.0/24 + tz //第二年冬至日
for k, v := range moon {
if tz != 8.0/24 {
v = v - 8.0/24 + tz

File diff suppressed because one or more lines are too long

@ -20,6 +20,27 @@ func Test_ParseStar(t *testing.T) {
}
}
func TestGetStarByChniese(t *testing.T) {
err := LoadStarData()
if err != nil {
t.Fatal(err)
}
sirius, err := StarDataByChinese("天狼星")
if err != nil {
t.Fatal(err)
}
if sirius.HIP != 32349 || sirius.HR != 2491 {
t.Fatal("cannot found star")
}
fmt.Printf("%+v\n", sirius)
sirius, err = StarDataByChinese("天狼")
if err != nil {
t.Fatal(err)
}
if sirius.HIP != 32349 || sirius.HR != 2491 {
t.Fatal("cannot found star")
}
}
func TestGetRaDecByDate(t *testing.T) {
err := LoadStarData()
@ -30,6 +51,7 @@ func TestGetRaDecByDate(t *testing.T) {
if err != nil {
t.Fatal(err)
}
fmt.Printf("%+v\n", sirius)
fmt.Println(Format(sirius.Ra/15, 1), Format(sirius.Dec, 0))
now := GetNowJDE()
ra, dec := sirius.RaDecByJde(now)

@ -39,7 +39,7 @@ const (
// 按现行农历GB/T 33661-2017算法计算推荐使用年限为[1929-3000]年
// 古代由于定朔定气误差此处计算会与古时不符
func Lunar(year, month, day int, timezone float64) (int, int, bool, string) {
return basic.GetLunar(year, month, day, timezone)
return basic.GetLunar(year, month, day, timezone/24.0)
}
// Solar 农历转公历

@ -5,7 +5,7 @@ import (
"testing"
)
type LunarSolar struct {
type lunarSolar struct {
Lyear int
Lmonth int
Lday int
@ -16,7 +16,7 @@ type LunarSolar struct {
}
func Test_ChineseCalendar(t *testing.T) {
var testData = []LunarSolar{
var testData = []lunarSolar{
{Lyear: 2034, Lmonth: 1, Lday: 1, Leap: false, Year: 2034, Month: 2, Day: 19},
{Lyear: 2033, Lmonth: 12, Lday: 30, Leap: false, Year: 2034, Month: 2, Day: 18},
{Lyear: 2033, Lmonth: 11, Lday: 27, Leap: true, Year: 2034, Month: 1, Day: 17},
@ -37,7 +37,7 @@ func Test_ChineseCalendar(t *testing.T) {
}
for _, v := range testData {
var lyear int = v.Year
lmonth, lday, leap, desp := Lunar(v.Year, v.Month, v.Day)
lmonth, lday, leap, desp := Lunar(v.Year, v.Month, v.Day, 8.0)
if lmonth > v.Month {
lyear--
}
@ -46,7 +46,7 @@ func Test_ChineseCalendar(t *testing.T) {
t.Fatal(v, lyear, lmonth, lday, leap, desp)
}
date := Solar(v.Lyear, v.Lmonth, v.Lday, v.Leap)
date := Solar(v.Lyear, v.Lmonth, v.Lday, v.Leap, 8.0)
if date.Year() != v.Year || int(date.Month()) != v.Month || date.Day() != v.Day {
t.Fatal(v, date)
}

@ -91,9 +91,10 @@ func ApparentRaDec(date time.Time, lon, lat float64) (float64, float64) {
}
// HourAngle 月亮时角
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
//
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
func HourAngle(date time.Time, lon, lat float64) float64 {
jde := basic.Date2JDE(date)
_, loc := date.Zone()
@ -101,9 +102,10 @@ func HourAngle(date time.Time, lon, lat float64) float64 {
}
// Azimuth 月亮方位角
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
//
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
func Azimuth(date time.Time, lon, lat float64) float64 {
jde := basic.Date2JDE(date)
_, loc := date.Zone()
@ -111,9 +113,10 @@ func Azimuth(date time.Time, lon, lat float64) float64 {
}
// Zenith 月亮高度角
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
//
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
func Zenith(date time.Time, lon, lat float64) float64 {
jde := basic.Date2JDE(date)
_, loc := date.Zone()
@ -121,21 +124,26 @@ func Zenith(date time.Time, lon, lat float64) float64 {
}
// CulminationTime 月亮中天时间
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
//
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
func CulminationTime(date time.Time, lon, lat float64) time.Time {
if date.Hour() > 12 {
date = date.Add(time.Hour * -12)
}
jde := basic.Date2JDE(date)
_, loc := date.Zone()
return basic.JDE2DateByZone(basic.MoonCulminationTime(jde, lon, lat, float64(loc)/3600.0), date.Location(), true)
}
// RiseTime 月亮升起时间
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
// height高度
// aero,是否进行大气修正
//
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
// height高度
// aero,是否进行大气修正
func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
var err error
if date.Hour() > 12 {
@ -162,11 +170,12 @@ func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, e
}
// DownTime 月亮降下时间
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
// height高度
// aero大气修正
//
// date, 世界时(忽略此处时区)
// lon经度东正西负
// lat纬度北正南负
// height高度
// aero大气修正
func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) {
var err error
if date.Hour() > 12 {

@ -20,7 +20,7 @@ func Constellation(ra, dec float64, date time.Time) string {
return basic.WhichCst(ra, dec, jde)
}
//MeanSiderealTime UTC 平恒星时
// MeanSiderealTime UTC 平恒星时
func MeanSiderealTime(date time.Time) float64 {
return basic.MeanSiderealTime(basic.Date2JDE(date.UTC()))
}
@ -31,13 +31,14 @@ func ApparentSiderealTime(date time.Time) float64 {
}
// RiseTime 星星升起时间
// date, 世界时(忽略此处时区)
// raDate瞬时赤经
// decDate瞬时赤纬
// lon经度东正西负
// lat纬度北正南负
// height高度
// aero,是否进行大气修正
//
// date, 世界时(忽略此处时区)
// raDate瞬时赤经
// decDate瞬时赤纬
// lon经度东正西负
// lat纬度北正南负
// height高度
// aero,是否进行大气修正
func RiseTime(date time.Time, ra, dec, lon, lat, height float64, aero bool) (time.Time, error) {
var err error
if date.Hour() > 12 {
@ -56,14 +57,15 @@ func RiseTime(date time.Time, ra, dec, lon, lat, height float64, aero bool) (tim
return basic.JDE2DateByZone(riseJde, date.Location(), true), err
}
// DownTime 星星升起时间
// date, 世界时(忽略此处时区)
// raDate瞬时赤经
// decDate瞬时赤纬
// lon经度东正西负
// lat纬度北正南负
// height高度
// aero,是否进行大气修正
// DownTime 星星降落时间
//
// date, 世界时(忽略此处时区)
// raDate瞬时赤经
// decDate瞬时赤纬
// lon经度东正西负
// lat纬度北正南负
// height高度
// aero,是否进行大气修正
func DownTime(date time.Time, ra, dec, lon, lat, height float64, aero bool) (time.Time, error) {
var err error
if date.Hour() > 12 {
@ -106,7 +108,7 @@ func Zenith(date time.Time, ra, dec, lon, lat float64) float64 {
jde := basic.Date2JDE(date)
_, loc := date.Zone()
timezone := float64(loc) / 3600.0
return basic.StarAzimuth(jde, ra, dec, lon, lat, timezone)
return basic.StarHeight(jde, ra, dec, lon, lat, timezone)
}
// CulminationTime 恒星中天时间
@ -127,7 +129,25 @@ func InitStarDatabase() error {
return basic.LoadStarData()
}
//通过恒星HR编号获取恒星参数
func GetStarDataByHR(hr int) (basic.StarData, error) {
// 通过恒星HR编号获取恒星参数
func StarDataByHR(hr int) (basic.StarData, error) {
return basic.StarDataByHR(hr)
}
// 通过中文名获取恒星参数
func StarDataByName(name string) (basic.StarData, error) {
return basic.StarDataByChinese(name)
}
// 从亮到暗返回视星等小于3.00的恒星数据
func TopBrightStars() ([]basic.StarData, error) {
var brightStars = make([]basic.StarData, 0, 170)
for _, star := range []int{2491, 2326, 5340, 5459, 7001, 1708, 1713, 2943, 472, 2061, 5267, 7557, 1457, 6134, 5056, 2990, 8728, 4853, 7924, 4730, 5460, 3982, 2618, 6527, 4763, 1790, 1791, 3685, 1903, 4731, 8425, 4905, 3207, 4301, 1017, 2693, 6879, 3307, 5191, 6553, 2088, 6217, 2421, 7790, 3485, 2294, 2891, 3748, 617, 7121, 424, 188, 1948, 337, 15, 2004, 5288, 6556, 5563, 8636, 936, 4534, 4819, 7796, 3634, 5793, 1852, 168, 6705, 3165, 3699, 603, 21, 5054, 6241, 5469, 5132, 5440, 5953, 4295, 99, 8308, 6580, 8775, 6378, 4554, 8162, 2827, 7949, 264, 8781, 3734, 911, 5231, 4357, 6175, 1865, 4662, 4621, 7194, 5685, 4057, 2095, 5984, 1956, 553, 4786, 5854, 5235, 403, 5571, 4216, 4798, 1577, 6508, 6859, 2773, 5506, 7525, 6056, 6132, 5531, 5028, 4199, 1899, 6603, 6148, 5776, 6536, 1666, 4656, 98, 6913, 3185, 6212, 6165, 4932, 39, 1829, 1203, 6461, 5897, 8502, 591, 8322, 1165, 7528, 2286, 2890, 7264, 6084, 5944, 5671, 1220, 2845, 4915, 8232, 2553, 915, 8650, 1231, 4757, 6510, 8414, 2473, 3873, 6746, 7235, 1605} {
info, err := basic.StarDataByHR(star)
if err != nil {
return nil, err
}
brightStars = append(brightStars, info)
}
return brightStars, nil
}

@ -12,7 +12,7 @@ func TestStar(t *testing.T) {
if err != nil {
t.Fatal(err)
}
sirius, err := GetStarDataByHR(2491)
sirius, err := StarDataByHR(2491)
if err != nil {
t.Fatal(err)
}

Loading…
Cancel
Save