summaryrefslogtreecommitdiffstats
path: root/src/parameters.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/parameters.cpp')
-rw-r--r--src/parameters.cpp210
1 files changed, 210 insertions, 0 deletions
diff --git a/src/parameters.cpp b/src/parameters.cpp
new file mode 100644
index 0000000..704f083
--- /dev/null
+++ b/src/parameters.cpp
@@ -0,0 +1,210 @@
1#include "calendar.h"
2using namespace std;
3
4// 计算地球日心黄经
5double parameter::get_longitude(vector<double> l,double t)
6{
7 double L=l[0];
8 for(int i=1;i<l.size();i++)
9 {
10 L+=l[i]*pow(t,i);
11 }
12 //返回弧度制
13 return L+pi;
14}
15
16// 计算地球日心黄纬
17double parameter::get_latitude(vector<double> b,double t)
18{
19 double B=b[0];
20 for(int i=1;i<b.size();i++)
21 {
22 B+=b[i]*pow(t,i);
23 }
24 //返回弧度制
25 //地心黄纬=-太阳黄纬
26 return -B;
27}
28
29double parameter::get_R(vector<double> r,double t)
30{
31 double R=r[0];
32 for(int i=1;i<r.size();i++)
33 {
34 R+=r[i]*pow(t,i);
35 }
36 return R;
37}
38
39// 转换FK5误差,返回弧度制
40double parameter::delta_FK5(double L,double B,double T)
41{
42 //L转角度制
43 L*=180/pi;
44 //计算L',角度制
45 double L_p=L-1.397*T-0.00031*T*T;
46 //计算L',弧度制
47 L_p*=pi/180;
48 while(L_p<0)
49 L_p+=2*pi;
50 while(L_p>2*pi)
51 L_p-=2*pi;
52 //计算delta_L,单位为角秒
53 double delta_L=-0.09033+0.03916*(cos(L_p)+sin(L_p))*tan(B);
54 //转换为弧度制
55 delta_L*=pi/(180*3600);
56 return delta_L;
57}
58
59//获取章动有关角
60vector<double> parameter::get_angle(double T)
61{
62 vector<double> ang;
63 //计算平距角
64 ang.push_back(297.85036+445267.111480*T-0.0019142*T*T+T*T*T/189474);
65 //计算日地平近点角
66 ang.push_back(357.52772+35999.050340*T-0.0001603*T*T-T*T*T/300000);
67 //计算月球平近点角
68 ang.push_back(134.96298+477198.867398*T+0.0086972*T*T+T*T*T/56250);
69 //计算月球纬度参数
70 ang.push_back(93.27191+483202.017538*T-0.0036825*T*T+T*T*T/327270);
71 //计算黄道与月球平轨道交点黄经
72 ang.push_back(125.04452-1934.136261*T+0.0020708*T*T+T*T*T/450000);
73 return ang;
74}
75
76
77//章动修正
78double parameter::nution(double T)
79{
80 vector<double> ang=get_angle(T);
81 fstream fr;
82 fr.open("data/nutation.txt",ios::in);
83 string str;
84 double sita;
85 double s,s1,s2;
86 double c,c1,c2;
87 double m,n,o,p,q;
88
89 s=c=0;
90 while(getline(fr,str))
91 {
92 sscanf(str.c_str(),"%lf%lf%lf%lf%lf%lf%lf%lf%lf",&m,&n,&o,&p,&q,&s1,&s2,&c1,&c2);
93 sita=m*ang[0]+n*ang[1]+o*ang[2]+p*ang[3]+q*ang[4];
94
95 //sita为角度制,转换为弧度制
96 sita*=pi/180;
97 //计算黄经章动,单位为0.0001角秒
98 s+=(s1+s2*T)*sin(sita);
99 //计算交角章动,单位为0.0001角秒
100 //c+=(c1+c2*T)*cos(sita);
101 }
102 //关闭文件
103 fr.close();
104 // 计算得到的s和c单位0.0001秒,转换为弧度制
105 s*=0.0001;
106 s*=pi/(180*3600);
107 return s;
108}
109
110//光行差修正,返回弧度制
111double parameter::aberration(double R)
112{
113 //return -20.4898/R/3600.0*pi/180.0;
114 //公式,单位0.0001角秒
115 double delta=-20.4898/R;
116 //转换为弧度制
117 delta*=pi/(180*3600);
118 return delta;
119}
120
121// 获取地日运行参数,L为地球日心黄经,B为地球日心黄纬,R为地日距离
122vector<vector<double>> parameter::get_parameters(double t)
123{
124 fstream fr;
125 fr.open("data/earth.txt",ios::in);
126 string s;
127 double l=0;
128 double a,b,c,num_tmp=0;
129 vector<vector<double>> parameters;
130 vector<double> tmp;
131 while(getline(fr,s))
132 {
133 //当分割符为/时,表明一组参数结束,将参数存入parameters中,并清空tmp
134 if(s[0]=='/')
135 {
136 parameters.push_back(tmp);
137 tmp.resize(0);
138 num_tmp=0;
139 }
140 //当分割符为=时,表明一组参数中的一类结束,将参数存入tmp中,并清空num_tmp
141 else if(s[0]=='=')
142 {
143 tmp.push_back(num_tmp);
144 num_tmp=0;
145 }
146 else
147 {
148 sscanf(s.c_str(),"%lf%lf%lf",&a,&b,&c);
149 num_tmp+=a*cos(b+c*t);
150 }
151 }
152 //关闭文件
153 fr.close();
154 /* 最终传参情况:
155 * parameters[0]为L系列,用来计算地球日心黄经
156 * parameters[1]为B系列,用来计算地球日心黄纬
157 * parameters[2]为R系列,用来计算地日距离
158 */
159 return parameters;
160}
161
162
163double parameter::sun_longitude(double t)
164{
165 //从文件中计算地日运行参数
166 vector<vector<double>> p=get_parameters(t);
167
168 //取出各类参数
169 vector<double> l=p[0],b=p[1],r=p[2];
170
171 //计算地球日心黄经纬,返回弧度制/天文单位
172 double L=get_longitude(l,t);
173 double B=get_latitude(b,t);
174 double R=get_R(r,t);
175
176
177 //以下修正需要的都是儒略世纪数而非千年数
178 //转FK5误差,返回弧度制
179 L+=delta_FK5(L,B,10*t);
180 //章动修正,返回弧度制
181 L+=nution(10*t);
182 //光行差修正,返回弧度制
183 L+=aberration(R);
184
185
186 //L转角度制
187 L*=180/pi;
188 while(L<0)
189 L+=360;
190 while(L>=360)
191 L-=360;
192 if(360-L<=5)
193 {
194 L-=360;
195 }
196 return L;
197}
198
199//double moon_longitude(double t)
200//{
201// //文件中获取地月运行参数
202// vector<vector<double>> p=get_moon_parameters(t);
203// vector<double> l=p[0],b=p[1],r=p[2];
204
205// //计算地月日心黄经纬,返回弧度制/天文单位
206// double L=get_moon_longitude(l,t);
207// double B=get_moon_latitude(b,t);
208// double R=get_moon_R(r,t);
209
210//}