package uranus import ( "b612.me/astro/basic" "b612.me/astro/calendar" "b612.me/astro/planet" "errors" "time" ) var ( ERR_URANUS_NEVER_RISE = errors.New("ERROR:极夜,天王星今日永远在地平线下!") ERR_URANUS_NEVER_DOWN = errors.New("ERROR:极昼,天王星今日永远在地平线上!") ) // ApparentLo 视黄经 func ApparentLo(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.UranusApparentLo(basic.TD2UT(jde, true)) } // ApparentBo 视黄纬 func ApparentBo(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.UranusApparentBo(basic.TD2UT(jde, true)) } // ApparentRa 视赤经 func ApparentRa(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.UranusApparentRa(basic.TD2UT(jde, true)) } // ApparentDec 视赤纬 func ApparentDec(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.UranusApparentDec(basic.TD2UT(jde, true)) } // ApparentRaDec 视赤经赤纬 func ApparentRaDec(date time.Time) (float64, float64) { jde := calendar.Date2JDE(date) return basic.UranusApparentRaDec(basic.TD2UT(jde, true)) } // ApparentMagnitude 视星等 func ApparentMagnitude(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.UranusMag(basic.TD2UT(jde, true)) } // EarthDistance 与地球距离(天文单位) func EarthDistance(date time.Time) float64 { jde := calendar.Date2JDE(date) return basic.EarthUranusAway(basic.TD2UT(jde, true)) } // EarthDistance 与太阳距离(天文单位) func SunDistance(date time.Time) float64 { jde := calendar.Date2JDE(date) return planet.WherePlanet(6, 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.UranusHeight(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.UranusAzimuth(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.UranusHourAngle(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.UranusCulminationTime(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.UranusRiseTime(jde, lon, lat, timezone, aeroFloat, height) if riseJde == -2 { err = ERR_URANUS_NEVER_RISE } if riseJde == -1 { err = ERR_URANUS_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.UranusDownTime(jde, lon, lat, timezone, aeroFloat, height) if riseJde == -2 { err = ERR_URANUS_NEVER_RISE } if riseJde == -1 { err = ERR_URANUS_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.LastUranusConjunction(jde), date.Location(), false) } // NextConjunction 下次合日时间 // 返回下次合日时间 func NextConjunction(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextUranusConjunction(jde), date.Location(), false) } // LastOpposition 上次冲日时间 // 返回上次冲日时间 func LastOpposition(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.LastUranusOpposition(jde), date.Location(), false) } // NextOpposition 下次冲日时间 // 返回下次冲日时间 func NextOpposition(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextUranusOpposition(jde), date.Location(), false) } // LastProgradeToRetrograde 上次留(顺转逆) // 返回上次顺转逆留的时间 func LastProgradeToRetrograde(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.LastUranusProgradeToRetrograde(jde), date.Location(), false) } // NextProgradeToRetrograde 下次留(顺转逆) // 返回下次顺转逆留的时间 func NextProgradeToRetrograde(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextUranusProgradeToRetrograde(jde), date.Location(), false) } // LastRetrogradeToPrograde 上次留(逆转瞬) // 返回上次逆转瞬留的时间 func LastRetrogradeToPrograde(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.LastUranusRetrogradeToPrograde(jde), date.Location(), false) } // NextRetrogradeToPrograde 上次留(逆转瞬) //// 返回上次逆转瞬留的时间 func NextRetrogradeToPrograde(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextUranusRetrogradeToPrograde(jde), date.Location(), false) } // LastEasternQuadrature 上次东方照时间 // 返回上次东方照时间 func LastEasternQuadrature(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.LastUranusEasternQuadrature(jde), date.Location(), false) } // NextEasternQuadrature 下次东方照时间 // 返回下次东方照时间 func NextEasternQuadrature(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextUranusEasternQuadrature(jde), date.Location(), false) } // LastWesternQuadrature 上次西方照时间 // 返回上次西方照时间 func LastWesternQuadrature(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.LastUranusWesternQuadrature(jde), date.Location(), false) } // NextWesternQuadrature 下次西方照时间 // 返回下次西方照时间 func NextWesternQuadrature(date time.Time) time.Time { jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true) return basic.JDE2DateByZone(basic.NextUranusWesternQuadrature(jde), date.Location(), false) }