package neptune import ( "b612.me/astro/basic" "b612.me/astro/calendar" "b612.me/astro/planet" "errors" "time" ) var ( ERR_NEPTUNE_NEVER_RISE = errors.New("ERROR:极夜,海王星今日永远在地平线下!") ERR_NEPTUNE_NEVER_DOWN = errors.New("ERROR:极昼,海王星今日永远在地平线上!") ) // ApparentLo 视黄经 func ApparentLo(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.NeptuneApparentLo(basic.TD2UT(jde, true)) } // ApparentBo 视黄纬 func ApparentBo(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.NeptuneApparentBo(basic.TD2UT(jde, true)) } // ApparentRa 视赤经 func ApparentRa(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.NeptuneApparentRa(basic.TD2UT(jde, true)) } // ApparentDec 视赤纬 func ApparentDec(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.NeptuneApparentDec(basic.TD2UT(jde, true)) } // ApparentRaDec 视赤经赤纬 func ApparentRaDec(date time.Time) (float64, float64) { jde := calendar.Date2JDE(date) return basic.NeptuneApparentRaDec(basic.TD2UT(jde, true)) } // ApparentMagnitude 视星等 func ApparentMagnitude(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.NeptuneMag(basic.TD2UT(jde, true)) } // EarthDistance 与地球距离(天文单位) func EarthDistance(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.EarthNeptuneAway(basic.TD2UT(jde, true)) } // EarthDistance 与太阳距离(天文单位) func SunDistance(date time.Time) float64 { jde := calendar.Date2JDE(date) return planet.WherePlanet(7, 2, basic.TD2UT(jde, true)) } // Zenith 高度角 func Zenith(date time.Time, lon, lat float64) float64 { jde := basic.Date2JDE(date) _, loc := date.Zone() timezone := float64(loc) / 3600.0 return basic.NeptuneHeight(jde, lon, lat, timezone) } // Azimuth 方位角 func Azimuth(date time.Time, lon, lat float64) float64 { jde := basic.Date2JDE(date) _, loc := date.Zone() timezone := float64(loc) / 3600.0 return basic.NeptuneAzimuth(jde, lon, lat, timezone) } // HourAngle 时角 // 返回给定经纬度、对应date时区date时刻的时角( func HourAngle(date time.Time, lon float64) float64 { jde := basic.Date2JDE(date) _, loc := date.Zone() timezone := float64(loc) / 3600.0 return basic.NeptuneHourAngle(jde, lon, timezone) } // CulminationTime 中天时间 // 返回给定经纬度、对应date时区date时刻的中天日期 func CulminationTime(date time.Time, lon float64) 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.NeptuneCulminationTime(jde, lon, timezone) - timezone/24.00 return basic.JDE2DateByZone(calcJde, date.Location(), false) } // RiseTime 升起时间 // date,取日期,时区忽略 // lon,经度,东正西负 // lat,纬度,北正南负 // height,高度 // aero,true时进行大气修正 func RiseTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) { var err 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 := basic.NeptuneRiseTime(jde, lon, lat, timezone, aeroFloat, height) if riseJde == -2 { err = ERR_NEPTUNE_NEVER_RISE } if riseJde == -1 { err = ERR_NEPTUNE_NEVER_DOWN } return basic.JDE2DateByZone(riseJde, date.Location(), true), err } // DownTime 落下时间 // date,取日期,时区忽略 // lon,经度,东正西负 // lat,纬度,北正南负 // height,高度 // aero,true时进行大气修正 func DownTime(date time.Time, lon, lat, height float64, aero bool) (time.Time, error) { var err 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 := basic.NeptuneDownTime(jde, lon, lat, timezone, aeroFloat, height) if riseJde == -2 { err = ERR_NEPTUNE_NEVER_RISE } if riseJde == -1 { err = ERR_NEPTUNE_NEVER_DOWN } return basic.JDE2DateByZone(riseJde, date.Location(), true), err } // LastConjunction 上次合日时间 // 返回上次合日时间 func LastConjunction(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.LastNeptuneConjunction(jde), date.Location(), false) } // NextConjunction 下次合日时间 // 返回下次合日时间 func NextConjunction(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextNeptuneConjunction(jde), date.Location(), false) } // LastOpposition 上次冲日时间 // 返回上次冲日时间 func LastOpposition(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.LastNeptuneOpposition(jde), date.Location(), false) } // NextOpposition 下次冲日时间 // 返回下次冲日时间 func NextOpposition(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextNeptuneOpposition(jde), date.Location(), false) } // LastProgradeToRetrograde 上次留(顺转逆) // 返回上次顺转逆留的时间 func LastProgradeToRetrograde(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.LastNeptuneProgradeToRetrograde(jde), date.Location(), false) } // NextProgradeToRetrograde 下次留(顺转逆) // 返回下次顺转逆留的时间 func NextProgradeToRetrograde(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextNeptuneProgradeToRetrograde(jde), date.Location(), false) } // LastRetrogradeToPrograde 上次留(逆转瞬) // 返回上次逆转瞬留的时间 func LastRetrogradeToPrograde(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.LastNeptuneRetrogradeToPrograde(jde), date.Location(), false) } // NextRetrogradeToPrograde 上次留(逆转瞬) //// 返回上次逆转瞬留的时间 func NextRetrogradeToPrograde(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextNeptuneRetrogradeToPrograde(jde), date.Location(), false) } // LastEasternQuadrature 上次东方照时间 // 返回上次东方照时间 func LastEasternQuadrature(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.LastNeptuneEasternQuadrature(jde), date.Location(), false) } // NextEasternQuadrature 下次东方照时间 // 返回下次东方照时间 func NextEasternQuadrature(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextNeptuneEasternQuadrature(jde), date.Location(), false) } // LastWesternQuadrature 上次西方照时间 // 返回上次西方照时间 func LastWesternQuadrature(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.LastNeptuneWesternQuadrature(jde), date.Location(), false) } // NextWesternQuadrature 下次西方照时间 // 返回下次西方照时间 func NextWesternQuadrature(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextNeptuneWesternQuadrature(jde), date.Location(), false) }