新增恒星相关计算
This commit is contained in:
parent
7604fabf8f
commit
bb07e23238
@ -17,10 +17,10 @@ func Benchmark_All(b *testing.B) {
|
|||||||
|
|
||||||
func show() {
|
func show() {
|
||||||
jde := GetNowJDE() - 1
|
jde := GetNowJDE() - 1
|
||||||
ra := HSunSeeRa(jde - 8.0/24.0)
|
ra := HSunApparentRa(jde - 8.0/24.0)
|
||||||
dec := HSunSeeDec(jde - 8.0/24.0)
|
dec := HSunApparentDec(jde - 8.0/24.0)
|
||||||
fmt.Printf("当前JDE:%.14f\n", jde)
|
fmt.Printf("当前JDE:%.14f\n", jde)
|
||||||
fmt.Println("当前太阳黄经:", HSunSeeLo(jde-8.0/24.0))
|
fmt.Println("当前太阳黄经:", HSunApparentLo(jde-8.0/24.0))
|
||||||
fmt.Println("当前太阳赤经:", ra)
|
fmt.Println("当前太阳赤经:", ra)
|
||||||
fmt.Println("当前太阳赤纬:", dec)
|
fmt.Println("当前太阳赤纬:", dec)
|
||||||
fmt.Println("当前太阳星座:", WhichCst(ra, dec, jde))
|
fmt.Println("当前太阳星座:", WhichCst(ra, dec, jde))
|
||||||
|
@ -68,7 +68,7 @@ func ZhanXinRaDec(ra, dec, lat, lon, jd, au, h float64) (float64, float64) {
|
|||||||
sinpi := Sin(0.0024427777777) / au
|
sinpi := Sin(0.0024427777777) / au
|
||||||
pcosi := pcosi(lat, h)
|
pcosi := pcosi(lat, h)
|
||||||
psini := psini(lat, h)
|
psini := psini(lat, h)
|
||||||
tH := Limit360(TD2UT(SeeStarTime(jd), false)*15 + lon - ra)
|
tH := Limit360(TD2UT(ApparentSiderealTime(jd), false)*15 + lon - ra)
|
||||||
nra := math.Atan2(-pcosi*sinpi*Sin(tH), (Cos(dec)-pcosi*sinpi*Cos(tH))) * 180 / math.Pi
|
nra := math.Atan2(-pcosi*sinpi*Sin(tH), (Cos(dec)-pcosi*sinpi*Cos(tH))) * 180 / math.Pi
|
||||||
|
|
||||||
ndec := math.Atan2((Sin(dec)-psini*sinpi)*Cos(nra), (Cos(dec)-pcosi*sinpi*Cos(tH))) * 180 / math.Pi
|
ndec := math.Atan2((Sin(dec)-psini*sinpi)*Cos(nra), (Cos(dec)-pcosi*sinpi*Cos(tH))) * 180 / math.Pi
|
||||||
@ -78,7 +78,7 @@ func ZhanXinRaDec(ra, dec, lat, lon, jd, au, h float64) (float64, float64) {
|
|||||||
func ZhanXinRa(ra, dec, lat, lon, jd, au, h float64) float64 { //jd为格林尼治标准时
|
func ZhanXinRa(ra, dec, lat, lon, jd, au, h float64) float64 { //jd为格林尼治标准时
|
||||||
sinpi := Sin(0.0024427777777) / au
|
sinpi := Sin(0.0024427777777) / au
|
||||||
pcosi := pcosi(lat, h)
|
pcosi := pcosi(lat, h)
|
||||||
tH := Limit360(TD2UT(SeeStarTime(jd), false)*15 + lon - ra)
|
tH := Limit360(TD2UT(ApparentSiderealTime(jd), false)*15 + lon - ra)
|
||||||
nra := math.Atan2(-pcosi*sinpi*Sin(tH), (Cos(dec)-pcosi*sinpi*Cos(tH))) * 180 / math.Pi
|
nra := math.Atan2(-pcosi*sinpi*Sin(tH), (Cos(dec)-pcosi*sinpi*Cos(tH))) * 180 / math.Pi
|
||||||
return ra + nra
|
return ra + nra
|
||||||
}
|
}
|
||||||
@ -87,7 +87,7 @@ func ZhanXinDec(ra, dec, lat, lon, jd, au, h float64) float64 { //jd为格林尼
|
|||||||
sinpi := Sin(0.0024427777777) / au
|
sinpi := Sin(0.0024427777777) / au
|
||||||
pcosi := pcosi(lat, h)
|
pcosi := pcosi(lat, h)
|
||||||
psini := psini(lat, h)
|
psini := psini(lat, h)
|
||||||
tH := Limit360(TD2UT(SeeStarTime(jd), false)*15 + lon - ra)
|
tH := Limit360(TD2UT(ApparentSiderealTime(jd), false)*15 + lon - ra)
|
||||||
nra := math.Atan2(-pcosi*sinpi*Sin(tH), (Cos(dec)-pcosi*sinpi*Cos(tH))) * 180 / math.Pi
|
nra := math.Atan2(-pcosi*sinpi*Sin(tH), (Cos(dec)-pcosi*sinpi*Cos(tH))) * 180 / math.Pi
|
||||||
|
|
||||||
ndec := math.Atan2((Sin(dec)-psini*sinpi)*Cos(nra), (Cos(dec)-pcosi*sinpi*Cos(tH))) * 180 / math.Pi
|
ndec := math.Atan2((Sin(dec)-psini*sinpi)*Cos(nra), (Cos(dec)-pcosi*sinpi*Cos(tH))) * 180 / math.Pi
|
||||||
@ -99,7 +99,7 @@ func ZhanXinLo(lo, bo, lat, lon, jd, au, h float64) float64 { //jd为格林尼
|
|||||||
S := psini(lat, h)
|
S := psini(lat, h)
|
||||||
sinpi := Sin(0.0024427777777) / au
|
sinpi := Sin(0.0024427777777) / au
|
||||||
ra := LoToRa(lo, bo, jd)
|
ra := LoToRa(lo, bo, jd)
|
||||||
tH := Limit360(TD2UT(SeeStarTime(jd), false)*15 + lon - ra)
|
tH := Limit360(TD2UT(ApparentSiderealTime(jd), false)*15 + lon - ra)
|
||||||
N := Cos(lo)*Cos(bo) - C*sinpi*Cos(tH)
|
N := Cos(lo)*Cos(bo) - C*sinpi*Cos(tH)
|
||||||
nlo := math.Atan2(Sin(lo)*Cos(bo)-sinpi*(S*Sin(Sita(jd))+C*Cos(Sita(jd))*Sin(tH)), N) * 180 / math.Pi
|
nlo := math.Atan2(Sin(lo)*Cos(bo)-sinpi*(S*Sin(Sita(jd))+C*Cos(Sita(jd))*Sin(tH)), N) * 180 / math.Pi
|
||||||
return nlo
|
return nlo
|
||||||
@ -110,7 +110,7 @@ func ZhanXinBo(lo, bo, lat, lon, jd, au, h float64) float64 { //jd为格林尼
|
|||||||
S := psini(lat, h)
|
S := psini(lat, h)
|
||||||
sinpi := Sin(0.0024427777777) / au
|
sinpi := Sin(0.0024427777777) / au
|
||||||
ra := LoToRa(lo, bo, jd)
|
ra := LoToRa(lo, bo, jd)
|
||||||
tH := Limit360(TD2UT(SeeStarTime(jd), false)*15 + lon - ra)
|
tH := Limit360(TD2UT(ApparentSiderealTime(jd), false)*15 + lon - ra)
|
||||||
N := Cos(lo)*Cos(bo) - C*sinpi*Cos(tH)
|
N := Cos(lo)*Cos(bo) - C*sinpi*Cos(tH)
|
||||||
nlo := math.Atan2(Sin(lo)*Cos(bo)-sinpi*(S*Sin(Sita(jd))+C*Cos(Sita(jd))*Sin(tH)), N) * 180 / math.Pi
|
nlo := math.Atan2(Sin(lo)*Cos(bo)-sinpi*(S*Sin(Sita(jd))+C*Cos(Sita(jd))*Sin(tH)), N) * 180 / math.Pi
|
||||||
nbo := math.Atan2(Cos(nlo)*(Sin(bo)-sinpi*(S*Cos(Sita(jd))-C*Sin(Sita(jd))*Sin(tH))), N) * 180 / math.Pi
|
nbo := math.Atan2(Cos(nlo)*(Sin(bo)-sinpi*(S*Cos(Sita(jd))-C*Sin(Sita(jd))*Sin(tH))), N) * 180 / math.Pi
|
||||||
|
@ -1033,7 +1033,7 @@ func MoonAway(JD float64) float64 { //'月地距离
|
|||||||
/*
|
/*
|
||||||
* @name 月球视黄经
|
* @name 月球视黄经
|
||||||
*/
|
*/
|
||||||
func MoonSeeLo(JD float64) float64 {
|
func MoonApparentLo(JD float64) float64 {
|
||||||
return MoonTrueLo(JD) + HJZD(JD)
|
return MoonTrueLo(JD) + HJZD(JD)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1041,7 +1041,7 @@ func MoonSeeLo(JD float64) float64 {
|
|||||||
* 月球真赤纬
|
* 月球真赤纬
|
||||||
*/
|
*/
|
||||||
func MoonTrueDec(JD float64) float64 {
|
func MoonTrueDec(JD float64) float64 {
|
||||||
MoonLo := MoonSeeLo(JD)
|
MoonLo := MoonApparentLo(JD)
|
||||||
MoonBo := MoonTrueBo(JD)
|
MoonBo := MoonTrueBo(JD)
|
||||||
tmp := Sin(MoonBo)*Cos(Sita(JD)) + Cos(MoonBo)*Sin(Sita(JD))*Sin(MoonLo)
|
tmp := Sin(MoonBo)*Cos(Sita(JD)) + Cos(MoonBo)*Sin(Sita(JD))*Sin(MoonLo)
|
||||||
res := ArcSin(tmp)
|
res := ArcSin(tmp)
|
||||||
@ -1052,7 +1052,7 @@ func MoonTrueDec(JD float64) float64 {
|
|||||||
* 月球真赤经
|
* 月球真赤经
|
||||||
*/
|
*/
|
||||||
func MoonTrueRa(JD float64) float64 {
|
func MoonTrueRa(JD float64) float64 {
|
||||||
MoonLo := MoonSeeLo(JD)
|
MoonLo := MoonApparentLo(JD)
|
||||||
MoonBo := MoonTrueBo(JD)
|
MoonBo := MoonTrueBo(JD)
|
||||||
tmp := (Sin(MoonLo)*Cos(Sita(JD)) - Tan(MoonBo)*Sin(Sita(JD))) / Cos(MoonLo)
|
tmp := (Sin(MoonLo)*Cos(Sita(JD)) - Tan(MoonBo)*Sin(Sita(JD))) / Cos(MoonLo)
|
||||||
tmp = ArcTan(tmp)
|
tmp = ArcTan(tmp)
|
||||||
@ -1070,7 +1070,7 @@ func MoonTrueRa(JD float64) float64 {
|
|||||||
*
|
*
|
||||||
传入世界时
|
传入世界时
|
||||||
*/
|
*/
|
||||||
func MoonSeeRa(JD, lon, lat float64, tz int) float64 {
|
func MoonApparentRa(JD, lon, lat float64, tz int) float64 {
|
||||||
jde := TD2UT(JD, true)
|
jde := TD2UT(JD, true)
|
||||||
ra := MoonTrueRa(jde - float64(tz)/24.000)
|
ra := MoonTrueRa(jde - float64(tz)/24.000)
|
||||||
dec := MoonTrueDec(jde - float64(tz)/24.000)
|
dec := MoonTrueDec(jde - float64(tz)/24.000)
|
||||||
@ -1079,7 +1079,7 @@ func MoonSeeRa(JD, lon, lat float64, tz int) float64 {
|
|||||||
return nra
|
return nra
|
||||||
}
|
}
|
||||||
|
|
||||||
func MoonSeeDec(JD, lon, lat, tz float64) float64 {
|
func MoonApparentDec(JD, lon, lat, tz float64) float64 {
|
||||||
jde := TD2UT(JD, true)
|
jde := TD2UT(JD, true)
|
||||||
ra := MoonTrueRa(jde - tz/24.0)
|
ra := MoonTrueRa(jde - tz/24.0)
|
||||||
dec := MoonTrueDec(jde - tz/24)
|
dec := MoonTrueDec(jde - tz/24)
|
||||||
@ -1090,8 +1090,8 @@ func MoonSeeDec(JD, lon, lat, tz float64) float64 {
|
|||||||
|
|
||||||
func MoonLight(JD float64) float64 {
|
func MoonLight(JD float64) float64 {
|
||||||
MoonBo := HMoonTrueBo(JD)
|
MoonBo := HMoonTrueBo(JD)
|
||||||
SunLo := HSunSeeLo(JD)
|
SunLo := HSunApparentLo(JD)
|
||||||
MoonLo := HMoonSeeLo(JD)
|
MoonLo := HMoonApparentLo(JD)
|
||||||
tmp := Cos(MoonBo) * Cos(SunLo-MoonLo)
|
tmp := Cos(MoonBo) * Cos(SunLo-MoonLo)
|
||||||
R := RDJL(JD) * 149597870.691
|
R := RDJL(JD) * 149597870.691
|
||||||
i := R * Sin(ArcCos(tmp)) / (HMoonAway(JD) - R*tmp)
|
i := R * Sin(ArcCos(tmp)) / (HMoonAway(JD) - R*tmp)
|
||||||
@ -1107,7 +1107,7 @@ func MoonLight(JD float64) float64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func SunMoonSeek(JDE float64, degree float64) float64 {
|
func SunMoonSeek(JDE float64, degree float64) float64 {
|
||||||
p := HMoonSeeLo(JDE) - (HSunSeeLo(JDE)) - degree
|
p := HMoonApparentLo(JDE) - (HSunApparentLo(JDE)) - degree
|
||||||
for p < -180 {
|
for p < -180 {
|
||||||
p += 360
|
p += 360
|
||||||
}
|
}
|
||||||
@ -1303,7 +1303,7 @@ func MoonAngle(JD, Lon, Lat, TZ float64) float64 {
|
|||||||
ndec := ZhanXinDec(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
ndec := ZhanXinDec(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
||||||
nra := ZhanXinRa(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
nra := ZhanXinRa(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
||||||
calcjd = JD - TZ/24
|
calcjd = JD - TZ/24
|
||||||
st := Limit360(SeeStarTime(calcjd)*15 + Lon)
|
st := Limit360(ApparentSiderealTime(calcjd)*15 + Lon)
|
||||||
H := Limit360(st - nra)
|
H := Limit360(st - nra)
|
||||||
tmp2 := Sin(H) / (Cos(H)*Sin(Lat) - Tan(ndec)*Cos(Lat))
|
tmp2 := Sin(H) / (Cos(H)*Sin(Lat) - Tan(ndec)*Cos(Lat))
|
||||||
Angle := ArcTan(tmp2)
|
Angle := ArcTan(tmp2)
|
||||||
@ -1333,7 +1333,7 @@ func MoonHeight(JD, Lon, Lat, TZ float64) float64 {
|
|||||||
ndec := ZhanXinDec(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
ndec := ZhanXinDec(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
||||||
nra := ZhanXinRa(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
nra := ZhanXinRa(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
||||||
calcjd = JD - TZ/24
|
calcjd = JD - TZ/24
|
||||||
st := Limit360(SeeStarTime(calcjd)*15 + Lon)
|
st := Limit360(ApparentSiderealTime(calcjd)*15 + Lon)
|
||||||
H := Limit360(st - nra)
|
H := Limit360(st - nra)
|
||||||
tmp2 := Sin(Lat)*Sin(ndec) + Cos(ndec)*Cos(Lat)*Cos(H)
|
tmp2 := Sin(Lat)*Sin(ndec) + Cos(ndec)*Cos(Lat)*Cos(H)
|
||||||
return ArcSin(tmp2)
|
return ArcSin(tmp2)
|
||||||
@ -1349,7 +1349,7 @@ func HMoonAngle(JD, Lon, Lat, TZ float64) float64 {
|
|||||||
ndec := ZhanXinDec(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
ndec := ZhanXinDec(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
||||||
nra := ZhanXinRa(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
nra := ZhanXinRa(ra, dec, Lat, Lon, JD-TZ/24, away, 0)
|
||||||
calcjd = JD - TZ/24
|
calcjd = JD - TZ/24
|
||||||
st := Limit360(SeeStarTime(calcjd)*15 + Lon)
|
st := Limit360(ApparentSiderealTime(calcjd)*15 + Lon)
|
||||||
H := Limit360(st - nra)
|
H := Limit360(st - nra)
|
||||||
tmp2 := Sin(H) / (Cos(H)*Sin(Lat) - Tan(ndec)*Cos(Lat))
|
tmp2 := Sin(H) / (Cos(H)*Sin(Lat) - Tan(ndec)*Cos(Lat))
|
||||||
Angle := ArcTan(tmp2)
|
Angle := ArcTan(tmp2)
|
||||||
@ -1376,7 +1376,7 @@ func HMoonHeight(JD, Lon, Lat, TZ float64) float64 {
|
|||||||
away := HMoonAway(calcjd) / 149597870.7
|
away := HMoonAway(calcjd) / 149597870.7
|
||||||
nra, ndec := ZhanXinRaDec(ra, dec, Lat, Lon, calcjd, away, 0)
|
nra, ndec := ZhanXinRaDec(ra, dec, Lat, Lon, calcjd, away, 0)
|
||||||
calcjd = JD - TZ/24
|
calcjd = JD - TZ/24
|
||||||
st := Limit360(SeeStarTime(calcjd)*15 + Lon)
|
st := Limit360(ApparentSiderealTime(calcjd)*15 + Lon)
|
||||||
H := Limit360(st - nra)
|
H := Limit360(st - nra)
|
||||||
tmp2 := Sin(Lat)*Sin(ndec) + Cos(ndec)*Cos(Lat)*Cos(H)
|
tmp2 := Sin(Lat)*Sin(ndec) + Cos(ndec)*Cos(Lat)*Cos(H)
|
||||||
return ArcSin(tmp2)
|
return ArcSin(tmp2)
|
||||||
@ -1402,8 +1402,8 @@ func GetMoonTZTime(JD, Lon, Lat, TZ float64) float64 { //实际中天时间{
|
|||||||
}
|
}
|
||||||
|
|
||||||
func MoonTimeAngle(JD, Lon, Lat, TZ float64) float64 {
|
func MoonTimeAngle(JD, Lon, Lat, TZ float64) float64 {
|
||||||
startime := Limit360(SeeStarTime(JD-TZ/24)*15 + Lon)
|
startime := Limit360(ApparentSiderealTime(JD-TZ/24)*15 + Lon)
|
||||||
timeangle := startime - HMoonSeeRa(JD-TZ/24, Lon, Lat, TZ)
|
timeangle := startime - HMoonApparentRa(JD-TZ/24, Lon, Lat, TZ)
|
||||||
if timeangle < 0 {
|
if timeangle < 0 {
|
||||||
timeangle += 360
|
timeangle += 360
|
||||||
}
|
}
|
||||||
@ -1458,7 +1458,7 @@ func GetMoonRiseTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 {
|
|||||||
return -2 //沉
|
return -2 //沉
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dec := MoonSeeDec(JD1, Lon, Lat, TZ)
|
dec := MoonApparentDec(JD1, Lon, Lat, TZ)
|
||||||
tmp := (Sin(An) - Sin(dec)*Sin(Lat)) / (Cos(dec) * Cos(Lat))
|
tmp := (Sin(An) - Sin(dec)*Sin(Lat)) / (Cos(dec) * Cos(Lat))
|
||||||
if math.Abs(tmp) <= 1 && Lat < 85 {
|
if math.Abs(tmp) <= 1 && Lat < 85 {
|
||||||
SJ := (180 - ArcCos(tmp)) / 15
|
SJ := (180 - ArcCos(tmp)) / 15
|
||||||
@ -1536,7 +1536,7 @@ func GetMoonDownTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 {
|
|||||||
return -1 //拱
|
return -1 //拱
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dec := MoonSeeDec(JD1, Lon, Lat, TZ)
|
dec := MoonApparentDec(JD1, Lon, Lat, TZ)
|
||||||
tmp := (Sin(An) - Sin(dec)*Sin(Lat)) / (Cos(dec) * Cos(Lat))
|
tmp := (Sin(An) - Sin(dec)*Sin(Lat)) / (Cos(dec) * Cos(Lat))
|
||||||
if math.Abs(tmp) <= 1 && Lat < 85 {
|
if math.Abs(tmp) <= 1 && Lat < 85 {
|
||||||
SJ := (ArcCos(tmp)) / 15.0
|
SJ := (ArcCos(tmp)) / 15.0
|
||||||
@ -1662,12 +1662,12 @@ func HMoonAway(JD float64) float64 { //'月地距离
|
|||||||
/*
|
/*
|
||||||
* @name 月球视黄经
|
* @name 月球视黄经
|
||||||
*/
|
*/
|
||||||
func HMoonSeeLo(JD float64) float64 {
|
func HMoonApparentLo(JD float64) float64 {
|
||||||
return HMoonTrueLo(JD) + HJZD(JD)
|
return HMoonTrueLo(JD) + HJZD(JD)
|
||||||
}
|
}
|
||||||
|
|
||||||
func HMoonTrueRaDec(JD float64) (float64, float64) {
|
func HMoonTrueRaDec(JD float64) (float64, float64) {
|
||||||
MoonLo := HMoonSeeLo(JD)
|
MoonLo := HMoonApparentLo(JD)
|
||||||
MoonBo := HMoonTrueBo(JD)
|
MoonBo := HMoonTrueBo(JD)
|
||||||
tmp := Sin(MoonBo)*Cos(Sita(JD)) + Cos(MoonBo)*Sin(Sita(JD))*Sin(MoonLo)
|
tmp := Sin(MoonBo)*Cos(Sita(JD)) + Cos(MoonBo)*Sin(Sita(JD))*Sin(MoonLo)
|
||||||
res := ArcSin(tmp)
|
res := ArcSin(tmp)
|
||||||
@ -1687,7 +1687,7 @@ func HMoonTrueRaDec(JD float64) (float64, float64) {
|
|||||||
* 月球真赤纬
|
* 月球真赤纬
|
||||||
*/
|
*/
|
||||||
func HMoonTrueDec(JD float64) float64 {
|
func HMoonTrueDec(JD float64) float64 {
|
||||||
MoonLo := HMoonSeeLo(JD)
|
MoonLo := HMoonApparentLo(JD)
|
||||||
MoonBo := HMoonTrueBo(JD)
|
MoonBo := HMoonTrueBo(JD)
|
||||||
tmp := Sin(MoonBo)*Cos(Sita(JD)) + Cos(MoonBo)*Sin(Sita(JD))*Sin(MoonLo)
|
tmp := Sin(MoonBo)*Cos(Sita(JD)) + Cos(MoonBo)*Sin(Sita(JD))*Sin(MoonLo)
|
||||||
res := ArcSin(tmp)
|
res := ArcSin(tmp)
|
||||||
@ -1698,7 +1698,7 @@ func HMoonTrueDec(JD float64) float64 {
|
|||||||
* 月球真赤经
|
* 月球真赤经
|
||||||
*/
|
*/
|
||||||
func HMoonTrueRa(JD float64) float64 {
|
func HMoonTrueRa(JD float64) float64 {
|
||||||
MoonLo := HMoonSeeLo(JD)
|
MoonLo := HMoonApparentLo(JD)
|
||||||
MoonBo := HMoonTrueBo(JD)
|
MoonBo := HMoonTrueBo(JD)
|
||||||
tmp := (Sin(MoonLo)*Cos(Sita(JD)) - Tan(MoonBo)*Sin(Sita(JD))) / Cos(MoonLo)
|
tmp := (Sin(MoonLo)*Cos(Sita(JD)) - Tan(MoonBo)*Sin(Sita(JD))) / Cos(MoonLo)
|
||||||
tmp = ArcTan(tmp)
|
tmp = ArcTan(tmp)
|
||||||
@ -1716,7 +1716,7 @@ func HMoonTrueRa(JD float64) float64 {
|
|||||||
*
|
*
|
||||||
传入世界时
|
传入世界时
|
||||||
*/
|
*/
|
||||||
func HMoonSeeRaDec(JD, lon, lat, tz float64) (float64, float64) {
|
func HMoonApparentRaDec(JD, lon, lat, tz float64) (float64, float64) {
|
||||||
jde := TD2UT(JD, true)
|
jde := TD2UT(JD, true)
|
||||||
ra := HMoonTrueRa(jde - tz/24)
|
ra := HMoonTrueRa(jde - tz/24)
|
||||||
dec := HMoonTrueDec(jde - tz/24)
|
dec := HMoonTrueDec(jde - tz/24)
|
||||||
@ -1725,7 +1725,7 @@ func HMoonSeeRaDec(JD, lon, lat, tz float64) (float64, float64) {
|
|||||||
return nra, ndec
|
return nra, ndec
|
||||||
}
|
}
|
||||||
|
|
||||||
func HMoonSeeRa(JD, lon, lat, tz float64) float64 {
|
func HMoonApparentRa(JD, lon, lat, tz float64) float64 {
|
||||||
jde := TD2UT(JD, true)
|
jde := TD2UT(JD, true)
|
||||||
ra := HMoonTrueRa(jde - tz/24)
|
ra := HMoonTrueRa(jde - tz/24)
|
||||||
dec := HMoonTrueDec(jde - tz/24)
|
dec := HMoonTrueDec(jde - tz/24)
|
||||||
@ -1733,7 +1733,7 @@ func HMoonSeeRa(JD, lon, lat, tz float64) float64 {
|
|||||||
nra := ZhanXinRa(ra, dec, lat, lon, JD-tz/24, away, 0)
|
nra := ZhanXinRa(ra, dec, lat, lon, JD-tz/24, away, 0)
|
||||||
return nra
|
return nra
|
||||||
}
|
}
|
||||||
func HMoonSeeDec(JD, lon, lat, tz float64) float64 {
|
func HMoonApparentDec(JD, lon, lat, tz float64) float64 {
|
||||||
jde := TD2UT(JD, true)
|
jde := TD2UT(JD, true)
|
||||||
ra := HMoonTrueRa(jde - tz/24)
|
ra := HMoonTrueRa(jde - tz/24)
|
||||||
dec := HMoonTrueDec(jde - tz/24)
|
dec := HMoonTrueDec(jde - tz/24)
|
||||||
|
@ -9,7 +9,7 @@ import (
|
|||||||
func Benchmark_MoonRiseBench(b *testing.B) {
|
func Benchmark_MoonRiseBench(b *testing.B) {
|
||||||
jde := GetNowJDE()
|
jde := GetNowJDE()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
GetMoonRiseTime(jde, 115, 32, 8, 0, 10)
|
GetMoonRiseTime(jde, 105, 40, 8, 0, 10)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -30,7 +30,7 @@ func Test_MoonRise(t *testing.T) {
|
|||||||
//jde := Date2JDE(time.Date(2023, 2, 9, 15, 59, 0, 0, cst))
|
//jde := Date2JDE(time.Date(2023, 2, 9, 15, 59, 0, 0, cst))
|
||||||
fmt.Println(GetMoonRiseTime(2.4599846948519214e+06, 113.58880556, 87.36833333, 8, 0, 0))
|
fmt.Println(GetMoonRiseTime(2.4599846948519214e+06, 113.58880556, 87.36833333, 8, 0, 0))
|
||||||
for i := 30.0; i < 90.0; i += 0.3 {
|
for i := 30.0; i < 90.0; i += 0.3 {
|
||||||
fmt.Println(i, GetMoonRiseTime(2.459984692085961e+06, 113.588, float64(i), 8, 0, 0))
|
fmt.Println(i, GetMoonRiseTime(2.459984692085961e+06, 117.76653567, float64(i), 8, 0, 0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ func Test_MoonS(t *testing.T) {
|
|||||||
//fmt.Println(Sita(2451547))
|
//fmt.Println(Sita(2451547))
|
||||||
//fmt.Println(MoonHeight(2451547, 115, 32, 8))
|
//fmt.Println(MoonHeight(2451547, 115, 32, 8))
|
||||||
a := time.Now().UnixNano()
|
a := time.Now().UnixNano()
|
||||||
b := GetMoonRiseTime(GetNowJDE(), 115, 32, 8, 0, 10)
|
b := GetMoonRiseTime(GetNowJDE(), 123, 40, 8, 0, 10)
|
||||||
fmt.Println(HMoonHeight(b, 115, 32, 8))
|
fmt.Println(HMoonHeight(b, 115, 32, 8))
|
||||||
fmt.Println(time.Now().UnixNano() - a)
|
fmt.Println(time.Now().UnixNano() - a)
|
||||||
fmt.Println(JDE2Date((b)))
|
fmt.Println(JDE2Date((b)))
|
||||||
|
@ -12,7 +12,7 @@ func StarHeight(jde, ra, dec, lon, lat, timezone float64) float64 {
|
|||||||
// 转换为世界时
|
// 转换为世界时
|
||||||
utcJde := jde - timezone/24.0
|
utcJde := jde - timezone/24.0
|
||||||
// 计算视恒星时
|
// 计算视恒星时
|
||||||
st := Limit360(SeeStarTime(utcJde)*15 + lon)
|
st := Limit360(ApparentSiderealTime(utcJde)*15 + lon)
|
||||||
// 计算时角
|
// 计算时角
|
||||||
H := Limit360(st - ra)
|
H := Limit360(st - ra)
|
||||||
// 高度角、时角与天球座标三角转换公式
|
// 高度角、时角与天球座标三角转换公式
|
||||||
@ -28,7 +28,7 @@ func StarAzimuth(jde, ra, dec, lon, lat, timezone float64) float64 {
|
|||||||
// 转换为世界时
|
// 转换为世界时
|
||||||
utcJde := jde - timezone/24.0
|
utcJde := jde - timezone/24.0
|
||||||
// 计算视恒星时
|
// 计算视恒星时
|
||||||
st := Limit360(SeeStarTime(utcJde)*15 + lon)
|
st := Limit360(ApparentSiderealTime(utcJde)*15 + lon)
|
||||||
// 计算时角
|
// 计算时角
|
||||||
H := Limit360(st - ra)
|
H := Limit360(st - ra)
|
||||||
// 三角转换公式
|
// 三角转换公式
|
||||||
@ -53,26 +53,26 @@ func StarHourAngle(jde, ra, lon, timezone float64) float64 {
|
|||||||
// 转换为世界时
|
// 转换为世界时
|
||||||
utcJde := jde - timezone/24.0
|
utcJde := jde - timezone/24.0
|
||||||
// 计算视恒星时
|
// 计算视恒星时
|
||||||
st := Limit360(SeeStarTime(utcJde)*15 + lon)
|
st := Limit360(ApparentSiderealTime(utcJde)*15 + lon)
|
||||||
// 计算时角
|
// 计算时角
|
||||||
return Limit360(st - ra)
|
return Limit360(st - ra)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TrueStarTime 不含章动下的恒星时
|
// MeanSiderealTime 不含章动下的恒星时
|
||||||
func TrueStarTime(JD float64) float64 {
|
func MeanSiderealTime(JD float64) float64 {
|
||||||
T := (JD - 2451545) / 36525
|
T := (JD - 2451545) / 36525
|
||||||
return (Limit360(280.46061837+360.98564736629*(JD-2451545.0)+0.000387933*T*T-T*T*T/38710000) / 15)
|
return (Limit360(280.46061837+360.98564736629*(JD-2451545.0)+0.000387933*T*T-T*T*T/38710000) / 15)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeeStarTime 视恒星时,计算章动
|
// ApparentSiderealTime 视恒星时,计算章动
|
||||||
func SeeStarTime(JD float64) float64 {
|
func ApparentSiderealTime(JD float64) float64 {
|
||||||
tmp := TrueStarTime(JD)
|
tmp := MeanSiderealTime(JD)
|
||||||
return tmp + HJZD(JD)*Cos(Sita(JD))/15
|
return tmp + HJZD(JD)*Cos(Sita(JD))/15
|
||||||
}
|
}
|
||||||
func StarAngle(RA, DEC, JD, Lon, Lat, TZ float64) float64 {
|
func StarAngle(RA, DEC, JD, Lon, Lat, TZ float64) float64 {
|
||||||
//JD=JD-8/24+TZ/24;
|
//JD=JD-8/24+TZ/24;
|
||||||
calcjd := JD - TZ/24
|
calcjd := JD - TZ/24
|
||||||
st := Limit360(SeeStarTime(calcjd)*15 + Lon)
|
st := Limit360(ApparentSiderealTime(calcjd)*15 + Lon)
|
||||||
H := Limit360(st - RA)
|
H := Limit360(st - RA)
|
||||||
tmp2 := Sin(H) / (Cos(H)*Sin(Lat) - Tan(DEC)*Cos(Lat))
|
tmp2 := Sin(H) / (Cos(H)*Sin(Lat) - Tan(DEC)*Cos(Lat))
|
||||||
Angle := ArcTan(tmp2)
|
Angle := ArcTan(tmp2)
|
||||||
|
@ -5,6 +5,7 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// this file contains bright 9100 stars
|
// this file contains bright 9100 stars
|
||||||
@ -131,7 +132,7 @@ func parseDec(star []byte) (float64, error) {
|
|||||||
}
|
}
|
||||||
minute = minute*10 + (star[i] - 48)
|
minute = minute*10 + (star[i] - 48)
|
||||||
}
|
}
|
||||||
ori := string(bytes.TrimSpace(star[79:83]))
|
ori := string(bytes.TrimSpace(star[88:90]))
|
||||||
if ori != "" {
|
if ori != "" {
|
||||||
sec, err = strconv.ParseFloat(ori, 64)
|
sec, err = strconv.ParseFloat(ori, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -9276,3 +9277,14 @@ func StarDataByHR(hr int) (StarData, error) {
|
|||||||
data, err := parseStarData(stardat[hr-1])
|
data, err := parseStarData(stardat[hr-1])
|
||||||
return StarData{starData: data}, err
|
return StarData{starData: data}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s starData) RaDecByJde(jde float64) (float64, float64) {
|
||||||
|
//计算自行
|
||||||
|
year := ((jde - 2451545.0) / 365.2422)
|
||||||
|
return ZuoBiaoSuiCha(s.Ra+(year*s.PmRA/3600), s.Dec+(year*s.PmDec/3600), 2451545.0, jde)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s StarData) RaDecByDate(date time.Time) (float64, float64) {
|
||||||
|
jde := Date2JDE(date.UTC())
|
||||||
|
return s.RaDecByJde(jde)
|
||||||
|
}
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
package basic
|
package basic
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
. "b612.me/astro/tools"
|
||||||
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -18,3 +20,18 @@ func Test_ParseStar(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetRaDecByDate(t *testing.T) {
|
||||||
|
err := LoadStarData()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
sirius, err := StarDataByHR(2491)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
fmt.Println(Format(sirius.Ra/15, 1), Format(sirius.Dec, 0))
|
||||||
|
now := GetNowJDE()
|
||||||
|
ra, dec := sirius.RaDecByJde(now)
|
||||||
|
fmt.Println(Format(ra/15, 1), Format(dec, 0))
|
||||||
|
}
|
||||||
|
98
basic/sun.go
98
basic/sun.go
@ -830,26 +830,26 @@ func SunTrueLo(JD float64) float64 { // '太阳真黄经
|
|||||||
return SunTrueLo
|
return SunTrueLo
|
||||||
}
|
}
|
||||||
|
|
||||||
func SunSeeLo(JD float64) float64 { //'太阳视黄经
|
func SunApparentLo(JD float64) float64 { //'太阳视黄经
|
||||||
|
|
||||||
T := (JD - 2451545) / 36525
|
T := (JD - 2451545) / 36525
|
||||||
SunSeeLo := SunTrueLo(JD) - 0.00569 - 0.00478*Sin(125.04-1934.136*T)
|
SunApparentLo := SunTrueLo(JD) - 0.00569 - 0.00478*Sin(125.04-1934.136*T)
|
||||||
return SunSeeLo
|
return SunApparentLo
|
||||||
}
|
}
|
||||||
|
|
||||||
func SunSeeRa(JD float64) float64 { // '太阳视赤经
|
func SunApparentRa(JD float64) float64 { // '太阳视赤经
|
||||||
T := (JD - 2451545) / 36525
|
T := (JD - 2451545) / 36525
|
||||||
sitas := Sita(JD) + 0.00256*Cos(125.04-1934.136*T)
|
sitas := Sita(JD) + 0.00256*Cos(125.04-1934.136*T)
|
||||||
SunSeeRa := ArcTan(Cos(sitas) * Sin(SunSeeLo(JD)) / Cos(SunSeeLo(JD)))
|
SunApparentRa := ArcTan(Cos(sitas) * Sin(SunApparentLo(JD)) / Cos(SunApparentLo(JD)))
|
||||||
tmp := SunSeeLo(JD)
|
tmp := SunApparentLo(JD)
|
||||||
if tmp >= 90 && tmp < 180 {
|
if tmp >= 90 && tmp < 180 {
|
||||||
SunSeeRa = 180 + SunSeeRa
|
SunApparentRa = 180 + SunApparentRa
|
||||||
} else if tmp >= 180 && tmp < 270 {
|
} else if tmp >= 180 && tmp < 270 {
|
||||||
SunSeeRa = 180 + SunSeeRa
|
SunApparentRa = 180 + SunApparentRa
|
||||||
} else if tmp >= 270 && tmp <= 360 {
|
} else if tmp >= 270 && tmp <= 360 {
|
||||||
SunSeeRa = 360 + SunSeeRa
|
SunApparentRa = 360 + SunApparentRa
|
||||||
}
|
}
|
||||||
return SunSeeRa
|
return SunApparentRa
|
||||||
}
|
}
|
||||||
|
|
||||||
func SunTrueRa(JD float64) float64 { //'太阳真赤经
|
func SunTrueRa(JD float64) float64 { //'太阳真赤经
|
||||||
@ -868,11 +868,11 @@ func SunTrueRa(JD float64) float64 { //'太阳真赤经
|
|||||||
return SunTrueRa
|
return SunTrueRa
|
||||||
}
|
}
|
||||||
|
|
||||||
func SunSeeDec(JD float64) float64 { // '太阳视赤纬
|
func SunApparentDec(JD float64) float64 { // '太阳视赤纬
|
||||||
T := (JD - 2451545) / 36525
|
T := (JD - 2451545) / 36525
|
||||||
sitas := Sita(JD) + 0.00256*Cos(125.04-1934.136*T)
|
sitas := Sita(JD) + 0.00256*Cos(125.04-1934.136*T)
|
||||||
SunSeeDec := ArcSin(Sin(sitas) * Sin(SunSeeLo(JD)))
|
SunApparentDec := ArcSin(Sin(sitas) * Sin(SunApparentLo(JD)))
|
||||||
return SunSeeDec
|
return SunApparentDec
|
||||||
}
|
}
|
||||||
|
|
||||||
func SunTrueDec(JD float64) float64 { // '太阳真赤纬
|
func SunTrueDec(JD float64) float64 { // '太阳真赤纬
|
||||||
@ -882,7 +882,7 @@ func SunTrueDec(JD float64) float64 { // '太阳真赤纬
|
|||||||
}
|
}
|
||||||
func SunTime(JD float64) float64 { //均时差
|
func SunTime(JD float64) float64 { //均时差
|
||||||
|
|
||||||
tm := (SunLo(JD) - 0.0057183 - (HSunSeeRa(JD)) + (HJZD(JD))*Cos(Sita(JD))) / 15
|
tm := (SunLo(JD) - 0.0057183 - (HSunApparentRa(JD)) + (HJZD(JD))*Cos(Sita(JD))) / 15
|
||||||
if tm > 23 {
|
if tm > 23 {
|
||||||
tm = -24 + tm
|
tm = -24 + tm
|
||||||
}
|
}
|
||||||
@ -908,7 +908,7 @@ func HSunTrueBo(JD float64) float64 {
|
|||||||
return L
|
return L
|
||||||
}
|
}
|
||||||
|
|
||||||
func HSunSeeLo(JD float64) float64 {
|
func HSunApparentLo(JD float64) float64 {
|
||||||
L := HSunTrueLo(JD)
|
L := HSunTrueLo(JD)
|
||||||
/*
|
/*
|
||||||
t := (JD - 2451545) / 365250.0
|
t := (JD - 2451545) / 365250.0
|
||||||
@ -933,36 +933,36 @@ func EarthAway(JD float64) float64 {
|
|||||||
return planet.WherePlanet(0, 2, JD)
|
return planet.WherePlanet(0, 2, JD)
|
||||||
}
|
}
|
||||||
|
|
||||||
func HSunSeeRaDec(JD float64) (float64, float64) {
|
func HSunApparentRaDec(JD float64) (float64, float64) {
|
||||||
T := (JD - 2451545) / 36525
|
T := (JD - 2451545) / 36525
|
||||||
sitas := Sita(JD) + 0.00256*Cos(125.04-1934.136*T)
|
sitas := Sita(JD) + 0.00256*Cos(125.04-1934.136*T)
|
||||||
sitas2 := EclipticObliquity(JD, false) + 0.00256*Cos(125.04-1934.136*T)
|
sitas2 := EclipticObliquity(JD, false) + 0.00256*Cos(125.04-1934.136*T)
|
||||||
tmp := HSunSeeLo(JD)
|
tmp := HSunApparentLo(JD)
|
||||||
HSunSeeRa := ArcTan(Cos(sitas) * Sin(tmp) / Cos(tmp))
|
HSunApparentRa := ArcTan(Cos(sitas) * Sin(tmp) / Cos(tmp))
|
||||||
HSunSeeDec := ArcSin(Sin(sitas2) * Sin(tmp))
|
HSunApparentDec := ArcSin(Sin(sitas2) * Sin(tmp))
|
||||||
if tmp >= 90 && tmp < 180 {
|
if tmp >= 90 && tmp < 180 {
|
||||||
HSunSeeRa = 180 + HSunSeeRa
|
HSunApparentRa = 180 + HSunApparentRa
|
||||||
} else if tmp >= 180 && tmp < 270 {
|
} else if tmp >= 180 && tmp < 270 {
|
||||||
HSunSeeRa = 180 + HSunSeeRa
|
HSunApparentRa = 180 + HSunApparentRa
|
||||||
} else if tmp >= 270 && tmp <= 360 {
|
} else if tmp >= 270 && tmp <= 360 {
|
||||||
HSunSeeRa = 360 + HSunSeeRa
|
HSunApparentRa = 360 + HSunApparentRa
|
||||||
}
|
}
|
||||||
return HSunSeeRa, HSunSeeDec
|
return HSunApparentRa, HSunApparentDec
|
||||||
}
|
}
|
||||||
|
|
||||||
func HSunSeeRa(JD float64) float64 { // '太阳视赤经
|
func HSunApparentRa(JD float64) float64 { // '太阳视赤经
|
||||||
T := (JD - 2451545) / 36525
|
T := (JD - 2451545) / 36525
|
||||||
sitas := Sita(JD) + 0.00256*Cos(125.04-1934.136*T)
|
sitas := Sita(JD) + 0.00256*Cos(125.04-1934.136*T)
|
||||||
tmp := HSunSeeLo(JD)
|
tmp := HSunApparentLo(JD)
|
||||||
HSunSeeRa := ArcTan(Cos(sitas) * Sin(tmp) / Cos(tmp))
|
HSunApparentRa := ArcTan(Cos(sitas) * Sin(tmp) / Cos(tmp))
|
||||||
if tmp >= 90 && tmp < 180 {
|
if tmp >= 90 && tmp < 180 {
|
||||||
HSunSeeRa = 180 + HSunSeeRa
|
HSunApparentRa = 180 + HSunApparentRa
|
||||||
} else if tmp >= 180 && tmp < 270 {
|
} else if tmp >= 180 && tmp < 270 {
|
||||||
HSunSeeRa = 180 + HSunSeeRa
|
HSunApparentRa = 180 + HSunApparentRa
|
||||||
} else if tmp >= 270 && tmp <= 360 {
|
} else if tmp >= 270 && tmp <= 360 {
|
||||||
HSunSeeRa = 360 + HSunSeeRa
|
HSunApparentRa = 360 + HSunApparentRa
|
||||||
}
|
}
|
||||||
return HSunSeeRa
|
return HSunApparentRa
|
||||||
}
|
}
|
||||||
|
|
||||||
func HSunTrueRa(JD float64) float64 { //'太阳真赤经
|
func HSunTrueRa(JD float64) float64 { //'太阳真赤经
|
||||||
@ -980,11 +980,11 @@ func HSunTrueRa(JD float64) float64 { //'太阳真赤经
|
|||||||
return HSunTrueRa
|
return HSunTrueRa
|
||||||
}
|
}
|
||||||
|
|
||||||
func HSunSeeDec(JD float64) float64 { // '太阳视赤纬
|
func HSunApparentDec(JD float64) float64 { // '太阳视赤纬
|
||||||
T := (JD - 2451545) / 36525
|
T := (JD - 2451545) / 36525
|
||||||
sitas := EclipticObliquity(JD, false) + 0.00256*Cos(125.04-1934.136*T)
|
sitas := EclipticObliquity(JD, false) + 0.00256*Cos(125.04-1934.136*T)
|
||||||
HSunSeeDec := ArcSin(Sin(sitas) * Sin(HSunSeeLo(JD)))
|
HSunApparentDec := ArcSin(Sin(sitas) * Sin(HSunApparentLo(JD)))
|
||||||
return HSunSeeDec
|
return HSunApparentDec
|
||||||
}
|
}
|
||||||
|
|
||||||
func HSunTrueDec(JD float64) float64 { // '太阳真赤纬
|
func HSunTrueDec(JD float64) float64 { // '太阳真赤纬
|
||||||
@ -1089,7 +1089,7 @@ func GetJQTime(Year, Angle int) float64 { //节气时间
|
|||||||
}
|
}
|
||||||
|
|
||||||
func JQLospec(JD float64) float64 {
|
func JQLospec(JD float64) float64 {
|
||||||
t := HSunSeeLo(JD)
|
t := HSunApparentLo(JD)
|
||||||
if t <= 12 {
|
if t <= 12 {
|
||||||
t += 360
|
t += 360
|
||||||
}
|
}
|
||||||
@ -1097,7 +1097,7 @@ func JQLospec(JD float64) float64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetXC(jd float64) string { //十二次
|
func GetXC(jd float64) string { //十二次
|
||||||
tlo := HSunSeeLo(jd)
|
tlo := HSunApparentLo(jd)
|
||||||
if tlo >= 255 && tlo < 285 {
|
if tlo >= 255 && tlo < 285 {
|
||||||
return "星纪"
|
return "星纪"
|
||||||
} else if tlo >= 285 && tlo < 315 {
|
} else if tlo >= 285 && tlo < 315 {
|
||||||
@ -1185,7 +1185,7 @@ func GetBanTime(JD, Lon, Lat, TZ, An float64) float64 {
|
|||||||
if SunHeight(tztime+0.5, Lon, Lat, ntz) > An {
|
if SunHeight(tztime+0.5, Lon, Lat, ntz) > An {
|
||||||
return -1 //极昼
|
return -1 //极昼
|
||||||
}
|
}
|
||||||
tmp := (Sin(An) - Sin(HSunSeeDec(tztime))*Sin(Lat)) / (Cos(HSunSeeDec(tztime)) * Cos(Lat))
|
tmp := (Sin(An) - Sin(HSunApparentDec(tztime))*Sin(Lat)) / (Cos(HSunApparentDec(tztime)) * Cos(Lat))
|
||||||
var sundown float64
|
var sundown float64
|
||||||
if math.Abs(tmp) <= 1 && Lat < 85 {
|
if math.Abs(tmp) <= 1 && Lat < 85 {
|
||||||
rzsc := ArcCos(tmp) / 15
|
rzsc := ArcCos(tmp) / 15
|
||||||
@ -1224,7 +1224,7 @@ func GetAsaTime(JD, Lon, Lat, TZ, An float64) float64 {
|
|||||||
if SunHeight(tztime-0.5, Lon, Lat, ntz) > An {
|
if SunHeight(tztime-0.5, Lon, Lat, ntz) > An {
|
||||||
return -1 //极昼
|
return -1 //极昼
|
||||||
}
|
}
|
||||||
tmp := (Sin(An) - Sin(HSunSeeDec(tztime))*Sin(Lat)) / (Cos(HSunSeeDec(tztime)) * Cos(Lat))
|
tmp := (Sin(An) - Sin(HSunApparentDec(tztime))*Sin(Lat)) / (Cos(HSunApparentDec(tztime)) * Cos(Lat))
|
||||||
var sunrise float64
|
var sunrise float64
|
||||||
if math.Abs(tmp) <= 1 && Lat < 85 {
|
if math.Abs(tmp) <= 1 && Lat < 85 {
|
||||||
rzsc := ArcCos(tmp) / 15
|
rzsc := ArcCos(tmp) / 15
|
||||||
@ -1257,8 +1257,8 @@ func GetAsaTime(JD, Lon, Lat, TZ, An float64) float64 {
|
|||||||
* 太阳时角
|
* 太阳时角
|
||||||
*/
|
*/
|
||||||
func SunTimeAngle(JD, Lon, Lat, TZ float64) float64 {
|
func SunTimeAngle(JD, Lon, Lat, TZ float64) float64 {
|
||||||
startime := Limit360(SeeStarTime(JD-TZ/24)*15 + Lon)
|
startime := Limit360(ApparentSiderealTime(JD-TZ/24)*15 + Lon)
|
||||||
timeangle := startime - HSunSeeRa(TD2UT(JD-TZ/24, true))
|
timeangle := startime - HSunApparentRa(TD2UT(JD-TZ/24, true))
|
||||||
if timeangle < 0 {
|
if timeangle < 0 {
|
||||||
timeangle += 360
|
timeangle += 360
|
||||||
}
|
}
|
||||||
@ -1284,7 +1284,7 @@ func GetSunRiseTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 {
|
|||||||
return -1 //极昼
|
return -1 //极昼
|
||||||
}
|
}
|
||||||
//(sin(ho)-sin(φ)*sin(δ2))/(cos(φ)*cos(δ2))
|
//(sin(ho)-sin(φ)*sin(δ2))/(cos(φ)*cos(δ2))
|
||||||
tmp := (Sin(An) - Sin(HSunSeeDec(tztime))*Sin(Lat)) / (Cos(HSunSeeDec(tztime)) * Cos(Lat))
|
tmp := (Sin(An) - Sin(HSunApparentDec(tztime))*Sin(Lat)) / (Cos(HSunApparentDec(tztime)) * Cos(Lat))
|
||||||
var sunrise float64
|
var sunrise float64
|
||||||
if math.Abs(tmp) <= 1 && Lat < 85 {
|
if math.Abs(tmp) <= 1 && Lat < 85 {
|
||||||
rzsc := ArcCos(tmp) / 15
|
rzsc := ArcCos(tmp) / 15
|
||||||
@ -1328,7 +1328,7 @@ func GetSunDownTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 {
|
|||||||
if SunHeight(tztime+0.5, Lon, Lat, ntz) > An {
|
if SunHeight(tztime+0.5, Lon, Lat, ntz) > An {
|
||||||
return -1 //极昼
|
return -1 //极昼
|
||||||
}
|
}
|
||||||
tmp := (Sin(An) - Sin(HSunSeeDec(tztime))*Sin(Lat)) / (Cos(HSunSeeDec(tztime)) * Cos(Lat))
|
tmp := (Sin(An) - Sin(HSunApparentDec(tztime))*Sin(Lat)) / (Cos(HSunApparentDec(tztime)) * Cos(Lat))
|
||||||
var sundown float64
|
var sundown float64
|
||||||
if math.Abs(tmp) <= 1 && Lat < 85 {
|
if math.Abs(tmp) <= 1 && Lat < 85 {
|
||||||
rzsc := ArcCos(tmp) / 15
|
rzsc := ArcCos(tmp) / 15
|
||||||
@ -1365,8 +1365,8 @@ func SunHeight(JD, Lon, Lat, TZ float64) float64 {
|
|||||||
//truejd := JD - tmp/24
|
//truejd := JD - tmp/24
|
||||||
calcjd := JD - TZ/24.0
|
calcjd := JD - TZ/24.0
|
||||||
tjde := TD2UT(calcjd, true)
|
tjde := TD2UT(calcjd, true)
|
||||||
st := Limit360(SeeStarTime(calcjd)*15 + Lon)
|
st := Limit360(ApparentSiderealTime(calcjd)*15 + Lon)
|
||||||
ra, dec := HSunSeeRaDec(tjde)
|
ra, dec := HSunApparentRaDec(tjde)
|
||||||
H := Limit360(st - ra)
|
H := Limit360(st - ra)
|
||||||
tmp2 := Sin(Lat)*Sin(dec) + Cos(dec)*Cos(Lat)*Cos(H)
|
tmp2 := Sin(Lat)*Sin(dec) + Cos(dec)*Cos(Lat)*Cos(H)
|
||||||
return ArcSin(tmp2)
|
return ArcSin(tmp2)
|
||||||
@ -1375,9 +1375,9 @@ func LowSunHeight(JD, Lon, Lat, TZ float64) float64 {
|
|||||||
//tmp := (TZ*15 - Lon) * 4 / 60
|
//tmp := (TZ*15 - Lon) * 4 / 60
|
||||||
//truejd := JD - tmp/24
|
//truejd := JD - tmp/24
|
||||||
calcjd := JD - TZ/24
|
calcjd := JD - TZ/24
|
||||||
st := Limit360(SeeStarTime(calcjd)*15 + Lon)
|
st := Limit360(ApparentSiderealTime(calcjd)*15 + Lon)
|
||||||
H := Limit360(st - SunSeeRa(TD2UT(calcjd, true)))
|
H := Limit360(st - SunApparentRa(TD2UT(calcjd, true)))
|
||||||
dec := SunSeeDec(TD2UT(calcjd, true))
|
dec := SunApparentDec(TD2UT(calcjd, true))
|
||||||
tmp2 := Sin(Lat)*Sin(dec) + Cos(dec)*Cos(Lat)*Cos(H)
|
tmp2 := Sin(Lat)*Sin(dec) + Cos(dec)*Cos(Lat)*Cos(H)
|
||||||
return ArcSin(tmp2)
|
return ArcSin(tmp2)
|
||||||
}
|
}
|
||||||
@ -1385,9 +1385,9 @@ func SunAngle(JD, Lon, Lat, TZ float64) float64 {
|
|||||||
//tmp := (TZ*15 - Lon) * 4 / 60
|
//tmp := (TZ*15 - Lon) * 4 / 60
|
||||||
//truejd := JD - tmp/24
|
//truejd := JD - tmp/24
|
||||||
calcjd := JD - TZ/24
|
calcjd := JD - TZ/24
|
||||||
st := Limit360(SeeStarTime(calcjd)*15 + Lon)
|
st := Limit360(ApparentSiderealTime(calcjd)*15 + Lon)
|
||||||
H := Limit360(st - HSunSeeRa(TD2UT(calcjd, true)))
|
H := Limit360(st - HSunApparentRa(TD2UT(calcjd, true)))
|
||||||
tmp2 := Sin(H) / (Cos(H)*Sin(Lat) - Tan(HSunSeeDec(TD2UT(calcjd, true)))*Cos(Lat))
|
tmp2 := Sin(H) / (Cos(H)*Sin(Lat) - Tan(HSunApparentDec(TD2UT(calcjd, true)))*Cos(Lat))
|
||||||
Angle := ArcTan(tmp2)
|
Angle := ArcTan(tmp2)
|
||||||
if Angle < 0 {
|
if Angle < 0 {
|
||||||
if H/15 < 12 {
|
if H/15 < 12 {
|
||||||
|
@ -14,12 +14,12 @@ func Test_Jq(t *testing.T) {
|
|||||||
//fmt.Println(JDE2Date(GetWHTime(2019, 10)))
|
//fmt.Println(JDE2Date(GetWHTime(2019, 10)))
|
||||||
//fmt.Println(JDE2Date(GetJQTime(2020, 0)))
|
//fmt.Println(JDE2Date(GetJQTime(2020, 0)))
|
||||||
//date := TD2UT(GetJQTime(2020, 0), true)
|
//date := TD2UT(GetJQTime(2020, 0), true)
|
||||||
//fmt.Println(HSunSeeLo(date))
|
//fmt.Println(HSunApparentLo(date))
|
||||||
}
|
}
|
||||||
|
|
||||||
func Test_SunLo(t *testing.T) {
|
func Test_SunLo(t *testing.T) {
|
||||||
fmt.Printf("%.14f\n", HSunTrueLo(2458840.0134162))
|
fmt.Printf("%.14f\n", HSunTrueLo(2458840.0134162))
|
||||||
fmt.Printf("%.14f", HSunSeeLo(2458840.0134162))
|
fmt.Printf("%.14f", HSunApparentLo(2458840.0134162))
|
||||||
}
|
}
|
||||||
|
|
||||||
func Benchmark_SunRise(b *testing.B) {
|
func Benchmark_SunRise(b *testing.B) {
|
||||||
@ -35,7 +35,7 @@ func Benchmark_SunLo(b *testing.B) {
|
|||||||
jde := GetNowJDE()
|
jde := GetNowJDE()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
//GetNowJDE()
|
//GetNowJDE()
|
||||||
HSunSeeLo(jde)
|
HSunApparentLo(jde)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -51,16 +51,16 @@ func Test_Cal(t *testing.T) {
|
|||||||
|
|
||||||
func Test_SunRise(t *testing.T) {
|
func Test_SunRise(t *testing.T) {
|
||||||
a := time.Now().UnixNano()
|
a := time.Now().UnixNano()
|
||||||
//b := GetSunRiseTime(GetNowJDE(), 115, 32, 8, 0)
|
//b := GetSunRiseTime(GetNowJDE(), 120, 32, 8, 0)
|
||||||
//b = GetSunRiseTime(GetNowJDE()+1, 115, 32, 8, 0)
|
//b = GetSunRiseTime(GetNowJDE()+1, 145, 32, 8, 0)
|
||||||
//b = GetSunRiseTime(GetNowJDE()+2, 115, 32, 8, 0)
|
//b = GetSunRiseTime(GetNowJDE()+2, 135, 50, 8, 0)
|
||||||
//b = GetSunRiseTime(GetNowJDE()+3, 115, 32, 8, 0)
|
//b = GetSunRiseTime(GetNowJDE()+3, 125, 32, 8, 0)
|
||||||
//b = GetSunRiseTime(GetNowJDE()+4, 115, 32, 8, 0)
|
//b = GetSunRiseTime(GetNowJDE()+4, 75, 32, 8, 0)
|
||||||
//b = GetSunRiseTime(GetNowJDE()+5, 115, 32, 8, 0)
|
//b = GetSunRiseTime(GetNowJDE()+5, 85, 32, 8, 0)
|
||||||
//b = GetSunRiseTime(GetNowJDE()+6, 115, 32, 8, 0)
|
//b = GetSunRiseTime(GetNowJDE()+6, 95, 32, 8, 0)
|
||||||
//b = GetSunRiseTime(GetNowJDE()+7, 115, 32, 8, 0)
|
//b = GetSunRiseTime(GetNowJDE()+7, 105, 32, 8, 0)
|
||||||
//b = GetSunRiseTime(GetNowJDE()+8, 115, 32, 8, 0)
|
//b = GetSunRiseTime(GetNowJDE()+8, 115, 32, 8, 0)
|
||||||
b := GetSunRiseTime(GetNowJDE()+9, 115, 32, 8, 0, 10)
|
b := GetSunRiseTime(GetNowJDE()+9, 125, 32, 8, 0, 10)
|
||||||
fmt.Println(time.Now().UnixNano() - a)
|
fmt.Println(time.Now().UnixNano() - a)
|
||||||
fmt.Println(SunHeight(b, 115, 32, 8))
|
fmt.Println(SunHeight(b, 115, 32, 8))
|
||||||
fmt.Println(JDE2Date((b)))
|
fmt.Println(JDE2Date((b)))
|
||||||
@ -73,7 +73,7 @@ func Test_SunTwilightMo(t *testing.T) {
|
|||||||
fmt.Println(GetAsaTime(jde, 113.58880556, 87.66833333, 8, -6))
|
fmt.Println(GetAsaTime(jde, 113.58880556, 87.66833333, 8, -6))
|
||||||
|
|
||||||
for i := 10.0; i < 90.0; i += 0.3 {
|
for i := 10.0; i < 90.0; i += 0.3 {
|
||||||
fmt.Println(i, GetAsaTime(jde, 113.5880556, float64(i), 8, -6))
|
fmt.Println(i, GetAsaTime(jde, 125.45506654, float64(i), 8, -6))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
52
moon/moon.go
52
moon/moon.go
@ -26,44 +26,68 @@ func TrueBo(date time.Time) float64 {
|
|||||||
return basic.HMoonTrueBo(basic.TD2UT(jde, true))
|
return basic.HMoonTrueBo(basic.TD2UT(jde, true))
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeeLo 月亮视黄经(地心)
|
// ApparentLo 月亮视黄经(地心)
|
||||||
// 传入UTC对应的儒略日时间
|
// 传入UTC对应的儒略日时间
|
||||||
func SeeLo(date time.Time) float64 {
|
func ApparentLo(date time.Time) float64 {
|
||||||
jde := basic.Date2JDE(date.UTC())
|
jde := basic.Date2JDE(date.UTC())
|
||||||
return basic.HMoonSeeLo(basic.TD2UT(jde, true))
|
return basic.HMoonApparentLo(basic.TD2UT(jde, true))
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeeRa 月亮视赤经(站心)
|
// TrueRa 月亮视赤经(地心)
|
||||||
|
// date, 时间
|
||||||
|
// 返回地心坐标
|
||||||
|
func TrueRa(date time.Time) float64 {
|
||||||
|
jde := basic.Date2JDE(date.UTC())
|
||||||
|
return basic.HMoonTrueRa(basic.TD2UT(jde, true))
|
||||||
|
}
|
||||||
|
|
||||||
|
// TrueDec 月亮视赤纬(地心)
|
||||||
|
// date, 时间
|
||||||
|
// 返回地心坐标
|
||||||
|
func TrueDec(date time.Time) float64 {
|
||||||
|
jde := basic.Date2JDE(date.UTC())
|
||||||
|
return basic.HMoonTrueDec(basic.TD2UT(jde, true))
|
||||||
|
}
|
||||||
|
|
||||||
|
// TrueRaDec 月亮视赤纬赤纬(地心)
|
||||||
|
// date, 时间
|
||||||
|
// 返回地心坐标
|
||||||
|
func TrueRaDec(date time.Time) (float64, float64) {
|
||||||
|
jde := basic.Date2JDE(date.UTC())
|
||||||
|
return basic.HMoonTrueRaDec(basic.TD2UT(jde, true))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ApparentRa 月亮视赤经(站心)
|
||||||
// date, 时间
|
// date, 时间
|
||||||
// lon, 经度
|
// lon, 经度
|
||||||
// lat, 纬度
|
// lat, 纬度
|
||||||
// 返回站心坐标
|
// 返回站心坐标
|
||||||
func SeeRa(date time.Time, lon, lat float64) float64 {
|
func ApparentRa(date time.Time, lon, lat float64) float64 {
|
||||||
jde := basic.Date2JDE(date)
|
jde := basic.Date2JDE(date)
|
||||||
_, loc := date.Zone()
|
_, loc := date.Zone()
|
||||||
return basic.HMoonSeeRa(jde, lon, lat, float64(loc)/3600.0)
|
return basic.HMoonApparentRa(jde, lon, lat, float64(loc)/3600.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeeDec 月亮视赤纬(站心)
|
// ApparentDec 月亮视赤纬(站心)
|
||||||
// date, 时间
|
// date, 时间
|
||||||
// lon, 经度
|
// lon, 经度
|
||||||
// lat, 纬度
|
// lat, 纬度
|
||||||
// 返回站心坐标
|
// 返回站心坐标
|
||||||
func SeeDec(date time.Time, lon, lat float64) float64 {
|
func ApparentDec(date time.Time, lon, lat float64) float64 {
|
||||||
jde := basic.Date2JDE(date)
|
jde := basic.Date2JDE(date)
|
||||||
_, loc := date.Zone()
|
_, loc := date.Zone()
|
||||||
return basic.HMoonSeeDec(jde, lon, lat, float64(loc)/3600.0)
|
return basic.HMoonApparentDec(jde, lon, lat, float64(loc)/3600.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeeRaDec 月亮视赤纬(站心)
|
// ApparentRaDec 月亮视赤纬(站心)
|
||||||
// date, 本地时间
|
// date, 本地时间
|
||||||
// lon, 经度
|
// lon, 经度
|
||||||
// lat, 纬度
|
// lat, 纬度
|
||||||
// 返回站心坐标
|
// 返回站心坐标
|
||||||
func SeeRaDec(date time.Time, lon, lat float64) (float64, float64) {
|
func ApparentRaDec(date time.Time, lon, lat float64) (float64, float64) {
|
||||||
jde := basic.Date2JDE(date)
|
jde := basic.Date2JDE(date)
|
||||||
_, loc := date.Zone()
|
_, loc := date.Zone()
|
||||||
return basic.HMoonSeeRaDec(jde, lon, lat, float64(loc)/3600.0)
|
return basic.HMoonApparentRaDec(jde, lon, lat, float64(loc)/3600.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// HourAngle 月亮时角
|
// HourAngle 月亮时角
|
||||||
@ -214,7 +238,7 @@ func nextMoonPhase(date time.Time, typed int) time.Time {
|
|||||||
diffCode = 270
|
diffCode = 270
|
||||||
}
|
}
|
||||||
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
|
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
|
||||||
cost := basic.HMoonSeeLo(jde) - basic.HSunSeeLo(jde) - float64(diffCode)
|
cost := basic.HMoonApparentLo(jde) - basic.HSunApparentLo(jde) - float64(diffCode)
|
||||||
for cost < 0 {
|
for cost < 0 {
|
||||||
cost += 360
|
cost += 360
|
||||||
}
|
}
|
||||||
@ -242,7 +266,7 @@ func lastMoonPhase(date time.Time, typed int) time.Time {
|
|||||||
diffCode = 270
|
diffCode = 270
|
||||||
}
|
}
|
||||||
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
|
jde := basic.TD2UT(basic.Date2JDE(date.UTC()), true)
|
||||||
cost := basic.HMoonSeeLo(jde) - basic.HSunSeeLo(jde) - float64(diffCode)
|
cost := basic.HMoonApparentLo(jde) - basic.HSunApparentLo(jde) - float64(diffCode)
|
||||||
for cost < 0 {
|
for cost < 0 {
|
||||||
cost += 360
|
cost += 360
|
||||||
}
|
}
|
||||||
|
@ -52,3 +52,10 @@ func Test_MoonPhaseDate(t *testing.T) {
|
|||||||
fmt.Println("上一朔月", moonPhase01)
|
fmt.Println("上一朔月", moonPhase01)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMoon(t *testing.T) {
|
||||||
|
now := time.Now()
|
||||||
|
fmt.Println(RiseTime(now, 115, 40, 0, true))
|
||||||
|
fmt.Println(CulminationTime(now, 115, 40))
|
||||||
|
fmt.Println(DownTime(now, 115, 40, 0, true))
|
||||||
|
}
|
||||||
|
119
star/star.go
119
star/star.go
@ -1,14 +1,133 @@
|
|||||||
package star
|
package star
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"math"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"b612.me/astro/basic"
|
"b612.me/astro/basic"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
ERR_STAR_NEVER_RISE = errors.New("ERROR:极夜,星星在今日永远在地平线下!")
|
||||||
|
ERR_STAR_NEVER_DOWN = errors.New("ERROR:极昼,星星在今日永远在地平线上!")
|
||||||
|
)
|
||||||
|
|
||||||
// Constellation
|
// Constellation
|
||||||
// 计算date对应UTC世界时给定Date坐标赤经、赤纬所在的星座
|
// 计算date对应UTC世界时给定Date坐标赤经、赤纬所在的星座
|
||||||
func Constellation(ra, dec float64, date time.Time) string {
|
func Constellation(ra, dec float64, date time.Time) string {
|
||||||
jde := basic.Date2JDE(date.UTC())
|
jde := basic.Date2JDE(date.UTC())
|
||||||
return basic.WhichCst(ra, dec, jde)
|
return basic.WhichCst(ra, dec, jde)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//MeanSiderealTime UTC 平恒星时
|
||||||
|
func MeanSiderealTime(date time.Time) float64 {
|
||||||
|
return basic.MeanSiderealTime(basic.Date2JDE(date.UTC()))
|
||||||
|
}
|
||||||
|
|
||||||
|
// ApparentSiderealTime UTC真恒星时
|
||||||
|
func ApparentSiderealTime(date time.Time) float64 {
|
||||||
|
return basic.ApparentSiderealTime(basic.Date2JDE(date.UTC()))
|
||||||
|
}
|
||||||
|
|
||||||
|
// RiseTime 星星升起时间
|
||||||
|
// date, 世界时(忽略此处时区)
|
||||||
|
// ra,Date瞬时赤经
|
||||||
|
// dec,Date瞬时赤纬
|
||||||
|
// 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 {
|
||||||
|
date = date.Add(time.Hour * -12)
|
||||||
|
}
|
||||||
|
jde := basic.Date2JDE(date)
|
||||||
|
_, loc := date.Zone()
|
||||||
|
timezone := float64(loc) / 3600.0
|
||||||
|
riseJde := basic.StarRiseTime(jde, ra, dec, lon, lat, height, timezone, aero)
|
||||||
|
if riseJde == -2 {
|
||||||
|
err = ERR_STAR_NEVER_RISE
|
||||||
|
}
|
||||||
|
if riseJde == -1 {
|
||||||
|
err = ERR_STAR_NEVER_DOWN
|
||||||
|
}
|
||||||
|
return basic.JDE2DateByZone(riseJde, date.Location(), true), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// DownTime 星星升起时间
|
||||||
|
// date, 世界时(忽略此处时区)
|
||||||
|
// ra,Date瞬时赤经
|
||||||
|
// dec,Date瞬时赤纬
|
||||||
|
// 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 {
|
||||||
|
date = date.Add(time.Hour * -12)
|
||||||
|
}
|
||||||
|
jde := basic.Date2JDE(date)
|
||||||
|
_, loc := date.Zone()
|
||||||
|
timezone := float64(loc) / 3600.0
|
||||||
|
riseJde := basic.StarDownTime(jde, ra, dec, lon, lat, height, timezone, aero)
|
||||||
|
if riseJde == -2 {
|
||||||
|
err = ERR_STAR_NEVER_RISE
|
||||||
|
}
|
||||||
|
if riseJde == -1 {
|
||||||
|
err = ERR_STAR_NEVER_DOWN
|
||||||
|
}
|
||||||
|
return basic.JDE2DateByZone(riseJde, date.Location(), true), err
|
||||||
|
}
|
||||||
|
|
||||||
|
// HourAngle 恒星时角
|
||||||
|
// 返回给定Date赤经、经度、对应date时区date时刻的太阳时角(
|
||||||
|
func HourAngle(date time.Time, ra, lon float64) float64 {
|
||||||
|
jde := basic.Date2JDE(date)
|
||||||
|
_, loc := date.Zone()
|
||||||
|
timezone := float64(loc) / 3600.0
|
||||||
|
return basic.StarHourAngle(jde, ra, lon, timezone)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Azimuth 恒星方位角
|
||||||
|
// 返回给定Date赤经赤纬、经纬度、对应date时区date时刻的恒星方位角(正北为0,向东增加)
|
||||||
|
func Azimuth(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)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Zenith 恒星高度角
|
||||||
|
// 返回给定赤经赤纬、经纬度、对应date时区date时刻的太阳高度角
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CulminationTime 恒星中天时间
|
||||||
|
// 返回给定赤经赤纬、经纬度、对应date时区date时刻的太阳中天日期
|
||||||
|
func CulminationTime(date time.Time, ra, lon float64) time.Time {
|
||||||
|
jde := basic.Date2JDE(date)
|
||||||
|
if jde-math.Floor(jde) < 0.5 {
|
||||||
|
jde--
|
||||||
|
}
|
||||||
|
_, loc := date.Zone()
|
||||||
|
timezone := float64(loc) / 3600.0
|
||||||
|
calcJde := basic.StarCulminationTime(jde, ra, lon, timezone) - timezone/24.00
|
||||||
|
return basic.JDE2DateByZone(calcJde, date.Location(), false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitStarDatabase 初始化恒星数据库
|
||||||
|
func InitStarDatabase() error {
|
||||||
|
return basic.LoadStarData()
|
||||||
|
}
|
||||||
|
|
||||||
|
//通过恒星HR编号获取恒星参数
|
||||||
|
func GetStarDataByHR(hr int) (basic.StarData, error) {
|
||||||
|
return basic.StarDataByHR(hr)
|
||||||
|
}
|
||||||
|
26
star/star_test.go
Normal file
26
star/star_test.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package star
|
||||||
|
|
||||||
|
import (
|
||||||
|
"b612.me/astro/tools"
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestStar(t *testing.T) {
|
||||||
|
err := InitStarDatabase()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
sirius, err := GetStarDataByHR(2491)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
fmt.Printf("%+v\n", sirius)
|
||||||
|
now := time.Now()
|
||||||
|
ra, dec := sirius.RaDecByDate(now)
|
||||||
|
fmt.Println(tools.Format(ra/15, 1), tools.Format(dec, 0))
|
||||||
|
fmt.Println(RiseTime(now, ra, dec, 115, 40, 0, true))
|
||||||
|
fmt.Println(CulminationTime(now, ra, 115))
|
||||||
|
fmt.Println(DownTime(now, ra, dec, 115, 40, 0, true))
|
||||||
|
}
|
24
sun/sun.go
24
sun/sun.go
@ -179,36 +179,36 @@ func TrueBo(date time.Time) float64 {
|
|||||||
return basic.HSunTrueLo(basic.TD2UT(jde, true))
|
return basic.HSunTrueLo(basic.TD2UT(jde, true))
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeeLo 太阳视黄经
|
// ApparentLo 太阳视黄经
|
||||||
// 返回date对应UTC世界时的太阳视黄经
|
// 返回date对应UTC世界时的太阳视黄经
|
||||||
func SeeLo(date time.Time) float64 {
|
func ApparentLo(date time.Time) float64 {
|
||||||
//转换为UTC时间
|
//转换为UTC时间
|
||||||
jde := basic.Date2JDE(date.UTC())
|
jde := basic.Date2JDE(date.UTC())
|
||||||
return basic.HSunSeeLo(basic.TD2UT(jde, true))
|
return basic.HSunApparentLo(basic.TD2UT(jde, true))
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeeRa 太阳地心视赤经
|
// ApparentRa 太阳地心视赤经
|
||||||
// 返回date对应UTC世界时的太阳视赤经(使用黄道坐标转换,且默认忽略黄纬)
|
// 返回date对应UTC世界时的太阳视赤经(使用黄道坐标转换,且默认忽略黄纬)
|
||||||
func SeeRa(date time.Time) float64 {
|
func ApparentRa(date time.Time) float64 {
|
||||||
//转换为UTC时间
|
//转换为UTC时间
|
||||||
jde := basic.Date2JDE(date.UTC())
|
jde := basic.Date2JDE(date.UTC())
|
||||||
return basic.HSunSeeRa(basic.TD2UT(jde, true))
|
return basic.HSunApparentRa(basic.TD2UT(jde, true))
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeeDec 太阳地心视赤纬
|
// ApparentDec 太阳地心视赤纬
|
||||||
// 返回date对应UTC世界时的太阳视赤纬(使用黄道坐标转换,且默认忽略黄纬)
|
// 返回date对应UTC世界时的太阳视赤纬(使用黄道坐标转换,且默认忽略黄纬)
|
||||||
func SeeDec(date time.Time) float64 {
|
func ApparentDec(date time.Time) float64 {
|
||||||
//转换为UTC时间
|
//转换为UTC时间
|
||||||
jde := basic.Date2JDE(date.UTC())
|
jde := basic.Date2JDE(date.UTC())
|
||||||
return basic.HSunSeeDec(basic.TD2UT(jde, true))
|
return basic.HSunApparentDec(basic.TD2UT(jde, true))
|
||||||
}
|
}
|
||||||
|
|
||||||
// SeeRaDec 太阳地心视赤经和赤纬
|
// ApparentRaDec 太阳地心视赤经和赤纬
|
||||||
// 返回date对应UTC世界时的太阳视赤纬(使用黄道坐标转换,且默认忽略黄纬)
|
// 返回date对应UTC世界时的太阳视赤纬(使用黄道坐标转换,且默认忽略黄纬)
|
||||||
func SeeRaDec(date time.Time) (float64, float64) {
|
func ApparentRaDec(date time.Time) (float64, float64) {
|
||||||
//转换为UTC时间
|
//转换为UTC时间
|
||||||
jde := basic.Date2JDE(date.UTC())
|
jde := basic.Date2JDE(date.UTC())
|
||||||
return basic.HSunSeeRaDec(basic.TD2UT(jde, true))
|
return basic.HSunApparentRaDec(basic.TD2UT(jde, true))
|
||||||
}
|
}
|
||||||
|
|
||||||
// MidFunc 太阳中间方程
|
// MidFunc 太阳中间方程
|
||||||
|
14
sun/sun_test.go
Normal file
14
sun/sun_test.go
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package sun
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestSun(t *testing.T) {
|
||||||
|
now := time.Now()
|
||||||
|
fmt.Println(RiseTime(now, 115, 40, 0, true))
|
||||||
|
fmt.Println(CulminationTime(now, 115))
|
||||||
|
fmt.Println(DownTime(now, 115, 40, 0, true))
|
||||||
|
}
|
24
tools/format.go
Normal file
24
tools/format.go
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package tools
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Format(val float64, typed uint8) string {
|
||||||
|
belowZero := false
|
||||||
|
if val < 0 {
|
||||||
|
belowZero = true
|
||||||
|
val = -val
|
||||||
|
}
|
||||||
|
degree := math.Floor(val)
|
||||||
|
min := math.Floor((val - degree) * 60)
|
||||||
|
sec := (val - degree - min/60) * 3600
|
||||||
|
if belowZero {
|
||||||
|
degree = -degree
|
||||||
|
}
|
||||||
|
if typed == 0 {
|
||||||
|
return fmt.Sprintf("%.0f°%.0f′%.2f″", degree, min, sec)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%.0fh%.0fm%.2fs", degree, min, sec)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user