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])."
"; } 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])."
"; } 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] + "年" }