improve rise/down calc

This commit is contained in:
2022-05-10 22:24:10 +08:00
parent c5f34d3ab8
commit 7604fabf8f
8 changed files with 276 additions and 82 deletions
+44 -10
View File
@@ -1443,19 +1443,36 @@ func GetMoonRiseTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 {
if math.Abs(now-180) > 0.5 {
JD1 += (180 - now) * 4.0 / 60.0 / 24.0
}
hei := MoonHeight(JD1, Lon, Lat, TZ)
hei := HMoonHeight(JD1, Lon, Lat, TZ)
if !(hei < -10 && math.Abs(Lat) < 60) {
if hei > An {
return -1 //拱
}
if MoonHeight(JD1+12/24+6/15/24, Lon, Lat, TZ) < An {
reJde := JD1 + 12.0/24.0 + 6.0/15.0/24.0
mag := MoonTimeAngle(reJde, Lon, Lat, TZ)
if mag < 90 {
mag += 360
}
reJde += (360 - mag) * 4.0 / 60.0 / 24.0
if HMoonHeight(reJde, Lon, Lat, TZ) < An {
return -2 //沉
}
}
dec := MoonSeeDec(JD1, Lon, Lat, TZ)
SJ := (180 - ArcCos(-Tan(Lat)*Tan(dec))) / 15
JD1 += SJ/24.00 + SJ/33.00/15.00
tmp := (Sin(An) - Sin(dec)*Sin(Lat)) / (Cos(dec) * Cos(Lat))
if math.Abs(tmp) <= 1 && Lat < 85 {
SJ := (180 - ArcCos(tmp)) / 15
JD1 += SJ/24.00 + SJ/33.00/15.00
} else {
i := 0
for MoonHeight(JD1, Lon, Lat, TZ) < An {
i++
JD1 += 15.0 / 60.0 / 24.0
if i > 48 {
break
}
}
}
for {
JD0 := JD1
stDegree := HMoonHeight(JD0, Lon, Lat, TZ) - An
@@ -1487,10 +1504,11 @@ func GetMoonDownTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 {
}
An = An - HeightDegreeByLat(HEI, Lat)
moonang := MoonTimeAngle(JD, Lon, Lat, TZ)
if moonheight < 0 { //月亮在地平线上或在落下与下中天之间
if moonheight < 0 {
tms = (360 - moonang) / 15
JD1 += (tms/24 + (tms/24.0*12.0)/15.0/24.0)
}
//月亮在地平线上或在落下与下中天之间
if moonheight > 0 && moonang < 180 {
tms = (-moonang) / 15
JD1 += (tms/24.0 + (tms/24.0*12.0)/15.0/24.0)
@@ -1505,18 +1523,34 @@ func GetMoonDownTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 {
if math.Abs(now-360) > 0.5 {
JD1 += (360 - now) * 4.0 / 60.0 / 24.0
}
hei := MoonHeight(JD1, Lon, Lat, TZ)
//JD1=月球中天时间
hei := HMoonHeight(JD1, Lon, Lat, TZ)
if !(hei > 10 && math.Abs(Lat) < 60) {
if hei < An {
return -2 //沉
}
if MoonHeight(JD1+12.0/24.0+6.0/15.0/24.0, Lon, Lat, TZ) > An {
reJde := JD1 + 12.0/24.0 + 6.0/15.0/24.0
sub := 180 - MoonTimeAngle(reJde, Lon, Lat, TZ)
reJde += sub * 4.0 / 60.0 / 24.0
if HMoonHeight(reJde, Lon, Lat, TZ) > An {
return -1 //拱
}
}
dec := MoonSeeDec(JD1, Lon, Lat, TZ)
SJ := (ArcCos(-Tan(Lat) * Tan(dec))) / 15.0
JD1 += SJ/24 + SJ/33.0/15.0
tmp := (Sin(An) - Sin(dec)*Sin(Lat)) / (Cos(dec) * Cos(Lat))
if math.Abs(tmp) <= 1 && Lat < 85 {
SJ := (ArcCos(tmp)) / 15.0
JD1 += SJ/24 + SJ/33.0/15.0
} else {
i := 0
for MoonHeight(JD1, Lon, Lat, TZ) > An {
i++
JD1 += 15.0 / 60.0 / 24.0
if i > 48 {
break
}
}
}
for {
JD0 := JD1
stDegree := HMoonHeight(JD0, Lon, Lat, TZ) - An