You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
astro/basic/sun.go

1380 lines
27 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package basic
import (
"math"
"b612.me/astro/planet"
. "b612.me/astro/tools"
)
/*
黄赤交角、nutation==true时计算交角章动
*/
func EclipticObliquity(jde float64, nutation bool) float64 {
U := (jde - 2451545) / 3652500.000
sita := 23.000 + 26.000/60.000 + 21.448/3600.000 - ((4680.93*U - 1.55*U*U + 1999.25*U*U*U - 51.38*U*U*U*U - 249.67*U*U*U*U*U - 39.05*U*U*U*U*U*U + 7.12*U*U*U*U*U*U*U + 27.87*U*U*U*U*U*U*U*U + 5.79*U*U*U*U*U*U*U*U*U + 2.45*U*U*U*U*U*U*U*U*U*U) / 3600)
if nutation {
return sita + JJZD(jde)
} else {
return sita
}
}
func Sita(JD float64) float64 {
return EclipticObliquity(JD, true)
}
/*
* @name 黄经章动
*/
func HJZD(JD float64) float64 { // '黄经章动
// Dim p As Double, T As Double, Lmoon As Double
T := (JD - 2451545) / 36525.000
D := 297.8502042 + 445267.1115168*T - 0.0016300*T*T + T*T*T/545868 - T*T*T*T/113065000
M := SunM(JD)
N := MoonM(JD)
F := MoonLonX(JD)
O := 125.04452 - 1934.136261*T + 0.0020708*T*T + T*T*T/450000
//die(T." ".D." ".M." ".N." ".F." ".O);
tp := make(map[int]map[int]float64)
for i := 1; i < 64; i++ {
tp[i] = make(map[int]float64)
}
tp[1][1] = 0
tp[1][2] = 0
tp[1][3] = 0
tp[1][4] = 0
tp[1][5] = 1
tp[1][6] = -171996
tp[1][7] = -174.2 * T
tp[2][1] = -2
tp[2][2] = 0
tp[2][3] = 0
tp[2][4] = 2
tp[2][5] = 2
tp[2][6] = -13187
tp[2][7] = -1.6 * T
tp[3][1] = 0
tp[3][2] = 0
tp[3][3] = 0
tp[3][4] = 2
tp[3][5] = 2
tp[3][6] = -2274
tp[3][7] = -0.2 * T
tp[4][1] = 0
tp[4][2] = 0
tp[4][3] = 0
tp[4][4] = 0
tp[4][5] = 2
tp[4][6] = 2062
tp[4][7] = 0.2 * T
tp[5][1] = 0
tp[5][2] = 1
tp[5][3] = 0
tp[5][4] = 0
tp[5][5] = 0
tp[5][6] = 1426
tp[5][7] = -3.4 * T
tp[6][1] = 0
tp[6][2] = 0
tp[6][3] = 1
tp[6][4] = 0
tp[6][5] = 0
tp[6][6] = 712
tp[6][7] = 0.1 * T
tp[7][1] = -2
tp[7][2] = 1
tp[7][3] = 0
tp[7][4] = 2
tp[7][5] = 2
tp[7][6] = -517
tp[7][7] = 1.2 * T
tp[8][1] = 0
tp[8][2] = 0
tp[8][3] = 0
tp[8][4] = 2
tp[8][5] = 1
tp[8][6] = -386
tp[8][7] = -0.4 * T
tp[9][1] = 0
tp[9][2] = 0
tp[9][3] = 1
tp[9][4] = 2
tp[9][5] = 2
tp[9][6] = -301
tp[9][7] = 0
tp[10][1] = -2
tp[10][2] = -1
tp[10][3] = 0
tp[10][4] = 2
tp[10][5] = 2
tp[10][6] = 217
tp[10][7] = -0.5 * T
tp[11][1] = -2
tp[11][2] = 0
tp[11][3] = 1
tp[11][4] = 0
tp[11][5] = 0
tp[11][6] = -158
tp[11][7] = 0
tp[12][1] = -2
tp[12][2] = 0
tp[12][3] = 0
tp[12][4] = 2
tp[12][5] = 1
tp[12][6] = 129
tp[12][7] = 0.1 * T
tp[13][1] = 0
tp[13][2] = 0
tp[13][3] = -1
tp[13][4] = 2
tp[13][5] = 2
tp[13][6] = 123
tp[13][7] = 0
tp[14][1] = 2
tp[14][2] = 0
tp[14][3] = 0
tp[14][4] = 0
tp[14][5] = 0
tp[14][6] = 63
tp[14][7] = 0
tp[15][1] = 0
tp[15][2] = 0
tp[15][3] = 1
tp[15][4] = 0
tp[15][5] = 1
tp[15][6] = 63
tp[15][7] = 0.1 * T
tp[16][1] = 2
tp[16][2] = 0
tp[16][3] = -1
tp[16][4] = 2
tp[16][5] = 2
tp[16][6] = -59
tp[16][7] = 0
tp[17][1] = 0
tp[17][2] = 0
tp[17][3] = -1
tp[17][4] = 0
tp[17][5] = 1
tp[17][6] = -58
tp[17][7] = -0.1 * T
tp[18][1] = 0
tp[18][2] = 0
tp[18][3] = 1
tp[18][4] = 2
tp[18][5] = 1
tp[18][6] = -51
tp[18][7] = 0
tp[19][1] = -2
tp[19][2] = 0
tp[19][3] = 2
tp[19][4] = 0
tp[19][5] = 0
tp[19][6] = 48
tp[19][7] = 0
tp[20][1] = 0
tp[20][2] = 0
tp[20][3] = -2
tp[20][4] = 2
tp[20][5] = 1
tp[20][6] = 46
tp[20][7] = 0
tp[21][1] = 2
tp[21][2] = 0
tp[21][3] = 0
tp[21][4] = 2
tp[21][5] = 2
tp[21][6] = -38
tp[21][7] = 0
tp[22][1] = 0
tp[22][2] = 0
tp[22][3] = 2
tp[22][4] = 2
tp[22][5] = 2
tp[22][6] = -31
tp[22][7] = 0
tp[23][1] = 0
tp[23][2] = 0
tp[23][3] = 2
tp[23][4] = 0
tp[23][5] = 0
tp[23][6] = 29
tp[23][7] = 0
tp[24][1] = -2
tp[24][2] = 0
tp[24][3] = 1
tp[24][4] = 2
tp[24][5] = 2
tp[24][6] = 29
tp[24][7] = 0
tp[25][1] = 0
tp[25][2] = 0
tp[25][3] = 0
tp[25][4] = 2
tp[25][5] = 0
tp[25][6] = 26
tp[25][7] = 0
tp[26][1] = -2
tp[26][2] = 0
tp[26][3] = 0
tp[26][4] = 2
tp[26][5] = 0
tp[26][6] = -22
tp[26][7] = 0
tp[27][1] = 0
tp[27][2] = 0
tp[27][3] = -1
tp[27][4] = 2
tp[27][5] = 1
tp[27][6] = 21
tp[27][7] = 0
tp[28][1] = 0
tp[28][2] = 2
tp[28][3] = 0
tp[28][4] = 0
tp[28][5] = 0
tp[28][6] = 17
tp[28][7] = -0.1 * T
tp[29][1] = 2
tp[29][2] = 0
tp[29][3] = -1
tp[29][4] = 0
tp[29][5] = 1
tp[29][6] = 16
tp[29][7] = 0
tp[30][1] = -2
tp[30][2] = 2
tp[30][3] = 0
tp[30][4] = 2
tp[30][5] = 2
tp[30][6] = -16
tp[30][7] = 0.1 * T
tp[31][1] = 0
tp[31][2] = 1
tp[31][3] = 0
tp[31][4] = 0
tp[31][5] = 1
tp[31][6] = -15
tp[31][7] = 0
tp[32][1] = -2
tp[32][2] = 0
tp[32][3] = 1
tp[32][4] = 0
tp[32][5] = 1
tp[32][6] = -13
tp[32][7] = 0
tp[33][1] = 0
tp[33][2] = -1
tp[33][3] = 0
tp[33][4] = 0
tp[33][5] = 1
tp[33][6] = -12
tp[33][7] = 0
tp[34][1] = 0
tp[34][2] = 0
tp[34][3] = 2
tp[34][4] = -2
tp[34][5] = 0
tp[34][6] = 11
tp[34][7] = 0
tp[35][1] = 2
tp[35][2] = 0
tp[35][3] = -1
tp[35][4] = 2
tp[35][5] = 1
tp[35][6] = -10
tp[35][7] = 0
tp[36][1] = 2
tp[36][2] = 0
tp[36][3] = 1
tp[36][4] = 2
tp[36][5] = 2
tp[36][6] = -8
tp[36][7] = 0
tp[37][1] = 0
tp[37][2] = 1
tp[37][3] = 0
tp[37][4] = 2
tp[37][5] = 2
tp[37][6] = 7
tp[37][7] = 0
tp[38][1] = -2
tp[38][2] = 1
tp[38][3] = 1
tp[38][4] = 0
tp[38][5] = 0
tp[38][6] = -7
tp[38][7] = 0
tp[39][1] = 0
tp[39][2] = -1
tp[39][3] = 0
tp[39][4] = 2
tp[39][5] = 2
tp[39][6] = -7
tp[39][7] = 0
tp[40][1] = 2
tp[40][2] = 0
tp[40][3] = 0
tp[40][4] = 2
tp[40][5] = 1
tp[40][6] = -7
tp[40][7] = 0
tp[41][1] = 2
tp[41][2] = 0
tp[41][3] = 1
tp[41][4] = 0
tp[41][5] = 0
tp[41][6] = 6
tp[41][7] = 0
tp[42][1] = -2
tp[42][2] = 0
tp[42][3] = 2
tp[42][4] = 2
tp[42][5] = 2
tp[42][6] = 6
tp[42][7] = 0
tp[43][1] = -2
tp[43][2] = 0
tp[43][3] = 1
tp[43][4] = 2
tp[43][5] = 1
tp[43][6] = 6
tp[43][7] = 0
tp[44][1] = 2
tp[44][2] = 0
tp[44][3] = -2
tp[44][4] = 0
tp[44][5] = 1
tp[44][6] = -6
tp[44][7] = 0
tp[45][1] = 2
tp[45][2] = 0
tp[45][3] = 0
tp[45][4] = 0
tp[45][5] = 1
tp[45][6] = -6
tp[45][7] = 0
tp[46][1] = 0
tp[46][2] = -1
tp[46][3] = 1
tp[46][4] = 0
tp[46][5] = 0
tp[46][6] = 5
tp[46][7] = 0
tp[47][1] = -2
tp[47][2] = -1
tp[47][3] = 0
tp[47][4] = 2
tp[47][5] = 1
tp[47][6] = -5
tp[47][7] = 0
tp[48][1] = -2
tp[48][2] = 0
tp[48][3] = 0
tp[48][4] = 0
tp[48][5] = 1
tp[48][6] = -5
tp[48][7] = 0
tp[49][1] = 0
tp[49][2] = 0
tp[49][3] = 2
tp[49][4] = 2
tp[49][5] = 1
tp[49][6] = -5
tp[49][7] = 0
tp[50][1] = -2
tp[50][2] = 0
tp[50][3] = 2
tp[50][4] = 0
tp[50][5] = 1
tp[50][6] = 4
tp[50][7] = 0
tp[51][1] = -2
tp[51][2] = 1
tp[51][3] = 0
tp[51][4] = 2
tp[51][5] = 1
tp[51][6] = 4
tp[51][7] = 0
tp[52][1] = 0
tp[52][2] = 0
tp[52][3] = 1
tp[52][4] = -2
tp[52][5] = 0
tp[52][6] = 4
tp[52][7] = 0
tp[53][1] = -1
tp[53][2] = 0
tp[53][3] = 1
tp[53][4] = 0
tp[53][5] = 0
tp[53][6] = -4
tp[53][7] = 0
tp[54][1] = -2
tp[54][2] = 1
tp[54][3] = 0
tp[54][4] = 0
tp[54][5] = 0
tp[54][6] = -4
tp[54][7] = 0
tp[55][1] = 1
tp[55][2] = 0
tp[55][3] = 0
tp[55][4] = 0
tp[55][5] = 0
tp[55][6] = -4
tp[55][7] = 0
tp[56][1] = 0
tp[56][2] = 0
tp[56][3] = 1
tp[56][4] = 2
tp[56][5] = 0
tp[56][6] = 3
tp[56][7] = 0
tp[57][1] = 0
tp[57][2] = 0
tp[57][3] = -2
tp[57][4] = 2
tp[57][5] = 2
tp[57][6] = -3
tp[57][7] = 0
tp[58][1] = -1
tp[58][2] = -1
tp[58][3] = 1
tp[58][4] = 0
tp[58][5] = 0
tp[58][6] = -3
tp[58][7] = 0
tp[59][1] = 0
tp[59][2] = 1
tp[59][3] = 1
tp[59][4] = 0
tp[59][5] = 0
tp[59][6] = -3
tp[59][7] = 0
tp[60][1] = 0
tp[60][2] = -1
tp[60][3] = 1
tp[60][4] = 2
tp[60][5] = 2
tp[60][6] = -3
tp[60][7] = 0
tp[61][1] = 2
tp[61][2] = -1
tp[61][3] = -1
tp[61][4] = 2
tp[61][5] = 2
tp[61][6] = -3
tp[61][7] = 0
tp[62][1] = 0
tp[62][2] = 0
tp[62][3] = 3
tp[62][4] = 2
tp[62][5] = 2
tp[62][6] = -3
tp[62][7] = 0
tp[63][1] = 2
tp[63][2] = -1
tp[63][3] = 0
tp[63][4] = 2
tp[63][5] = 2
tp[63][6] = -3
tp[63][7] = 0
var S float64
for i := 1; i < 64; i++ {
S += (tp[i][6] + tp[i][7]) * Sin(D*tp[i][1]+M*tp[i][2]+N*tp[i][3]+F*tp[i][4]+O*tp[i][5])
}
//P=-17.20*Sin(O)-1.32*Sin(2*280.4665 + 36000.7698*T)-0.23*Sin(2*218.3165 + 481267.8813*T )+0.21*Sin(2*O);
//return P/3600;
return (S / 10000) / 3600
}
/*
* 交角章动
*/
func JJZD(JD float64) float64 { //交角章动
T := (JD - 2451545) / 36525
//D = 297.85036 +455267.111480*T - 0.0019142*T*T+ T*T*T/189474;
//M = 357.52772 + 35999.050340*T - 0.0001603*T*T- T*T*T/300000;
//N= 134.96298 + 477198.867398*T + 0.0086972*T*T + T*T*T/56250;
//F = 93.27191 + 483202.017538*T - 0.0036825*T*T + T*T*T/327270;
D := 297.8502042 + 445267.1115168*T - 0.0016300*T*T + T*T*T/545868 - T*T*T*T/113065000
M := SunM(JD)
N := MoonM(JD)
F := MoonLonX(JD)
O := 125.04452 - 1934.136261*T + 0.0020708*T*T + T*T*T/450000
tp := make(map[int]map[int]float64)
for i := 1; i < 64; i++ {
tp[i] = make(map[int]float64)
}
tp[1][1] = 0
tp[1][2] = 0
tp[1][3] = 0
tp[1][4] = 0
tp[1][5] = 1
tp[1][6] = 92025
tp[1][7] = 8.9 * T
tp[2][1] = -2
tp[2][2] = 0
tp[2][3] = 0
tp[2][4] = 2
tp[2][5] = 2
tp[2][6] = 5736
tp[2][7] = -3.1 * T
tp[3][1] = 0
tp[3][2] = 0
tp[3][3] = 0
tp[3][4] = 2
tp[3][5] = 2
tp[3][6] = 977
tp[3][7] = -0.5 * T
tp[4][1] = 0
tp[4][2] = 0
tp[4][3] = 0
tp[4][4] = 0
tp[4][5] = 2
tp[4][6] = -895
tp[4][7] = 0.5 * T
tp[5][1] = 0
tp[5][2] = 1
tp[5][3] = 0
tp[5][4] = 0
tp[5][5] = 0
tp[5][6] = 54
tp[5][7] = -0.1 * T
tp[6][1] = 0
tp[6][2] = 0
tp[6][3] = 1
tp[6][4] = 0
tp[6][5] = 0
tp[6][6] = -7
tp[6][7] = 0
tp[7][1] = -2
tp[7][2] = 1
tp[7][3] = 0
tp[7][4] = 2
tp[7][5] = 2
tp[7][6] = 224
tp[7][7] = -0.6 * T
tp[8][1] = 0
tp[8][2] = 0
tp[8][3] = 0
tp[8][4] = 2
tp[8][5] = 1
tp[8][6] = 200
tp[8][7] = 0
tp[9][1] = 0
tp[9][2] = 0
tp[9][3] = 1
tp[9][4] = 2
tp[9][5] = 2
tp[9][6] = 129
tp[9][7] = -0.1 * T
tp[10][1] = -2
tp[10][2] = -1
tp[10][3] = 0
tp[10][4] = 2
tp[10][5] = 2
tp[10][6] = -95
tp[10][7] = 0.3 * T
tp[11][1] = -2
tp[11][2] = 0
tp[11][3] = 0
tp[11][4] = 2
tp[11][5] = 1
tp[11][6] = -70
tp[11][7] = 0
tp[12][1] = 0
tp[12][2] = 0
tp[12][3] = -1
tp[12][4] = 2
tp[12][5] = 2
tp[12][6] = -53
tp[12][7] = 0
tp[13][1] = 2
tp[13][2] = 0
tp[13][3] = 0
tp[13][4] = 0
tp[13][5] = 0
tp[13][6] = 63
tp[13][7] = 0
tp[14][1] = 0
tp[14][2] = 0
tp[14][3] = 1
tp[14][4] = 0
tp[14][5] = 1
tp[14][6] = -33
tp[14][7] = 0
tp[15][1] = 2
tp[15][2] = 0
tp[15][3] = -1
tp[15][4] = 2
tp[15][5] = 2
tp[15][6] = 26
tp[15][7] = 0
tp[16][1] = 0
tp[16][2] = 0
tp[16][3] = -1
tp[16][4] = 0
tp[16][5] = 1
tp[16][6] = 32
tp[16][7] = 0
tp[17][1] = 0
tp[17][2] = 0
tp[17][3] = 1
tp[17][4] = 2
tp[17][5] = 1
tp[17][6] = 27
tp[17][7] = 0
tp[18][1] = 0
tp[18][2] = 0
tp[18][3] = -2
tp[18][4] = 2
tp[18][5] = 1
tp[18][6] = -24
tp[18][7] = 0
tp[19][1] = 2
tp[19][2] = 0
tp[19][3] = 0
tp[19][4] = 2
tp[19][5] = 2
tp[19][6] = 16
tp[19][7] = 0
tp[20][1] = 0
tp[20][2] = 0
tp[20][3] = 2
tp[20][4] = 2
tp[20][5] = 2
tp[20][6] = 13
tp[20][7] = 0
tp[21][1] = -2
tp[21][2] = 0
tp[21][3] = 1
tp[21][4] = 2
tp[21][5] = 2
tp[21][6] = -12
tp[21][7] = 0
tp[22][1] = 0
tp[22][2] = 0
tp[22][3] = -1
tp[22][4] = 2
tp[22][5] = 1
tp[22][6] = -10
tp[22][7] = 0
tp[23][1] = 2
tp[23][2] = 0
tp[23][3] = -1
tp[23][4] = 0
tp[23][5] = 1
tp[23][6] = -8
tp[23][7] = 0
tp[24][1] = -2
tp[24][2] = 2
tp[24][3] = 0
tp[24][4] = 2
tp[24][5] = 2
tp[24][6] = 7
tp[24][7] = 0
tp[25][1] = 0
tp[25][2] = 1
tp[25][3] = 0
tp[25][4] = 0
tp[25][5] = 1
tp[25][6] = 9
tp[25][7] = 0
tp[26][1] = -2
tp[26][2] = 0
tp[26][3] = 1
tp[26][4] = 0
tp[26][5] = 1
tp[26][6] = 7
tp[26][7] = 0
tp[27][1] = 0
tp[27][2] = -1
tp[27][3] = 0
tp[27][4] = 0
tp[27][5] = 1
tp[27][6] = 6
tp[27][7] = 0
tp[28][1] = 2
tp[28][2] = 0
tp[28][3] = -1
tp[28][4] = 2
tp[28][5] = 1
tp[28][6] = 5
tp[28][7] = 0
tp[29][1] = 2
tp[29][2] = 0
tp[29][3] = 1
tp[29][4] = 2
tp[29][5] = 2
tp[29][6] = 3
tp[29][7] = 0
tp[30][1] = 0
tp[30][2] = 1
tp[30][3] = 0
tp[30][4] = 2
tp[30][5] = 2
tp[30][6] = -3
tp[30][7] = 0
tp[31][1] = 0
tp[31][2] = -1
tp[31][3] = 0
tp[31][4] = 2
tp[31][5] = 2
tp[31][6] = 3
tp[31][7] = 0
tp[32][1] = 2
tp[32][2] = 0
tp[32][3] = 0
tp[32][4] = 2
tp[32][5] = 1
tp[32][6] = 3
tp[32][7] = 0
tp[33][1] = -2
tp[33][2] = 0
tp[33][3] = 2
tp[33][4] = 2
tp[33][5] = 2
tp[33][6] = -3
tp[33][7] = 0
tp[34][1] = -2
tp[34][2] = 0
tp[34][3] = 1
tp[34][4] = 2
tp[34][5] = 1
tp[34][6] = -3
tp[34][7] = 0
tp[35][1] = 2
tp[35][2] = 0
tp[35][3] = -2
tp[35][4] = 0
tp[35][5] = 1
tp[35][6] = 3
tp[35][7] = 0
tp[36][1] = 2
tp[36][2] = 0
tp[36][3] = 0
tp[36][4] = 0
tp[36][5] = 1
tp[36][6] = 3
tp[36][7] = 0
tp[37][1] = -2
tp[37][2] = -1
tp[37][3] = 0
tp[37][4] = 2
tp[37][5] = 1
tp[37][6] = 3
tp[37][7] = 0
tp[38][1] = -2
tp[38][2] = 0
tp[38][3] = 0
tp[38][4] = 0
tp[38][5] = 1
tp[38][6] = 3
tp[38][7] = 0
tp[39][1] = 0
tp[39][2] = 0
tp[39][3] = 2
tp[39][4] = 2
tp[39][5] = 1
tp[39][6] = 3
tp[39][7] = 0
var S float64 = 0
for i := 1; i < 40; i++ {
S += (tp[i][6] + tp[i][7]) * Cos(D*tp[i][1]+M*tp[i][2]+N*tp[i][3]+F*tp[i][4]+O*tp[i][5])
}
return S / 10000 / 3600
}
/*
@name 太阳几何黄经
*/
func SunLo(jd float64) float64 {
T := (jd - 2451545) / 365250
SunLo := 280.4664567 + 360007.6982779*T + 0.03032028*T*T + T*T*T/49931 - T*T*T*T/15299 - T*T*T*T*T/1988000
return Limit360(SunLo)
}
func SunM(JD float64) float64 {
T := (JD - 2451545) / 36525
sunM := 357.5291092 + 35999.0502909*T - 0.0001559*T*T - 0.00000048*T*T*T
return Limit360(sunM)
}
/*
@name 地球偏心率
*/
func Earthe(JD float64) float64 { //'地球偏心率
T := (JD - 2451545) / 36525
Earthe := 0.016708617 - 0.000042037*T - 0.0000001236*T*T
return Earthe
}
func EarthPI(JD float64) float64 { //近日點經度
T := (JD - 2451545) / 36525
return 102.93735 + 1.71953*T + 000046*T*T
}
func SunMidFun(JD float64) float64 { //'太阳中间方程
T := (JD - 2451545) / 36525
M := SunM(JD)
SunMidFun := (1.9146-0.004817*T-0.000014*T*T)*Sin(M) + (0.019993-0.000101*T)*Sin(2*M) + 0.00029*Sin(3*M)
return SunMidFun
}
func SunTrueLo(JD float64) float64 { // '太阳真黄经
SunTrueLo := SunLo(JD) + SunMidFun(JD)
return SunTrueLo
}
func SunApparentLo(JD float64) float64 { //'太阳视黄经
T := (JD - 2451545) / 36525
SunApparentLo := SunTrueLo(JD) - 0.00569 - 0.00478*Sin(125.04-1934.136*T)
return SunApparentLo
}
func SunApparentRa(JD float64) float64 { // '太阳视赤经
return LoToRa(JD, SunApparentLo(JD), 0)
}
func SunTrueRa(JD float64) float64 { //'太阳真赤经
sitas := Sita(JD)
SunTrueRa := ArcTan(Cos(sitas) * Sin(SunTrueLo(JD)) / Cos(SunTrueLo(JD)))
//Select Case SunTrueLo(JD)
tmp := SunTrueLo(JD)
if tmp >= 90 && tmp < 180 {
SunTrueRa = 180 + SunTrueRa
} else if tmp >= 180 && tmp < 270 {
SunTrueRa = 180 + SunTrueRa
} else if tmp >= 270 && tmp <= 360 {
SunTrueRa = 360 + SunTrueRa
}
return SunTrueRa
}
func SunApparentDec(JD float64) float64 { // '太阳视赤纬
T := (JD - 2451545) / 36525
sitas := Sita(JD) + 0.00256*Cos(125.04-1934.136*T)
SunApparentDec := ArcSin(Sin(sitas) * Sin(SunApparentLo(JD)))
return SunApparentDec
}
func SunTrueDec(JD float64) float64 { // '太阳真赤纬
sitas := Sita(JD)
SunTrueDec := ArcSin(Sin(sitas) * Sin(SunTrueLo(JD)))
return SunTrueDec
}
func SunTime(JD float64) float64 { //均时差
tm := (SunLo(JD) - 0.0057183 - (HSunApparentRa(JD)) + (HJZD(JD))*Cos(Sita(JD))) / 15
if tm > 23 {
tm = -24 + tm
}
return tm
}
func SunSC(Lo, JD float64) float64 { //黄道上的岁差,仅黄纬=0时
t := (JD - 2451545) / 36525
//n := 47.0029/3600*t - 0.03302/3600*t*t + 0.000060/3600*t*t*t
//m := 174.876384/3600 - 869.8089/3600*t + 0.03536/3600*t*t
pk := 5029.0966/3600.00*t + 1.11113/3600.00*t*t - 0.000006/3600.00*t*t*t
return Lo + pk
}
func HSunTrueLo(JD float64) float64 {
L := planet.WherePlanet(0, 0, JD)
return L
}
func HSunTrueBo(JD float64) float64 {
L := planet.WherePlanet(0, 1, JD)
return L
}
func HSunApparentLo(JD float64) float64 {
L := HSunTrueLo(JD)
/*
t := (JD - 2451545) / 365250.0
R := planet.WherePlanet(-1, 2, JD)
t2 := t * t
t3 := t2 * t //千年数的各次方
R += (-0.0020 + 0.0044*t + 0.0213*t2 - 0.0250*t3)
L = L + HJZD(JD) - 20.4898/R/3600.00
*/
L = L + HJZD(JD) + SunLoGXC(JD)
return L
}
func SunLoGXC(JD float64) float64 {
R := planet.WherePlanet(0, 2, JD)
return -20.49552 / R / 3600
}
func EarthAway(JD float64) float64 {
//t=(JD - 2451545) / 365250;
//R=Earth_R5(t)+Earth_R4(t)+Earth_R3(t)+Earth_R2(t)+Earth_R1(t)+Earth_R0(t);
return planet.WherePlanet(0, 2, JD)
}
func HSunApparentRaDec(JD float64) (float64, float64) {
return LoBoToRaDec(JD, HSunApparentLo(JD), HSunTrueBo(JD))
}
func HSunApparentRa(JD float64) float64 { // '太阳视赤经
return LoToRa(JD, HSunApparentLo(JD), HSunTrueBo(JD))
}
func HSunTrueRa(JD float64) float64 { //'太阳真赤经
tmp := HSunTrueLo(JD)
sitas := Sita(JD)
HSunTrueRa := ArcTan(Cos(sitas) * Sin(tmp) / Cos(tmp))
//Select Case SunTrueLo(JD)
if tmp >= 90 && tmp < 180 {
HSunTrueRa = 180 + HSunTrueRa
} else if tmp >= 180 && tmp < 270 {
HSunTrueRa = 180 + HSunTrueRa
} else if tmp >= 270 && tmp <= 360 {
HSunTrueRa = 360 + HSunTrueRa
}
return HSunTrueRa
}
func HSunApparentDec(JD float64) float64 { // '太阳视赤纬
T := (JD - 2451545) / 36525
sitas := EclipticObliquity(JD, false) + 0.00256*Cos(125.04-1934.136*T)
HSunApparentDec := ArcSin(Sin(sitas) * Sin(HSunApparentLo(JD)))
return HSunApparentDec
}
func HSunTrueDec(JD float64) float64 { // '太阳真赤纬
sitas := EclipticObliquity(JD, false)
HSunTrueDec := ArcSin(Sin(sitas) * Sin(HSunTrueLo(JD)))
return HSunTrueDec
}
func RDJL(jd float64) float64 { //ri di ju li
f := SunMidFun(jd)
m := SunM(jd)
e := Earthe(jd)
return (1.000001018 * (1 - e*e) / (1 + e*Cos(f+m)))
}
func GetOneYearMoon(year float64) map[int]float64 {
var start float64
var tmp1, tmp float64
moon := make(map[int]float64)
if year < 6000 {
start = year + 11.00/12.00 + 5.00/30.00/12.00
} else {
start = year + 9.00/12.00 + 5.00/30.00/12.00
}
i := 1
for j := 1; j < 17; j++ {
if year > 3000 {
tmp1 = TD2UT(CalcMoonSH(start+float64(i-1)/12.5, 0)+8.0/24.0, false)
} else {
tmp1 = TD2UT(CalcMoonS(start+float64(i-1)/12.5, 0)+8.0/24.0, false)
}
if i != 1 {
if tmp1 == tmp {
j--
i++
continue
}
}
moon[j] = tmp1
tmp = moon[j]
i++
// echo DateCalc(moon[i])."<br />";
}
return moon
}
func GetOneYearJQ(year int) []float64 {
start := 270
var years int
jq := make([]float64, 26)
for i := 1; i < 26; i++ {
angle := start + 15*(i-1)
if angle > 360 {
angle -= 360
}
if i > 1 {
years = year + 1
} else {
years = year
}
jq[i] = GetJQTime(years, angle) + 8.0/24.0
// echo DateCalc(jq[i])."<br />";
}
jq[0] = jq[1]
return jq
}
func GetJQTime(Year, Angle int) float64 { //节气时间
var j int = 1
var Day int
var tp float64
if Angle%2 == 0 {
Day = 18
} else {
Day = 3
}
if Angle%10 != 0 {
tp = float64(Angle+15.0) / 30.0
} else {
tp = float64(Angle) / 30.0
}
Month := 3 + tp
if Month > 12 {
Month -= 12
}
JD1 := JDECalc(int(Year), int(Month), float64(Day))
if Angle == 0 {
Angle = 360
}
for i := 0; i < j; i++ {
for {
JD0 := JD1
stDegree := JQLospec(JD0) - float64(Angle)
stDegreep := (JQLospec(JD0+0.000005) - JQLospec(JD0-0.000005)) / 0.00001
JD1 = JD0 - stDegree/stDegreep
if math.Abs(JD1-JD0) <= 0.00001 {
break
}
}
JD1 -= 0.001
}
JD1 += 0.001
return TD2UT(JD1, false)
}
func JQLospec(JD float64) float64 {
t := HSunApparentLo(JD)
if t <= 12 {
t += 360
}
return t
}
func GetXC(jd float64) string { //十二次
tlo := HSunApparentLo(jd)
if tlo >= 255 && tlo < 285 {
return "星纪"
} else if tlo >= 285 && tlo < 315 {
return "玄枵"
} else if tlo >= 315 && tlo < 345 {
return "娵訾"
} else if tlo >= 345 || tlo < 15 {
return "降娄"
} else if tlo >= 15 && tlo < 45 {
return "大梁"
} else if tlo >= 45 && tlo < 75 {
return "实沈"
} else if tlo >= 75 && tlo < 105 {
return "鹑首"
} else if tlo >= 105 && tlo < 135 {
return "鹑火"
} else if tlo >= 135 && tlo < 165 {
return "鹑尾"
} else if tlo >= 165 && tlo < 195 {
return "寿星"
} else if tlo >= 195 && tlo < 225 {
return "大火"
} else if tlo >= 225 && tlo < 255 {
return "析木"
}
return ""
}
func GetWHTime(Year, Angle int) float64 {
tmp := Angle
var Day int
var tp float64
Angle = int(Angle/15) * 15
if Angle%2 == 0 {
Day = 18
} else {
Day = 3
}
if Angle%10 != 0 {
tp = float64(Angle+15) / 30.0
} else {
tp = float64(Angle) / 30.0
}
Month := int(3 + tp)
if Month > 12 {
Month -= 12
}
JD1 := JDECalc(Year, Month, float64(Day))
JD1 += float64(tmp - Angle)
Angle = tmp
if Angle <= 5 {
Angle = 360 + Angle
}
for {
JD0 := JD1
stDegree := JQLospec(JD0) - float64(Angle)
stDegreep := (JQLospec(JD0+0.000005) - JQLospec(JD0-0.000005)) / 0.00001
JD1 = JD0 - stDegree/stDegreep
if math.Abs(JD1-JD0) <= 0.00001 {
break
}
}
return TD2UT(JD1, false)
}
/*
* 太阳中天时刻,通过均时差计算
*/
func GetSunTZTime(JD, Lon, TZ float64) float64 { //实际中天时间
JD = math.Floor(JD)
tmp := (TZ*15 - Lon) * 4 / 60
return JD + tmp/24.0 - SunTime(JD)/24.0
}
/*
* 昏朦影传入 当天0时时刻
*/
func GetBanTime(JD, Lon, Lat, TZ, An float64) float64 {
JD = math.Floor(JD) + 1.5
ntz := math.Round(Lon / 15)
tztime := GetSunTZTime(JD, Lon, ntz)
if SunHeight(tztime, Lon, Lat, ntz) < An {
return -2 //极夜
}
if SunHeight(tztime+0.5, Lon, Lat, ntz) > An {
return -1 //极昼
}
tmp := (Sin(An) - Sin(HSunApparentDec(tztime))*Sin(Lat)) / (Cos(HSunApparentDec(tztime)) * Cos(Lat))
var sundown float64
if math.Abs(tmp) <= 1 && Lat < 85 {
rzsc := ArcCos(tmp) / 15
sundown = tztime + rzsc/24.0 + 35.0/24.0/60.0
} else {
sundown = tztime
i := 0
for LowSunHeight(sundown, Lon, Lat, ntz) > An {
i++
sundown += 15.0 / 60.0 / 24.0
if i > 48 {
break
}
}
}
JD1 := sundown - 5.00/24.00/60.00
for {
JD0 := JD1
stDegree := SunHeight(JD0, Lon, Lat, ntz) - An
stDegreep := (SunHeight(JD0+0.000005, Lon, Lat, ntz) - SunHeight(JD0-0.000005, Lon, Lat, ntz)) / 0.00001
JD1 = JD0 - stDegree/stDegreep
if math.Abs(JD1-JD0) < 0.00001 {
break
}
}
return JD1 - ntz/24 + TZ/24
}
func GetAsaTime(JD, Lon, Lat, TZ, An float64) float64 {
JD = math.Floor(JD) + 1.5
ntz := math.Round(Lon / 15)
tztime := GetSunTZTime(JD, Lon, ntz)
if SunHeight(tztime, Lon, Lat, ntz) < An {
return -2 //极夜
}
if SunHeight(tztime-0.5, Lon, Lat, ntz) > An {
return -1 //极昼
}
tmp := (Sin(An) - Sin(HSunApparentDec(tztime))*Sin(Lat)) / (Cos(HSunApparentDec(tztime)) * Cos(Lat))
var sunrise float64
if math.Abs(tmp) <= 1 && Lat < 85 {
rzsc := ArcCos(tmp) / 15
sunrise = tztime - rzsc/24 - 25.0/24.0/60.0
} else {
sunrise = tztime
i := 0
for LowSunHeight(sunrise, Lon, Lat, ntz) > An {
i++
sunrise -= 15.0 / 60.0 / 24.0
if i > 48 {
break
}
}
}
JD1 := sunrise - 5.00/24.00/60.00
for {
JD0 := JD1
stDegree := SunHeight(JD0, Lon, Lat, ntz) - An
stDegreep := (SunHeight(JD0+0.000005, Lon, Lat, ntz) - SunHeight(JD0-0.000005, Lon, Lat, ntz)) / 0.00001
JD1 = JD0 - stDegree/stDegreep
if math.Abs(JD1-JD0) < 0.00001 {
break
}
}
return JD1 - ntz/24 + TZ/24
}
/*
* 太阳时角
*/
func SunTimeAngle(JD, Lon, Lat, TZ float64) float64 {
startime := Limit360(ApparentSiderealTime(JD-TZ/24)*15 + Lon)
timeangle := startime - HSunApparentRa(TD2UT(JD-TZ/24, true))
if timeangle < 0 {
timeangle += 360
}
return timeangle
}
/*
* 精确计算传入当日0时JDE
*/
func GetSunRiseTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 {
var An float64
JD = math.Floor(JD) + 1.5
ntz := math.Round(Lon / 15)
if ZS != 0 {
An = -0.8333
}
An = An - HeightDegreeByLat(HEI, Lat)
tztime := GetSunTZTime(JD, Lon, ntz)
if SunHeight(tztime, Lon, Lat, ntz) < An {
return -2 //极夜
}
if SunHeight(tztime-0.5, Lon, Lat, ntz) > An {
return -1 //极昼
}
//(sin(ho)-sin(φ)*sin(δ2))/(cos(φ)*cos(δ2))
tmp := (Sin(An) - Sin(HSunApparentDec(tztime))*Sin(Lat)) / (Cos(HSunApparentDec(tztime)) * Cos(Lat))
var sunrise float64
if math.Abs(tmp) <= 1 && Lat < 85 {
rzsc := ArcCos(tmp) / 15
sunrise = tztime - rzsc/24 - 25.0/24.0/60.0
} else {
sunrise = tztime
i := 0
//TODO:使用二分法计算
for LowSunHeight(sunrise, Lon, Lat, ntz) > An {
i++
sunrise -= 15.0 / 60.0 / 24.0
if i > 48 {
break
}
}
}
JD1 := sunrise
for {
JD0 := JD1
stDegree := SunHeight(JD0, Lon, Lat, ntz) - An
stDegreep := (SunHeight(JD0+0.000005, Lon, Lat, ntz) - SunHeight(JD0-0.000005, Lon, Lat, ntz)) / 0.00001
JD1 = JD0 - stDegree/stDegreep
if math.Abs(JD1-JD0) <= 0.00001 {
break
}
}
return JD1 - ntz/24 + TZ/24
}
func GetSunDownTime(JD, Lon, Lat, TZ, ZS, HEI float64) float64 {
var An float64
JD = math.Floor(JD) + 1.5
ntz := math.Round(Lon / 15)
if ZS != 0 {
An = -0.8333
}
An = An - HeightDegreeByLat(HEI, Lat)
tztime := GetSunTZTime(JD, Lon, ntz)
if SunHeight(tztime, Lon, Lat, ntz) < An {
return -2 //极夜
}
if SunHeight(tztime+0.5, Lon, Lat, ntz) > An {
return -1 //极昼
}
tmp := (Sin(An) - Sin(HSunApparentDec(tztime))*Sin(Lat)) / (Cos(HSunApparentDec(tztime)) * Cos(Lat))
var sundown float64
if math.Abs(tmp) <= 1 && Lat < 85 {
rzsc := ArcCos(tmp) / 15
sundown = tztime + rzsc/24.0 + 35.0/24.0/60.0
} else {
sundown = tztime
i := 0
for LowSunHeight(sundown, Lon, Lat, ntz) > An {
i++
sundown += 15.0 / 60.0 / 24.0
if i > 48 {
break
}
}
}
JD1 := sundown
for {
JD0 := JD1
stDegree := SunHeight(JD0, Lon, Lat, ntz) - An
stDegreep := (SunHeight(JD0+0.000005, Lon, Lat, ntz) - SunHeight(JD0-0.000005, Lon, Lat, ntz)) / 0.00001
JD1 = JD0 - stDegree/stDegreep
if math.Abs(JD1-JD0) <= 0.00001 {
break
}
}
return JD1 - ntz/24 + TZ/24
}
/*
* 太阳高度角 世界时
*/
func SunHeight(JD, Lon, Lat, TZ float64) float64 {
//tmp := (TZ*15 - Lon) * 4 / 60
//truejd := JD - tmp/24
calcjd := JD - TZ/24.0
tjde := TD2UT(calcjd, true)
st := Limit360(ApparentSiderealTime(calcjd)*15 + Lon)
ra, dec := HSunApparentRaDec(tjde)
H := Limit360(st - ra)
tmp2 := Sin(Lat)*Sin(dec) + Cos(dec)*Cos(Lat)*Cos(H)
return ArcSin(tmp2)
}
func LowSunHeight(JD, Lon, Lat, TZ float64) float64 {
//tmp := (TZ*15 - Lon) * 4 / 60
//truejd := JD - tmp/24
calcjd := JD - TZ/24
st := Limit360(ApparentSiderealTime(calcjd)*15 + Lon)
H := Limit360(st - SunApparentRa(TD2UT(calcjd, true)))
dec := SunApparentDec(TD2UT(calcjd, true))
tmp2 := Sin(Lat)*Sin(dec) + Cos(dec)*Cos(Lat)*Cos(H)
return ArcSin(tmp2)
}
func SunAngle(JD, Lon, Lat, TZ float64) float64 {
//tmp := (TZ*15 - Lon) * 4 / 60
//truejd := JD - tmp/24
calcjd := JD - TZ/24
st := Limit360(ApparentSiderealTime(calcjd)*15 + Lon)
H := Limit360(st - HSunApparentRa(TD2UT(calcjd, true)))
tmp2 := Sin(H) / (Cos(H)*Sin(Lat) - Tan(HSunApparentDec(TD2UT(calcjd, true)))*Cos(Lat))
Angle := ArcTan(tmp2)
if Angle < 0 {
if H/15 < 12 {
return Angle + 360
}
return Angle + 180
}
if H/15 < 12 {
return Angle + 180
}
return Angle
}
/*
* 干支
*/
func GetGZ(year int) string {
tiangan := []string{"庚", "辛", "壬", "癸", "甲", "乙", "丙", "丁", "戊", "已"}
dizhi := []string{"申", "酉", "戌", "亥", "子", "丑", "寅", "卯", "辰", "巳", "午", "未"}
t := year - (year / 10 * 10)
d := year % 12
return tiangan[t] + dizhi[d] + "年"
}