fork(2) download
  1. //#include "StdAfx.h"
  2. //#include "GSanSystem.h"
  3. //#include "math.h"
  4. #include <iostream>
  5. #include <cmath>
  6.  
  7. #define M_PI 3.14159265358979323846
  8. #define Rad(x) x*M_PI/180.0
  9.  
  10. using namespace std;
  11.  
  12. //GSanSystem::GSanSystem(void){}
  13.  
  14. //GSanSystem::~GSanSystem(void){}
  15.  
  16. /*int round(double n) {
  17. double t;
  18. t = n - double(n);
  19. n*=10;
  20. if (t >= 0.5) {
  21. ceil(n);
  22. } else {
  23. floor(n);
  24. }
  25. n/=10;
  26. return (int)n;
  27. }*/
  28.  
  29. int main() {
  30. //1.Вычисление модифицированной юлианской даты на начало суток
  31.  
  32. double lon, //Долгота
  33. lat,//Широта
  34. Year,//год
  35. Mon,// месяцы
  36. Day,// дни
  37. hour,//часы
  38. min,//минуты
  39. sec,// секунды
  40. zona;// Часовой пояс
  41. cin >> lon >> lat >> Year >> Mon >> Day >> hour >> min >> sec >> zona;
  42.  
  43. double Var1,Var2,Var3;
  44. Var1 = 10000 * Year + 100 * Mon + Day;
  45. if (Mon <= 2 ) {
  46. Mon = Mon + 12;
  47. Year = Year - 1;
  48. }
  49. if (Var1 <= 15821004) Var2 = -2 + floor((Year + 4716) / 4) - 1179;
  50. else Var2 = floor(Year /400) - floor(Year / 100) + floor(Year / 4);
  51. Var3 = 365 * Year - 679004;
  52. // MJD - Модифицированная Юлианская дата
  53. double MJD = Var3 + Var2 + floor(306001 * (Mon + 1)/ 10000) + Day;
  54. // Вычисление Гринвеческого звездного времени
  55. double T0 = ((int)MJD - 51544.5) / 36525; // мод.юл.дата на начало суток в юлианских столетиях
  56. double a1 = 24110.54841;
  57. double a2 = 8640184.812;
  58. double a3 = 0.093104;
  59. double a4 = 0.0000062;
  60. double S0 = a1 + a2 * T0 + a3 * T0*T0- a4 * T0 *T0*T0;// звездное время в Гринвиче на начало суток в секундах
  61. //UT - всемирное время в часах, момент расчета
  62. double UT = hour-zona + min/60 + sec/3600;
  63. if (UT > 24) UT -= 24;
  64. if (UT < 0) UT += 24;
  65. double Nsec = UT * 3600; // количество секунд, прошедших от начала суток до момента наблюдения
  66. double NsecS = Nsec * 366.2422 / 365.2422; //количество звездных секунд
  67. double GMT = (S0 + NsecS) /3600 * 15;//гринвическое среднее звездное время в градусах SG
  68. while (GMT > 360) GMT -= 360;
  69. double GST = GMT + lon;// местное звездное время ST
  70. //Lon – долгота наблюдателя
  71. // Вычисление эклиптических координат Солнца
  72. T0 = (MJD - 51544.5) / 36525; // мод.юл.дата на начало суток в юлианских столетиях
  73. double M = 357.528 + 35999.05 * T0 + 0.04107 * UT;// средняя аномалия
  74. while (M > 360) M -= 360;
  75. double L0 = 280.46 + 36000.772 * T0 + 0.04107 * UT;
  76. double L = L0 + (1.915 - 0.0048 * T0) * sin(Rad(M)) + 0.02 * sin(Rad(2 *M));//долгота Солнца
  77. while (L > 360) L -= 360;
  78. double X = cos(Rad(L)) ; // вектор
  79. double Y = sin(Rad(L)) ; // в эклиптической
  80. double Z = 0 ; // системе координат
  81. cout << X << endl << Y << endl << Z << endl;
  82. // Координаты Cолнца в прямоугольной экваториальной системе координат
  83. double Eps = 23.439281 ; //наклон эклиптики к экватору
  84. double X1 = X ; // вектор
  85. double Y1 = Y * cos(Rad(Eps)) - Z * sin(Rad(Eps)); // в экваториальной
  86. double Z1 = Y * sin(Rad(Eps)) + Z * cos(Rad(Eps)) ;// системе координат
  87. // Экваториальные геоцентрические координаты Солнца
  88. // RA - прямое восхождение Солнца на нужный момент времени
  89. //DEC - склонение Солнца на нужный момент времени
  90. double Ra = atan2(Y1 ,X1)*180/M_PI;
  91. double Dec = atan2 (Z1 , sqrt(X1*X1 + Y1*Y1))*180/M_PI;
  92. cout << Ra << endl << Dec << endl;
  93. // Азимутальные координаты Солнца
  94. //Lat - широта
  95. double Th = GST - Ra ;//часовой угол
  96. double z = acos(sin(Rad(lat)) * sin(Rad(Dec)) + cos(Rad(lat)) * cos(Rad(Dec)) * cos(Rad(Th)))*180/M_PI;// косинус зенитного угла
  97. double H = 90 - z;
  98. double Az = atan2( sin(Rad(Th)) * cos(Rad(Dec)) * cos(Rad(lat)),sin(Rad(H)) * sin(Rad(lat)) - sin(Rad(Dec)))*180/M_PI;
  99. Az = Az + 180; // Переводим в геодезический азимут
  100. // получаем подсолнечную точку
  101. // Долгота Солнца
  102. double LonSan = Ra - GST;
  103. // Широта Солнца
  104. double LatSan = Dec;
  105.  
  106. cout << H << endl << Az << endl;
  107. }
Success #stdin #stdout 0s 5280KB
stdin
0 0 2024 1 1 0 0 0 0
stdout
0.174398
-0.984675
0
-79.0739
-23.0591
-66.9286
181.816