eph_bpn 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/Gemfile +10 -0
- data/Guardfile +42 -0
- data/LICENSE.txt +21 -0
- data/README.md +63 -0
- data/Rakefile +6 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/eph_bpn.gemspec +33 -0
- data/exe/eph_bpn +18 -0
- data/lib/eph_bpn/argument.rb +24 -0
- data/lib/eph_bpn/compute.rb +633 -0
- data/lib/eph_bpn/consts.rb +1391 -0
- data/lib/eph_bpn/ephemeris.rb +45 -0
- data/lib/eph_bpn/version.rb +3 -0
- data/lib/eph_bpn.rb +15 -0
- metadata +105 -0
@@ -0,0 +1,633 @@
|
|
1
|
+
module EphBpn
|
2
|
+
module Compute
|
3
|
+
module_function
|
4
|
+
|
5
|
+
#=========================================================================
|
6
|
+
# 年月日(グレゴリオ暦)からユリウス日(JD)を計算する
|
7
|
+
#
|
8
|
+
# * フリーゲルの公式を使用する
|
9
|
+
# JD = int(365.25 * year)
|
10
|
+
# + int(year / 400)
|
11
|
+
# - int(year / 100)
|
12
|
+
# + int(30.59 (month - 2))
|
13
|
+
# + day
|
14
|
+
# + 1721088
|
15
|
+
# * 上記の int(x) は厳密には、 x を超えない最大の整数
|
16
|
+
# * 「ユリウス日」でなく「準ユリウス日」を求めるなら、
|
17
|
+
# `+ 1721088` を `- 678912` とする。
|
18
|
+
#
|
19
|
+
# @param: t (Time Object)
|
20
|
+
# @return: jd (ユリウス日)
|
21
|
+
#=========================================================================
|
22
|
+
def gc2jd(t)
|
23
|
+
year, month, day = t.year, t.month, t.day
|
24
|
+
hour, min, sec = t.hour, t.min, t.sec
|
25
|
+
|
26
|
+
begin
|
27
|
+
# 1月,2月は前年の13月,14月とする
|
28
|
+
if month < 3
|
29
|
+
year -= 1
|
30
|
+
month += 12
|
31
|
+
end
|
32
|
+
# 日付(整数)部分計算
|
33
|
+
jd = (365.25 * year).floor \
|
34
|
+
+ (year / 400.0).floor \
|
35
|
+
- (year / 100.0).floor \
|
36
|
+
+ (30.59 * (month - 2)).floor \
|
37
|
+
+ day \
|
38
|
+
+ 1721088.5
|
39
|
+
# 時間(小数)部分計算
|
40
|
+
t = (sec / 3600.0 + min / 60.0 + hour) / 24.0
|
41
|
+
return jd + t
|
42
|
+
rescue => e
|
43
|
+
raise
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
#=========================================================================
|
48
|
+
# JD(ユリウス日) -> JC(ユリウス世紀)
|
49
|
+
#
|
50
|
+
# * t = (JD - 2451545) / 36525.0
|
51
|
+
#
|
52
|
+
# @param: jd (ユリウス日)
|
53
|
+
# @return: jc (ユリウス世紀)
|
54
|
+
#=========================================================================
|
55
|
+
def jd2jc(jd)
|
56
|
+
return (jd - 2451545) / 36525.0
|
57
|
+
rescue => e
|
58
|
+
raise
|
59
|
+
end
|
60
|
+
|
61
|
+
#=========================================================================
|
62
|
+
# 黄道傾斜角計算
|
63
|
+
#
|
64
|
+
# * 黄道傾斜角 ε (単位: rad)を計算する。
|
65
|
+
# 以下の計算式により求める。
|
66
|
+
# ε = 84381.406 - 46.836769 * T - 0.0001831 T^2 + 0.00200340 T^3
|
67
|
+
# - 5.76 * 10^(-7) * T^4 - 4.34 * 10^(-8) * T^5
|
68
|
+
# ここで、 T は J2000.0 からの経過時間を 36525 日単位で表したユリウス
|
69
|
+
# 世紀数で、 T = (JD - 2451545) / 36525 である。
|
70
|
+
#
|
71
|
+
# @param: jc (ユリウス世紀)
|
72
|
+
# @return: eps (平均黄道傾斜角)
|
73
|
+
#=========================================================================
|
74
|
+
def compute_obliquity(jc)
|
75
|
+
return (84381.406 + \
|
76
|
+
( -46.836769 + \
|
77
|
+
( -0.0001831 + \
|
78
|
+
( 0.00200340 + \
|
79
|
+
( -5.76 * 10e-7 + \
|
80
|
+
( -4.34 * 10e-8 ) \
|
81
|
+
* jc) * jc) * jc) * jc) * jc) * Const::AS2R
|
82
|
+
rescue => e
|
83
|
+
raise
|
84
|
+
end
|
85
|
+
|
86
|
+
#=========================================================================
|
87
|
+
# Bias 変換行列(一般的な理論)
|
88
|
+
#
|
89
|
+
# * 赤道座標(J2000.0)の極は ICRS の極に対して12時(x軸のマイナス側)の方
|
90
|
+
# 向へ 17.3±0.2 mas、18時(y軸のマイナス側)の方向へ 5.1±0.2 mas ズレ
|
91
|
+
# ているので、変換する。
|
92
|
+
# さらに、平均分点への変換はICRSでの赤経を78±10 mas、天の極を中心に回
|
93
|
+
# 転させる。
|
94
|
+
# 18時の方向の変換はx軸を-5.1mas回転
|
95
|
+
# + 1 0 0 +
|
96
|
+
# R1(θ ) = | 0 cosθ sinθ |
|
97
|
+
# + 0 -sinθ cosθ +
|
98
|
+
# 12時の方向の変換はy軸を-17.3mas回転
|
99
|
+
# + cosθ 0 -sinθ +
|
100
|
+
# R2(θ ) = | 0 1 0 |
|
101
|
+
# + sinθ 0 cosθ +
|
102
|
+
# 天の極を中心に78.0mas回転
|
103
|
+
# + cosθ sinθ 0 +
|
104
|
+
# R3(θ ) = | -sinθ cosθ 0 |
|
105
|
+
# + 0 0 1 +
|
106
|
+
#
|
107
|
+
# @param: <none>
|
108
|
+
# @return: r (回転行列)
|
109
|
+
#=========================================================================
|
110
|
+
def r_generic
|
111
|
+
r = r_x( -5.1 * Const::AS2R)
|
112
|
+
r = r_y(-17.3 * Const::AS2R, r)
|
113
|
+
r = r_z( 78.0 * Const::AS2R, r)
|
114
|
+
return r
|
115
|
+
rescue => e
|
116
|
+
raise
|
117
|
+
end
|
118
|
+
|
119
|
+
#=========================================================================
|
120
|
+
# Bias 変換行列(IAU 2006 (Fukushima-Williams 4-angle formulation) 理論)
|
121
|
+
#
|
122
|
+
# @param: <none>
|
123
|
+
# @return: r (変換行列)
|
124
|
+
#=========================================================================
|
125
|
+
def r_fw_iau_06
|
126
|
+
jc = jd2jc(2451545.0)
|
127
|
+
eps = compute_obliquity(jc)
|
128
|
+
gamma = (-0.052928 + \
|
129
|
+
(10.556378 + \
|
130
|
+
( 0.4932044 + \
|
131
|
+
(-0.00031238 + \
|
132
|
+
(-0.000002788 + \
|
133
|
+
( 0.0000000260) \
|
134
|
+
* jc) * jc) * jc) * jc) * jc) * Const::AS2R
|
135
|
+
phi = (84381.412819 + \
|
136
|
+
( -46.811016 + \
|
137
|
+
( 0.0511268 + \
|
138
|
+
( 0.00053289 + \
|
139
|
+
( -0.000000440 + \
|
140
|
+
( -0.0000000176) \
|
141
|
+
* jc) * jc) * jc) * jc) * jc) * Const::AS2R
|
142
|
+
psi = ( -0.041775 + \
|
143
|
+
(5038.481484 + \
|
144
|
+
( 1.5584175 + \
|
145
|
+
( -0.00018522 + \
|
146
|
+
( -0.000026452 + \
|
147
|
+
( -0.0000000148) \
|
148
|
+
* jc) * jc) * jc) * jc) * jc) * Const::AS2R
|
149
|
+
r = r_z(gamma)
|
150
|
+
r = r_x(phi, r)
|
151
|
+
r = r_z(-psi, r)
|
152
|
+
r = r_x(-eps, r)
|
153
|
+
return r
|
154
|
+
rescue => e
|
155
|
+
raise
|
156
|
+
end
|
157
|
+
|
158
|
+
#=========================================================================
|
159
|
+
# precession(歳差)変換行列(J2000.0 用)
|
160
|
+
#
|
161
|
+
# * 歳差の変換行列
|
162
|
+
# P(ε , ψ , φ , γ ) = R1(-ε ) * R3(-ψ ) * R1(φ ) * R3(γ )
|
163
|
+
# 但し、R1, R2, R3 は x, y, z 軸の回転。
|
164
|
+
# + 1 0 0 + + cosθ sinθ 0 +
|
165
|
+
# R1(θ ) = | 0 cosθ sinθ | , R3(θ ) = | -sinθ cosθ 0 |
|
166
|
+
# + 0 -sinθ cosθ + + 0 0 1 +
|
167
|
+
# + P_11 P_12 P_13 +
|
168
|
+
# P(ε, ψ, φ, γ) = | P_21 P_22 P_23 | とすると、
|
169
|
+
# + P_31 P_32 P_33 +
|
170
|
+
# P_11 = cosψ cosγ + sinψ cosφ sinγ
|
171
|
+
# P_12 = cosψ sinγ - sinψ cosφ ̄cosγ
|
172
|
+
# P_13 = -sinψ sinφ
|
173
|
+
# P_21 = cosε sinψ cosγ - (cosε cosψ cosφ + sinε sinφ )sinγ
|
174
|
+
# P_22 = cosε sinψ cosγ + (cosε cosψ cosφ + sinε sinφ )cosγ
|
175
|
+
# P_23 = cosε cosψ sinφ - sinε cosφ
|
176
|
+
# P_31 = sinε sinψ cosγ - (sinε cosψ cosφ - cosε sinφ)sinγ
|
177
|
+
# P_32 = sinε sinψ cosγ + (sinε cosψ cosφ - cosε sinφ)cosγ
|
178
|
+
# P_33 = sinε cosψ sinφ + cosε cosφ
|
179
|
+
#
|
180
|
+
# @param: <none>
|
181
|
+
# @return: r (変換行列)
|
182
|
+
#=========================================================================
|
183
|
+
def r_prec
|
184
|
+
gamma = ((10.556403 + \
|
185
|
+
(0.4932044 + \
|
186
|
+
(-0.00031238 + \
|
187
|
+
(-0.000002788 + \
|
188
|
+
(0.0000000260) \
|
189
|
+
* @jc) * @jc) * @jc) * @jc) * @jc) * Const::AS2R
|
190
|
+
phi = (84381.406000 + \
|
191
|
+
( -46.811015 + \
|
192
|
+
( 0.0511269 + \
|
193
|
+
( 0.00053289 + \
|
194
|
+
( -0.000000440 + \
|
195
|
+
( -0.0000000176) \
|
196
|
+
* @jc) * @jc) * @jc) * @jc) * @jc) * Const::AS2R
|
197
|
+
psi = (( 5038.481507 + \
|
198
|
+
( 1.5584176 + \
|
199
|
+
( -0.00018522 + \
|
200
|
+
( -0.000026452 + \
|
201
|
+
( -0.0000000148) \
|
202
|
+
* @jc) * @jc) * @jc) * @jc) * @jc) * Const::AS2R
|
203
|
+
r = r_z(gamma)
|
204
|
+
r = r_x(phi, r)
|
205
|
+
r = r_z(-psi, r)
|
206
|
+
r = r_x(-@eps, r)
|
207
|
+
return r
|
208
|
+
rescue => e
|
209
|
+
raise
|
210
|
+
end
|
211
|
+
|
212
|
+
#=========================================================================
|
213
|
+
# nutation(章動)変換行列
|
214
|
+
#
|
215
|
+
# @param: <none>
|
216
|
+
# @return: r (変換行列)
|
217
|
+
#=========================================================================
|
218
|
+
def r_nut
|
219
|
+
dpsi_ls, deps_ls = compute_lunisolar
|
220
|
+
dpsi_pl, deps_pl = compute_planetary
|
221
|
+
dpsi, deps = dpsi_ls + dpsi_pl, deps_ls + deps_pl
|
222
|
+
r = r_z(-dpsi)
|
223
|
+
r = r_x(-deps, r)
|
224
|
+
return r
|
225
|
+
rescue => e
|
226
|
+
raise
|
227
|
+
end
|
228
|
+
|
229
|
+
#=========================================================================
|
230
|
+
# 日月章動(luni-solar nutation)の計算
|
231
|
+
#
|
232
|
+
# @param: <none>
|
233
|
+
# @return: [dpsi_ls, deps_ls]
|
234
|
+
#=========================================================================
|
235
|
+
def compute_lunisolar
|
236
|
+
dp, de = 0.0, 0.0
|
237
|
+
|
238
|
+
begin
|
239
|
+
l = compute_l_iers2003(@jc)
|
240
|
+
lp = compute_lp_mhb2000(@jc)
|
241
|
+
f = compute_f_iers2003(@jc)
|
242
|
+
d = compute_d_mhb2000(@jc)
|
243
|
+
om = compute_om_iers2003(@jc)
|
244
|
+
Const::NUT_LS.reverse.each do |x|
|
245
|
+
arg = (x[0] * l + x[1] * lp + x[2] * f +
|
246
|
+
x[3] * d + x[4] * om) % Const::PI2
|
247
|
+
sarg, carg = Math.sin(arg), Math.cos(arg)
|
248
|
+
dp += (x[5] + x[6] * @jc) * sarg + x[ 7] * carg
|
249
|
+
de += (x[8] + x[9] * @jc) * carg + x[10] * sarg
|
250
|
+
end
|
251
|
+
return [dp * Const::U2R, de * Const::U2R]
|
252
|
+
rescue => e
|
253
|
+
raise
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
#=========================================================================
|
258
|
+
# 惑星章動(planetary nutation)
|
259
|
+
#
|
260
|
+
# @param: <none>
|
261
|
+
# @return: [dpsi_pl, deps_pl]
|
262
|
+
#=========================================================================
|
263
|
+
def compute_planetary
|
264
|
+
dp, de = 0.0, 0.0
|
265
|
+
|
266
|
+
begin
|
267
|
+
l = compute_l_mhb2000(@jc)
|
268
|
+
f = compute_f_mhb2000(@jc)
|
269
|
+
d = compute_d_mhb2000_2(@jc)
|
270
|
+
om = compute_om_mhb2000(@jc)
|
271
|
+
pa = compute_pa_iers2003(@jc)
|
272
|
+
lme = compute_lme_iers2003(@jc)
|
273
|
+
lve = compute_lve_iers2003(@jc)
|
274
|
+
lea = compute_lea_iers2003(@jc)
|
275
|
+
lma = compute_lma_iers2003(@jc)
|
276
|
+
lju = compute_lju_iers2003(@jc)
|
277
|
+
lsa = compute_lsa_iers2003(@jc)
|
278
|
+
lur = compute_lur_iers2003(@jc)
|
279
|
+
lne = compute_lne_mhb2000(@jc)
|
280
|
+
Const::NUT_PL.reverse.each do |x|
|
281
|
+
arg = (x[ 0] * l + x[ 2] * f + x[ 3] * d + x[ 4] * om +
|
282
|
+
x[ 5] * lme + x[ 6] * lve + x[ 7] * lea + x[ 8] * lma +
|
283
|
+
x[ 9] * lju + x[10] * lsa + x[11] * lur + x[12] * lne +
|
284
|
+
x[13] * pa) % Const::PI2
|
285
|
+
sarg, carg = Math.sin(arg), Math.cos(arg)
|
286
|
+
dp += x[14] * sarg + x[15] * carg
|
287
|
+
de += x[16] * sarg + x[17] * carg
|
288
|
+
end
|
289
|
+
return [dp * Const::U2R, de * Const::U2R]
|
290
|
+
rescue => e
|
291
|
+
raise
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
#=========================================================================
|
296
|
+
# Mean anomaly of the Moon (IERS 2003)
|
297
|
+
#
|
298
|
+
# @param: jc (ユリウス世紀)
|
299
|
+
# @return: longitude (rad)
|
300
|
+
#=========================================================================
|
301
|
+
def compute_l_iers2003(jc)
|
302
|
+
return (( 485868.249036 + \
|
303
|
+
(1717915923.2178 + \
|
304
|
+
( 31.8792 + \
|
305
|
+
( 0.051635 + \
|
306
|
+
( -0.00024470) \
|
307
|
+
* jc) * jc) * jc) * jc) % Const::TURNAS) * Const::AS2R
|
308
|
+
rescue => e
|
309
|
+
raise
|
310
|
+
end
|
311
|
+
|
312
|
+
#=========================================================================
|
313
|
+
# Mean anomaly of the Sun (MHB2000)
|
314
|
+
#
|
315
|
+
# @param: jc (ユリウス世紀)
|
316
|
+
# @return: longitude (rad)
|
317
|
+
#=========================================================================
|
318
|
+
def compute_lp_mhb2000(jc)
|
319
|
+
return (( 1287104.79305 + \
|
320
|
+
(129596581.0481 + \
|
321
|
+
( -0.5532 + \
|
322
|
+
( 0.000136 + \
|
323
|
+
( -0.00001149) \
|
324
|
+
* jc) * jc) * jc) * jc) % Const::TURNAS) * Const::AS2R
|
325
|
+
rescue => e
|
326
|
+
raise
|
327
|
+
end
|
328
|
+
|
329
|
+
#=========================================================================
|
330
|
+
# Mean longitude of the Moon minus that of the ascending node (IERS 2003)
|
331
|
+
#
|
332
|
+
# @param: jc (ユリウス世紀)
|
333
|
+
# @return: longitude (rad)
|
334
|
+
#=========================================================================
|
335
|
+
def compute_f_iers2003(jc)
|
336
|
+
return (( 335779.526232 + \
|
337
|
+
(1739527262.8478 + \
|
338
|
+
( -12.7512 + \
|
339
|
+
( -0.001037 + \
|
340
|
+
( 0.00000417) \
|
341
|
+
* jc) * jc) * jc) * jc) % Const::TURNAS) * Const::AS2R
|
342
|
+
rescue => e
|
343
|
+
raise
|
344
|
+
end
|
345
|
+
|
346
|
+
#=========================================================================
|
347
|
+
# Mean elongation of the Moon from the Sun (MHB2000)
|
348
|
+
#
|
349
|
+
# @param: jc (ユリウス世紀)
|
350
|
+
# @return: longitude (rad)
|
351
|
+
#=========================================================================
|
352
|
+
def compute_d_mhb2000(jc)
|
353
|
+
return (( 1072260.70369 + \
|
354
|
+
(1602961601.2090 + \
|
355
|
+
( -6.3706 + \
|
356
|
+
( 0.006593 + \
|
357
|
+
( -0.00003169) \
|
358
|
+
* jc) * jc) * jc) * jc) % Const::TURNAS) * Const::AS2R
|
359
|
+
rescue => e
|
360
|
+
raise
|
361
|
+
end
|
362
|
+
|
363
|
+
#=========================================================================
|
364
|
+
# Mean longitude of the ascending node of the Moon (IERS 2003)
|
365
|
+
#
|
366
|
+
# @param: jc (ユリウス世紀)
|
367
|
+
# @return: longitude (rad)
|
368
|
+
#=========================================================================
|
369
|
+
def compute_om_iers2003(jc)
|
370
|
+
return (( 450160.398036 + \
|
371
|
+
(-6962890.5431 + \
|
372
|
+
( 7.4722 + \
|
373
|
+
( 0.007702 + \
|
374
|
+
( -0.00005939) \
|
375
|
+
* jc) * jc) * jc) * jc) % Const::TURNAS) * Const::AS2R
|
376
|
+
rescue => e
|
377
|
+
raise
|
378
|
+
end
|
379
|
+
|
380
|
+
#=========================================================================
|
381
|
+
# Mean anomaly of the Moon (MHB2000)
|
382
|
+
#
|
383
|
+
# @param: jc (ユリウス世紀)
|
384
|
+
# @return: longitude (rad)
|
385
|
+
#=========================================================================
|
386
|
+
def compute_l_mhb2000(jc)
|
387
|
+
return (2.35555598 + 8328.6914269554 * jc) % Const::PI2
|
388
|
+
rescue => e
|
389
|
+
raise
|
390
|
+
end
|
391
|
+
|
392
|
+
#=========================================================================
|
393
|
+
# Mean longitude of the Moon minus that of the ascending node (MHB2000)
|
394
|
+
#
|
395
|
+
# @param: jc (ユリウス世紀)
|
396
|
+
# @return: longitude (rad)
|
397
|
+
#=========================================================================
|
398
|
+
def compute_f_mhb2000(jc)
|
399
|
+
return (1.627905234 + 8433.466158131 * jc) % Const::PI2
|
400
|
+
rescue => e
|
401
|
+
raise
|
402
|
+
end
|
403
|
+
|
404
|
+
#=========================================================================
|
405
|
+
# Mean elongation of the Moon from the Sun (MHB2000)
|
406
|
+
#
|
407
|
+
# @param: jc (ユリウス世紀)
|
408
|
+
# @return: longitude (rad)
|
409
|
+
#=========================================================================
|
410
|
+
def compute_d_mhb2000_2(jc)
|
411
|
+
return (5.198466741 + 7771.3771468121 * jc) % Const::PI2
|
412
|
+
rescue => e
|
413
|
+
raise
|
414
|
+
end
|
415
|
+
|
416
|
+
#=========================================================================
|
417
|
+
# Mean longitude of the ascending node of the Moon (MHB2000)
|
418
|
+
#
|
419
|
+
# @param: jc (ユリウス世紀)
|
420
|
+
# @return: longitude (rad)
|
421
|
+
#=========================================================================
|
422
|
+
def compute_om_mhb2000(jc)
|
423
|
+
return (2.18243920 - 33.757045 * jc) % Const::PI2
|
424
|
+
rescue => e
|
425
|
+
raise
|
426
|
+
end
|
427
|
+
|
428
|
+
#=========================================================================
|
429
|
+
# General accumulated precession in longitude (IERS 2003)
|
430
|
+
#
|
431
|
+
# @param: jc (ユリウス世紀)
|
432
|
+
# @return: longitude (rad)
|
433
|
+
#=========================================================================
|
434
|
+
def compute_pa_iers2003(jc)
|
435
|
+
return (0.024381750 + 0.00000538691 * jc) * jc
|
436
|
+
rescue => e
|
437
|
+
raise
|
438
|
+
end
|
439
|
+
|
440
|
+
#=========================================================================
|
441
|
+
# Mercury longitudes (IERS 2003)
|
442
|
+
#
|
443
|
+
# @param: jc (ユリウス世紀)
|
444
|
+
# @return: longitude (rad)
|
445
|
+
#=========================================================================
|
446
|
+
def compute_lme_iers2003(jc)
|
447
|
+
return (4.402608842 + 2608.7903141574 * jc) % Const::PI2
|
448
|
+
rescue => e
|
449
|
+
raise
|
450
|
+
end
|
451
|
+
|
452
|
+
#=========================================================================
|
453
|
+
# Venus longitudes (IERS 2003)
|
454
|
+
#
|
455
|
+
# @param: jc (ユリウス世紀)
|
456
|
+
# @return: longitude (rad)
|
457
|
+
#=========================================================================
|
458
|
+
def compute_lve_iers2003(jc)
|
459
|
+
return (3.176146697 + 1021.3285546211 * jc) % Const::PI2
|
460
|
+
rescue => e
|
461
|
+
raise
|
462
|
+
end
|
463
|
+
|
464
|
+
#=========================================================================
|
465
|
+
# Earth longitudes (IERS 2003)
|
466
|
+
#
|
467
|
+
# @param: jc (ユリウス世紀)
|
468
|
+
# @return: longitude (rad)
|
469
|
+
#=========================================================================
|
470
|
+
def compute_lea_iers2003(jc)
|
471
|
+
return (1.753470314 + 628.3075849991 * jc) % Const::PI2
|
472
|
+
rescue => e
|
473
|
+
raise
|
474
|
+
end
|
475
|
+
|
476
|
+
#=========================================================================
|
477
|
+
# Mars longitudes (IERS 2003)
|
478
|
+
#
|
479
|
+
# @param: jc (ユリウス世紀)
|
480
|
+
# @return: longitude (rad)
|
481
|
+
#=========================================================================
|
482
|
+
def compute_lma_iers2003(jc)
|
483
|
+
return (6.203480913 + 334.0612426700 * jc) % Const::PI2
|
484
|
+
rescue => e
|
485
|
+
raise
|
486
|
+
end
|
487
|
+
|
488
|
+
#=========================================================================
|
489
|
+
# Jupiter longitudes (IERS 2003)
|
490
|
+
#
|
491
|
+
# @param: jc (ユリウス世紀)
|
492
|
+
# @return: longitude (rad)
|
493
|
+
#=========================================================================
|
494
|
+
def compute_lju_iers2003(jc)
|
495
|
+
return (0.599546497 + 52.9690962641 * jc) % Const::PI2
|
496
|
+
rescue => e
|
497
|
+
raise
|
498
|
+
end
|
499
|
+
|
500
|
+
#=========================================================================
|
501
|
+
# Saturn longitudes (IERS 2003)
|
502
|
+
#
|
503
|
+
# @param: jc (ユリウス世紀)
|
504
|
+
# @return: longitude (rad)
|
505
|
+
#=========================================================================
|
506
|
+
def compute_lsa_iers2003(jc)
|
507
|
+
return (0.874016757 + 21.3299104960 * jc) % Const::PI2
|
508
|
+
rescue => e
|
509
|
+
raise
|
510
|
+
end
|
511
|
+
|
512
|
+
#=========================================================================
|
513
|
+
# Uranus longitudes (IERS 2003)
|
514
|
+
#
|
515
|
+
# @param: jc (ユリウス世紀)
|
516
|
+
# @return: longitude (rad)
|
517
|
+
#=========================================================================
|
518
|
+
def compute_lur_iers2003(jc)
|
519
|
+
return (5.481293872 + 7.4781598567 * jc) % Const::PI2
|
520
|
+
rescue => e
|
521
|
+
raise
|
522
|
+
end
|
523
|
+
|
524
|
+
#=========================================================================
|
525
|
+
# Neptune longitude (MHB2000)
|
526
|
+
#
|
527
|
+
# @param: jc (ユリウス世紀)
|
528
|
+
# @return: longitude (rad)
|
529
|
+
#=========================================================================
|
530
|
+
def compute_lne_mhb2000(jc)
|
531
|
+
return (5.321159000 + 3.8127774000 * jc) % Const::PI2
|
532
|
+
rescue => e
|
533
|
+
raise
|
534
|
+
end
|
535
|
+
|
536
|
+
#=========================================================================
|
537
|
+
# 回転行列(x 軸中心)
|
538
|
+
#
|
539
|
+
# @param: phi (回転量(rad))
|
540
|
+
# @param: r (回転行列)
|
541
|
+
# @return: r_a (回転後)
|
542
|
+
#=========================================================================
|
543
|
+
def r_x(phi, r = Const::R_UNIT)
|
544
|
+
r_a = Array.new
|
545
|
+
|
546
|
+
begin
|
547
|
+
s, c = Math.sin(phi), Math.cos(phi)
|
548
|
+
a10 = c * r[1][0] + s * r[2][0]
|
549
|
+
a11 = c * r[1][1] + s * r[2][1]
|
550
|
+
a12 = c * r[1][2] + s * r[2][2]
|
551
|
+
a20 = - s * r[1][0] + c * r[2][0]
|
552
|
+
a21 = - s * r[1][1] + c * r[2][1]
|
553
|
+
a22 = - s * r[1][2] + c * r[2][2]
|
554
|
+
r_a << r[0]
|
555
|
+
r_a << [a10, a11, a12]
|
556
|
+
r_a << [a20, a21, a22]
|
557
|
+
return r_a
|
558
|
+
rescue => e
|
559
|
+
raise
|
560
|
+
end
|
561
|
+
end
|
562
|
+
|
563
|
+
#=========================================================================
|
564
|
+
# 回転行列(y 軸中心)
|
565
|
+
#
|
566
|
+
# @param: theta (回転量(rad))
|
567
|
+
# @param: r (回転行列)
|
568
|
+
# @return: r_a (回転後)
|
569
|
+
#=========================================================================
|
570
|
+
def r_y(theta, r = Const::R_UNIT)
|
571
|
+
r_a = Array.new
|
572
|
+
|
573
|
+
begin
|
574
|
+
s, c = Math.sin(theta), Math.cos(theta)
|
575
|
+
a00 = c * r[0][0] - s * r[2][0]
|
576
|
+
a01 = c * r[0][1] - s * r[2][1]
|
577
|
+
a02 = c * r[0][2] - s * r[2][2]
|
578
|
+
a20 = s * r[0][0] + c * r[2][0]
|
579
|
+
a21 = s * r[0][1] + c * r[2][1]
|
580
|
+
a22 = s * r[0][2] + c * r[2][2]
|
581
|
+
r_a << [a00, a01, a02]
|
582
|
+
r_a << r[1]
|
583
|
+
r_a << [a20, a21, a22]
|
584
|
+
return r_a
|
585
|
+
rescue => e
|
586
|
+
raise
|
587
|
+
end
|
588
|
+
end
|
589
|
+
|
590
|
+
#=========================================================================
|
591
|
+
# 回転行列(z 軸中心)
|
592
|
+
#
|
593
|
+
# @param: psi (回転量(rad))
|
594
|
+
# @param: r (回転行列)
|
595
|
+
# @return: r_a (回転後)
|
596
|
+
#=========================================================================
|
597
|
+
def r_z(psi, r = Const::R_UNIT)
|
598
|
+
r_a = Array.new
|
599
|
+
|
600
|
+
begin
|
601
|
+
s, c = Math.sin(psi), Math.cos(psi)
|
602
|
+
a00 = c * r[0][0] + s * r[1][0];
|
603
|
+
a01 = c * r[0][1] + s * r[1][1];
|
604
|
+
a02 = c * r[0][2] + s * r[1][2];
|
605
|
+
a10 = - s * r[0][0] + c * r[1][0];
|
606
|
+
a11 = - s * r[0][1] + c * r[1][1];
|
607
|
+
a12 = - s * r[0][2] + c * r[1][2];
|
608
|
+
r_a << [a00, a01, a02]
|
609
|
+
r_a << [a10, a11, a12]
|
610
|
+
r_a << r[2]
|
611
|
+
return r_a
|
612
|
+
rescue => e
|
613
|
+
raise
|
614
|
+
end
|
615
|
+
end
|
616
|
+
|
617
|
+
#=========================================================================
|
618
|
+
# 座標回転
|
619
|
+
#
|
620
|
+
# @param: r (回転行列)
|
621
|
+
# @param: pos (回転前直角座標)
|
622
|
+
# @return: pos_r (回転後直角座標)
|
623
|
+
#=========================================================================
|
624
|
+
def rotate(r, pos)
|
625
|
+
return (0..2).map do |i|
|
626
|
+
(0..2).inject(0) { |sum, j| sum + r[i][j] * pos[j] }
|
627
|
+
end
|
628
|
+
rescue => e
|
629
|
+
raise
|
630
|
+
end
|
631
|
+
end
|
632
|
+
end
|
633
|
+
|