diff options
Diffstat (limited to 'src/parameters.cpp')
-rw-r--r-- | src/parameters.cpp | 210 |
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" | ||
2 | using namespace std; | ||
3 | |||
4 | // 计算地球日心黄经 | ||
5 | double 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 | // 计算地球日心黄纬 | ||
17 | double 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 | |||
29 | double 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误差,返回弧度制 | ||
40 | double 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 | //获取章动有关角 | ||
60 | vector<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 | //章动修正 | ||
78 | double 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 | //光行差修正,返回弧度制 | ||
111 | double 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为地日距离 | ||
122 | vector<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 | |||
163 | double 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 | //} | ||