qreki 0.0.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f6e6bd51a0862bec54fb4d7078510cbba715e1c9
4
+ data.tar.gz: 5b490e907a36872febae4aacd0e29066987e758a
5
+ SHA512:
6
+ metadata.gz: ab4c508d1a71f35e3517864d00831f27662e83f686ca88d0c1080f09b6f6991d8e6431a495559a3fd6d76c5c0903dedfb22c66a624f53ae61fceaca0409fec90
7
+ data.tar.gz: 98c9122c02627a49982447326387f7ec7386d703685b038e33d0cf11b0850603534eb1f10f2f375977375cad80b6d157f326686b8388baac6a417900f1d1d061
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in qreki.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,29 @@
1
+ Copyright (c) 1993,1994 H.Takano
2
+
3
+ QRSAMP
4
+ Coded by H.Takano (C)1993,1994
5
+ http://www.vector.co.jp/soft/dos/personal/se016093.html
6
+
7
+
8
+ Copyright (c) 2013 Masaki Ozawa
9
+
10
+ MIT License
11
+
12
+ Permission is hereby granted, free of charge, to any person obtaining
13
+ a copy of this software and associated documentation files (the
14
+ "Software"), to deal in the Software without restriction, including
15
+ without limitation the rights to use, copy, modify, merge, publish,
16
+ distribute, sublicense, and/or sell copies of the Software, and to
17
+ permit persons to whom the Software is furnished to do so, subject to
18
+ the following conditions:
19
+
20
+ The above copyright notice and this permission notice shall be
21
+ included in all copies or substantial portions of the Software.
22
+
23
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
27
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
28
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
29
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # Qreki
2
+
3
+ This is the gem which calculates the old calendar "qreki".
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'qreki'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install qreki
18
+
19
+ ## Usage
20
+
21
+ >> qreki = Qreki.calc(2013,11,7)
22
+ >> qreki.year # 2013
23
+ >> qreki.uruu # false
24
+ >> qreki.month # 10
25
+ >> qreki.day # 5
26
+ >> qreki.rokuyou # "友引"
27
+ >> qreki.sekki # "立冬"
28
+
29
+ ## Contributing
30
+
31
+ 1. Fork it
32
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
33
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
34
+ 4. Push to the branch (`git push origin my-new-feature`)
35
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,3 @@
1
+ module Qreki
2
+ VERSION = "0.0.2"
3
+ end
data/lib/qreki.rb ADDED
@@ -0,0 +1,641 @@
1
+ require "qreki/version"
2
+
3
+ # =========================================================================
4
+ # Based on 「旧暦計算サンプルプログラム」
5
+ # Copyright (C) 1993,1994 by H.Takano
6
+ # http://www.vector.co.jp/soft/dos/personal/se016093.html
7
+ # =========================================================================
8
+
9
+ module Qreki
10
+
11
+ class Qrk
12
+ attr_accessor :year, :uruu, :month, :day, :rokuyou, :sekki
13
+ end
14
+
15
+ $k = Math::PI / 180.0 # Pi
16
+ $tz = - (9.0 / 24.0) # タイムゾーンオフセット
17
+ $rm_sun0 = 0 # 太陽黄経
18
+
19
+ #=========================================================================
20
+ # 旧暦算出
21
+ #
22
+ # 引数  .... 日付
23
+ # 戻り値
24
+ # q.year : 旧暦年
25
+ # q.uruu : 平月/閏月 flag .... 平月:false 閏月:true
26
+ # q.month : 旧暦月
27
+ # q.day : 旧暦日
28
+ # q.rokuyou : 六曜
29
+ # q.sekki : 二十四節気
30
+ #=========================================================================
31
+ def self.calc(year, month, day)
32
+ return calc_from_date(Date.new(year, month, day))
33
+ end
34
+
35
+ def self.calc_from_date(tm)
36
+ array = calc_kyureki(tm.year, tm.month, tm.day)
37
+ qreki = Qrk.new
38
+ qreki.year = array[0]
39
+ qreki.uruu = array[1]
40
+ qreki.month = array[2]
41
+ qreki.day = array[3]
42
+ qreki.rokuyou = rokuyou(tm.year, tm.month, tm.day)
43
+ qreki.sekki = sekki(tm.year, tm.month, tm.day)
44
+ return qreki
45
+ end
46
+
47
+ # =========================================================================
48
+ # 新暦に対応する、旧暦を求める。
49
+ #
50
+ # 呼び出し時にセットする変数:
51
+ # year : 計算する年(JSTユリウス日)
52
+ # mon : 計算する月(JSTユリウス日)
53
+ # day : 計算する日(JSTユリウス日)
54
+ # 戻り値:
55
+ # this.year : 旧暦年
56
+ # this.uruu : 平月/閏月 flag .... 平月:false 閏月:true
57
+ # this.month : 旧暦月
58
+ # this.day : 旧暦日
59
+ # =========================================================================
60
+ def self.calc_kyureki(year, mon, day)
61
+
62
+ chu = Array.new(5, [])
63
+ m = Array.new(5).map{Array.new(3,0)}
64
+ saku = Array.new
65
+ kyureki = Array.new
66
+
67
+ tm = ymdt2jd(year, mon, day, 0, 0, 0)
68
+
69
+ # -----------------------------------------------------------------------
70
+ # 計算対象の直前にあたる二分二至の時刻を求める
71
+ # -----------------------------------------------------------------------
72
+ chu[0] = calc_chu(tm, 90)
73
+
74
+ # -----------------------------------------------------------------------
75
+ # 上で求めた二分二至の時の太陽黄経をもとに朔日行列の先頭に月名をセット
76
+ # -----------------------------------------------------------------------
77
+ m[0][0] = ( $rm_sun0 / 30.0 ).to_i + 2
78
+
79
+ # -----------------------------------------------------------------------
80
+ # 中気の時刻を計算(3回計算する)
81
+ # chu[i]:中気の時刻
82
+ # -----------------------------------------------------------------------
83
+ (1..3).each do |i|
84
+ chu[i] = calc_chu(chu[i - 1] + 32, 30)
85
+ end
86
+ # -----------------------------------------------------------------------
87
+ # 計算対象の直前にあたる二分二至の直前の朔の時刻を求める
88
+ # -----------------------------------------------------------------------
89
+ saku[0] = calc_saku(chu[0])
90
+
91
+ # -----------------------------------------------------------------------
92
+ # 朔の時刻を求める
93
+ # -----------------------------------------------------------------------
94
+ (1..4).each do |i|
95
+ saku[i] = calc_saku(saku[i - 1] + 30)
96
+ # 前と同じ時刻を計算した場合(両者の差が26日以内)には、初期値を
97
+ # +33日にして再実行させる。
98
+ if (saku[i - 1].to_i.abs - saku[i].to_i) <= 26
99
+ saku[i] = calc_saku(saku[i - 1] + 35)
100
+ end
101
+ end
102
+
103
+ # -----------------------------------------------------------------------
104
+ # saku[1]が二分二至の時刻以前になってしまった場合には、朔をさかのぼり過ぎ
105
+ # たと考えて、朔の時刻を繰り下げて修正する。
106
+ # その際、計算もれ(saku[4])になっている部分を補うため、朔の時刻を計算
107
+ # する。(近日点通過の近辺で朔があると起こる事があるようだ...?)
108
+ # -----------------------------------------------------------------------
109
+ if saku[1].to_i <= chu[0].to_i
110
+ (0..4).each do |i|
111
+ saku[i] = saku[i + 1]
112
+ end
113
+ saku[4] = calc_saku(saku[3] + 35)
114
+
115
+ # -----------------------------------------------------------------------
116
+ # saku[0]が二分二至の時刻以後になってしまった場合には、朔をさかのぼり足
117
+ # りないと見て、朔の時刻を繰り上げて修正する。
118
+ # その際、計算もれ(saku[0])になっている部分を補うため、朔の時刻を計算
119
+ # する。(春分点の近辺で朔があると起こる事があるようだ...?)
120
+ # -----------------------------------------------------------------------
121
+ elsif saku[0].to_i > chu[0].to_i
122
+ [4,3,2,1].each do |i|
123
+ saku[i] = saku[i - 1]
124
+ end
125
+ saku[0] = calc_saku(saku[0] - 27)
126
+ end
127
+
128
+ # -----------------------------------------------------------------------
129
+ # 閏月検索Flagセット
130
+ # (節月で4ヶ月の間に朔が5回あると、閏月がある可能性がある。)
131
+ # lap=false:平月 lap=true:閏月
132
+ # -----------------------------------------------------------------------
133
+ lap = (saku[4].to_i <= chu[3].to_i)
134
+
135
+ # -----------------------------------------------------------------------
136
+ # 朔日行列の作成
137
+ # m[i][0] ... 月名(1:正月 2:2月 3:3月 ....)
138
+ # m[i][1] .... 閏フラグ(false:平月 true:閏月)
139
+ # m[i][2] ...... 朔日のjd
140
+ # -----------------------------------------------------------------------
141
+ m[0][1] = false
142
+ m[0][2] = saku[0].to_i
143
+ (1..4).each do |i|
144
+ if lap && i > 1
145
+ if (chu[i - 1] <= saku[i - 1].to_i) || (chu[i - 1] >= saku[i].to_i)
146
+ m[i-1][0] = m[i-2][0]
147
+ m[i-1][1] = true
148
+ m[i-1][2] = saku[i - 1].to_i
149
+ lap = false
150
+ end
151
+ end
152
+ m[i][0] = m[i-1][0] + 1
153
+ m[i][0] -= 12 if m[i][0] > 12
154
+ m[i][2] = saku[i].to_i
155
+ m[i][1] = false
156
+ end
157
+
158
+ # -----------------------------------------------------------------------
159
+ # 朔日行列から旧暦を求める。
160
+ # -----------------------------------------------------------------------
161
+ state = 0
162
+ i_tmp = 0
163
+ (1..4).each do |i|
164
+ i_tmp = i
165
+ if tm.to_i < m[i][2].to_i
166
+ state = 1
167
+ break
168
+ elsif tm.to_i == m[i][2].to_i
169
+ state = 2
170
+ break
171
+ end
172
+ end
173
+ i_tmp -= 1 if state == 0 || state == 1
174
+ i = i_tmp
175
+
176
+ kyureki[1] = m[i][1]
177
+ kyureki[2] = m[i][0]
178
+ kyureki[3] = tm.to_i - m[i][2].to_i + 1
179
+
180
+ # -----------------------------------------------------------------------
181
+ # 旧暦年の計算
182
+ # (旧暦月が10以上でかつ新暦月より大きい場合には、
183
+ # まだ年を越していないはず...)
184
+ # -----------------------------------------------------------------------
185
+ a = jd2ymdt(tm)
186
+ kyureki[0] = a[0]
187
+ if kyureki[2] > 9 && kyureki[2] > a[1]
188
+ kyureki[0] -= 1
189
+ end
190
+
191
+ return [kyureki[0], kyureki[1], kyureki[2], kyureki[3]]
192
+ end
193
+
194
+ # =========================================================================
195
+ # 直前の二分二至/中気の時刻を求める
196
+ #
197
+ # パラメータ
198
+ # tm ............ 計算基準となる時刻(JSTユリウス日)
199
+ # longitude ..... 求める対象(90:二分二至,30:中気))
200
+ # 戻り値
201
+ # 求めた時刻(JSTユリウス日)を返す。
202
+ # グローバル変数 $rm_sun0 に、その時の太陽黄経をセットする。
203
+ #
204
+ # ※ 引数、戻り値ともユリウス日で表し、時分秒は日の小数で表す。
205
+ # 力学時とユリウス日との補正時刻=0.0secと仮定
206
+ # =========================================================================
207
+ def self.calc_chu(tm, longitude)
208
+ # -----------------------------------------------------------------------
209
+ # 時刻引数を小数部と整数部とに分解する(精度を上げるため)
210
+ # -----------------------------------------------------------------------
211
+ tm1 = tm.to_i
212
+ tm2 = tm - tm1 + $tz # JST -> UTC
213
+
214
+ # -----------------------------------------------------------------------
215
+ # 直前の二分二至の黄経 λsun0 を求める
216
+ # -----------------------------------------------------------------------
217
+ t = (tm2 + 0.5) / 36525.0 + (tm1 - 2451545.0) / 36525.0
218
+ rm_sun = longitude_sun(t)
219
+ $rm_sun0 = longitude * (rm_sun / longitude.to_f).to_i
220
+
221
+ # -----------------------------------------------------------------------
222
+ # 繰り返し計算によって直前の二分二至の時刻を計算する
223
+ # (誤差が±1.0 sec以内になったら打ち切る。)
224
+ # -----------------------------------------------------------------------
225
+ delta_t1 ||= 0.0
226
+ delta_t2 ||= 1.0
227
+
228
+ while (delta_t1 + delta_t2).abs > (1.0 / 86400.0)
229
+ # -------------------------------------------------------------------
230
+ # λsun(t) を計算
231
+ # t = (tm + .5 - 2451545) / 36525;
232
+ # -------------------------------------------------------------------
233
+ t = (tm2 + 0.5) / 36525.0 + (tm1 - 2451545.0) / 36525.0
234
+ rm_sun = longitude_sun(t)
235
+
236
+ # -------------------------------------------------------------------
237
+ # 黄経差 Δλ=λsun -λsun0
238
+ # -------------------------------------------------------------------
239
+ delta_rm = rm_sun - $rm_sun0
240
+
241
+ # -------------------------------------------------------------------
242
+ # Δλの引き込み範囲(±180°)を逸脱した場合には、補正を行う
243
+ # -------------------------------------------------------------------
244
+ if delta_rm > 180.0
245
+ delta_rm -= 360.0
246
+ elsif delta_rm < -180.0
247
+ delta_rm += 360.0
248
+ end
249
+
250
+ # -------------------------------------------------------------------
251
+ # 時刻引数の補正値 Δt
252
+ # delta_t = delta_rm * 365.2 / 360;
253
+ # -------------------------------------------------------------------
254
+ delta_t1 = (delta_rm * 365.2 / 360.0).to_i
255
+ delta_t2 = (delta_rm * 365.2 / 360.0) - delta_t1
256
+
257
+ # -------------------------------------------------------------------
258
+ # 時刻引数の補正
259
+ # tm -= delta_t;
260
+ # -------------------------------------------------------------------
261
+ tm1 = tm1 - delta_t1
262
+ tm2 = tm2 - delta_t2
263
+ if tm2 < 0
264
+ tm1 -= 1.0
265
+ tm2 += 1.0
266
+ end
267
+ end
268
+
269
+ # -----------------------------------------------------------------------
270
+ # 戻り値の作成
271
+ # 時刻引数を合成し、戻り値(JSTユリウス日)とする
272
+ # -----------------------------------------------------------------------
273
+ return tm2 + tm1 - $tz
274
+ end
275
+
276
+ # =========================================================================
277
+ # 直前の朔の時刻を求める
278
+ #
279
+ # 呼び出し時にセットする変数
280
+ # tm ........ 計算基準の時刻(JSTユリウス日)
281
+ # 戻り値
282
+ # 朔の時刻
283
+ #
284
+ # ※ 引数、戻り値ともJSTユリウス日で表し、時分秒は日の小数で表す。
285
+ # 力学時とユリウス日との補正時刻=0.0secと仮定
286
+ # =========================================================================
287
+ def self.calc_saku(tm)
288
+ # -----------------------------------------------------------------------
289
+ # ループカウンタのセット
290
+ # -----------------------------------------------------------------------
291
+ lc = 1
292
+
293
+ # -----------------------------------------------------------------------
294
+ # 時刻引数を小数部と整数部とに分解する(精度を上げるため)
295
+ # -----------------------------------------------------------------------
296
+ tm1 = tm.to_i
297
+ tm2 = tm - tm1 + $tz # JST -> UTC
298
+
299
+ # -----------------------------------------------------------------------
300
+ # 繰り返し計算によって朔の時刻を計算する
301
+ # (誤差が±1.0 sec以内になったら打ち切る。)
302
+ # -----------------------------------------------------------------------
303
+ delta_t1 ||= 0.0
304
+ delta_t2 ||= 1.0
305
+
306
+ while ( delta_t1 + delta_t2 ).abs > ( 1.0 / 86400.0 )
307
+ lc += 1
308
+
309
+ # -------------------------------------------------------------------
310
+ # 太陽の黄経λsun(t) ,月の黄経λmoon(t) を計算
311
+ # t = (tm + .5 - 2451545) / 36525;
312
+ # -------------------------------------------------------------------
313
+ t = (tm2 + 0.5) / 36525.0 + (tm1 - 2451545.0) / 36525.0
314
+ rm_sun = longitude_sun(t)
315
+ rm_moon = longitude_moon(t)
316
+
317
+ # -------------------------------------------------------------------
318
+ # 月と太陽の黄経差Δλ
319
+ # Δλ=λmoon-λsun
320
+ # -------------------------------------------------------------------
321
+ delta_rm = rm_moon - rm_sun
322
+
323
+ # -------------------------------------------------------------------
324
+ # ループの1回目(lc=1)で delta_rm < 0 の場合には引き込み範囲に
325
+ # 入るように補正する
326
+ # -------------------------------------------------------------------
327
+ if lc==1 && delta_rm < 0
328
+ delta_rm = normalization_angle(delta_rm)
329
+ # -------------------------------------------------------------------
330
+ # 春分の近くで朔がある場合(0 ≦λsun≦ 20)で、
331
+ # 月の黄経λmoon≧300 の場合には、
332
+ # Δλ= 360 - Δλ と計算して補正する
333
+ # -------------------------------------------------------------------
334
+ elsif rm_sun >= 0 && rm_sun <= 20 && rm_moon >= 300
335
+ delta_rm = normalization_angle(delta_rm)
336
+ delta_rm = 360 - delta_rm
337
+ # -------------------------------------------------------------------
338
+ # Δλの引き込み範囲(±40°)を逸脱した場合には、補正を行う
339
+ # -------------------------------------------------------------------
340
+ elsif delta_rm.abs > 40
341
+ delta_rm = normalization_angle(delta_rm)
342
+ end
343
+
344
+ # -------------------------------------------------------------------
345
+ # 時刻引数の補正値 Δt
346
+ # delta_t = delta_rm * 29.530589 / 360;
347
+ # -------------------------------------------------------------------
348
+ delta_t1 = ( delta_rm * 29.530589 / 360.0 ).to_i
349
+ delta_t2 = ( delta_rm * 29.530589 / 360.0 ) - delta_t1
350
+
351
+ # -------------------------------------------------------------------
352
+ # 時刻引数の補正
353
+ # tm -= delta_t;
354
+ # -------------------------------------------------------------------
355
+ tm1 = tm1 - delta_t1
356
+ tm2 = tm2 - delta_t2
357
+ if( tm2 < 0 )
358
+ tm1 -= 1.0
359
+ tm2 += 1.0
360
+ end
361
+
362
+ # -------------------------------------------------------------------
363
+ # ループ回数が15回になったら、初期値 tm を tm-26 とする。
364
+ # -------------------------------------------------------------------
365
+ if( lc == 15 && (delta_t1 + delta_t2).abs > (1 / 86400.0) )
366
+ tm1 = (tm - 26).to_i
367
+ tm2 = 0
368
+ # -------------------------------------------------------------------
369
+ # 初期値を補正したにも関わらず、振動を続ける場合には初期値を答えとし
370
+ # て返して強制的にループを抜け出して異常終了させる。
371
+ # -------------------------------------------------------------------
372
+ elsif( lc > 30 && (delta_t1 + delta_t2).abs > (1 / 86400.0) )
373
+ tm1 = tm
374
+ tm2 = 0
375
+ break
376
+ end
377
+ end
378
+
379
+ # -----------------------------------------------------------------------
380
+ # 戻り値の作成
381
+ # 時刻引数を合成し、戻り値(ユリウス日)とする
382
+ # -----------------------------------------------------------------------
383
+ return tm2 + tm1 - $tz
384
+ end
385
+
386
+ # =========================================================================
387
+ # 角度の正規化を行う。すなわち引数の範囲を 0≦θ<360 にする。
388
+ # =========================================================================
389
+ def self.normalization_angle(angle)
390
+ if angle >= 0.0
391
+ return angle - 360.0 * ( angle / 360.0 ).to_i
392
+ else
393
+ return 360.0 + angle - 360.0 * ( angle / 360.0 ).to_i
394
+ end
395
+ end
396
+
397
+ # =========================================================================
398
+ # 太陽の黄経 λsun(t) を計算する(t は力学時)
399
+ # =========================================================================
400
+ def self.longitude_sun(t)
401
+ # -----------------------------------------------------------------------
402
+ # 摂動項の計算
403
+ # -----------------------------------------------------------------------
404
+ th = 0.0004 * Math.cos( $k * normalization_angle( 31557.0 * t + 161.0 ) )
405
+ th += 0.0004 * Math.cos( $k * normalization_angle( 29930.0 * t + 48.0 ) )
406
+ th += 0.0005 * Math.cos( $k * normalization_angle( 2281.0 * t + 221.0 ) )
407
+ th += 0.0005 * Math.cos( $k * normalization_angle( 155.0 * t + 118.0 ) )
408
+ th += 0.0006 * Math.cos( $k * normalization_angle( 33718.0 * t + 316.0 ) )
409
+ th += 0.0007 * Math.cos( $k * normalization_angle( 9038.0 * t + 64.0 ) )
410
+ th += 0.0007 * Math.cos( $k * normalization_angle( 3035.0 * t + 110.0 ) )
411
+ th += 0.0007 * Math.cos( $k * normalization_angle( 65929.0 * t + 45.0 ) )
412
+ th += 0.0013 * Math.cos( $k * normalization_angle( 22519.0 * t + 352.0 ) )
413
+ th += 0.0015 * Math.cos( $k * normalization_angle( 45038.0 * t + 254.0 ) )
414
+ th += 0.0018 * Math.cos( $k * normalization_angle( 445267.0 * t + 208.0 ) )
415
+ th += 0.0018 * Math.cos( $k * normalization_angle( 19.0 * t + 159.0 ) )
416
+ th += 0.0020 * Math.cos( $k * normalization_angle( 32964.0 * t + 158.0 ) )
417
+ th += 0.0200 * Math.cos( $k * normalization_angle( 71998.1 * t + 265.1 ) )
418
+ th -= 0.0048 * Math.cos( $k * normalization_angle( 35999.05 * t + 267.52 ) ) * t
419
+ th += 1.9147 * Math.cos( $k * normalization_angle( 35999.05 * t + 267.52 ) )
420
+
421
+ # -----------------------------------------------------------------------
422
+ # 比例項の計算
423
+ # -----------------------------------------------------------------------
424
+ ang = normalization_angle( 36000.7695 * t )
425
+ ang = normalization_angle( ang + 280.4659 )
426
+ th = normalization_angle( th + ang )
427
+
428
+ return th
429
+ end
430
+
431
+ # =========================================================================
432
+ # 月の黄経 λmoon(t) を計算する(t は力学時)
433
+ # =========================================================================
434
+ def self.longitude_moon(t)
435
+ # -----------------------------------------------------------------------
436
+ # 摂動項の計算
437
+ # -----------------------------------------------------------------------
438
+ th = 0.0003 * Math.cos( $k * normalization_angle( 2322131.0 * t + 191.0 ) )
439
+ th += 0.0003 * Math.cos( $k * normalization_angle( 4067.0 * t + 70.0 ) )
440
+ th += 0.0003 * Math.cos( $k * normalization_angle( 549197.0 * t + 220.0 ) )
441
+ th += 0.0003 * Math.cos( $k * normalization_angle( 1808933.0 * t + 58.0 ) )
442
+ th += 0.0003 * Math.cos( $k * normalization_angle( 349472.0 * t + 337.0 ) )
443
+ th += 0.0003 * Math.cos( $k * normalization_angle( 381404.0 * t + 354.0 ) )
444
+ th += 0.0003 * Math.cos( $k * normalization_angle( 958465.0 * t + 340.0 ) )
445
+ th += 0.0004 * Math.cos( $k * normalization_angle( 12006.0 * t + 187.0 ) )
446
+ th += 0.0004 * Math.cos( $k * normalization_angle( 39871.0 * t + 223.0 ) )
447
+ th += 0.0005 * Math.cos( $k * normalization_angle( 509131.0 * t + 242.0 ) )
448
+ th += 0.0005 * Math.cos( $k * normalization_angle( 1745069.0 * t + 24.0 ) )
449
+ th += 0.0005 * Math.cos( $k * normalization_angle( 1908795.0 * t + 90.0 ) )
450
+ th += 0.0006 * Math.cos( $k * normalization_angle( 2258267.0 * t + 156.0 ) )
451
+ th += 0.0006 * Math.cos( $k * normalization_angle( 111869.0 * t + 38.0 ) )
452
+ th += 0.0007 * Math.cos( $k * normalization_angle( 27864.0 * t + 127.0 ) )
453
+ th += 0.0007 * Math.cos( $k * normalization_angle( 485333.0 * t + 186.0 ) )
454
+ th += 0.0007 * Math.cos( $k * normalization_angle( 405201.0 * t + 50.0 ) )
455
+ th += 0.0007 * Math.cos( $k * normalization_angle( 790672.0 * t + 114.0 ) )
456
+ th += 0.0008 * Math.cos( $k * normalization_angle( 1403732.0 * t + 98.0 ) )
457
+ th += 0.0009 * Math.cos( $k * normalization_angle( 858602.0 * t + 129.0 ) )
458
+ th += 0.0011 * Math.cos( $k * normalization_angle( 1920802.0 * t + 186.0 ) )
459
+ th += 0.0012 * Math.cos( $k * normalization_angle( 1267871.0 * t + 249.0 ) )
460
+ th += 0.0016 * Math.cos( $k * normalization_angle( 1856938.0 * t + 152.0 ) )
461
+ th += 0.0018 * Math.cos( $k * normalization_angle( 401329.0 * t + 274.0 ) )
462
+ th += 0.0021 * Math.cos( $k * normalization_angle( 341337.0 * t + 16.0 ) )
463
+ th += 0.0021 * Math.cos( $k * normalization_angle( 71998.0 * t + 85.0 ) )
464
+ th += 0.0021 * Math.cos( $k * normalization_angle( 990397.0 * t + 357.0 ) )
465
+ th += 0.0022 * Math.cos( $k * normalization_angle( 818536.0 * t + 151.0 ) )
466
+ th += 0.0023 * Math.cos( $k * normalization_angle( 922466.0 * t + 163.0 ) )
467
+ th += 0.0024 * Math.cos( $k * normalization_angle( 99863.0 * t + 122.0 ) )
468
+ th += 0.0026 * Math.cos( $k * normalization_angle( 1379739.0 * t + 17.0 ) )
469
+ th += 0.0027 * Math.cos( $k * normalization_angle( 918399.0 * t + 182.0 ) )
470
+ th += 0.0028 * Math.cos( $k * normalization_angle( 1934.0 * t + 145.0 ) )
471
+ th += 0.0037 * Math.cos( $k * normalization_angle( 541062.0 * t + 259.0 ) )
472
+ th += 0.0038 * Math.cos( $k * normalization_angle( 1781068.0 * t + 21.0 ) )
473
+ th += 0.0040 * Math.cos( $k * normalization_angle( 133.0 * t + 29.0 ) )
474
+ th += 0.0040 * Math.cos( $k * normalization_angle( 1844932.0 * t + 56.0 ) )
475
+ th += 0.0040 * Math.cos( $k * normalization_angle( 1331734.0 * t + 283.0 ) )
476
+ th += 0.0050 * Math.cos( $k * normalization_angle( 481266.0 * t + 205.0 ) )
477
+ th += 0.0052 * Math.cos( $k * normalization_angle( 31932.0 * t + 107.0 ) )
478
+ th += 0.0068 * Math.cos( $k * normalization_angle( 926533.0 * t + 323.0 ) )
479
+ th += 0.0079 * Math.cos( $k * normalization_angle( 449334.0 * t + 188.0 ) )
480
+ th += 0.0085 * Math.cos( $k * normalization_angle( 826671.0 * t + 111.0 ) )
481
+ th += 0.0100 * Math.cos( $k * normalization_angle( 1431597.0 * t + 315.0 ) )
482
+ th += 0.0107 * Math.cos( $k * normalization_angle( 1303870.0 * t + 246.0 ) )
483
+ th += 0.0110 * Math.cos( $k * normalization_angle( 489205.0 * t + 142.0 ) )
484
+ th += 0.0125 * Math.cos( $k * normalization_angle( 1443603.0 * t + 52.0 ) )
485
+ th += 0.0154 * Math.cos( $k * normalization_angle( 75870.0 * t + 41.0 ) )
486
+ th += 0.0304 * Math.cos( $k * normalization_angle( 513197.9 * t + 222.5 ) )
487
+ th += 0.0347 * Math.cos( $k * normalization_angle( 445267.1 * t + 27.9 ) )
488
+ th += 0.0409 * Math.cos( $k * normalization_angle( 441199.8 * t + 47.4 ) )
489
+ th += 0.0458 * Math.cos( $k * normalization_angle( 854535.2 * t + 148.2 ) )
490
+ th += 0.0533 * Math.cos( $k * normalization_angle( 1367733.1 * t + 280.7 ) )
491
+ th += 0.0571 * Math.cos( $k * normalization_angle( 377336.3 * t + 13.2 ) )
492
+ th += 0.0588 * Math.cos( $k * normalization_angle( 63863.5 * t + 124.2 ) )
493
+ th += 0.1144 * Math.cos( $k * normalization_angle( 966404.0 * t + 276.5 ) )
494
+ th += 0.1851 * Math.cos( $k * normalization_angle( 35999.05 * t + 87.53 ) )
495
+ th += 0.2136 * Math.cos( $k * normalization_angle( 954397.74 * t + 179.93 ) )
496
+ th += 0.6583 * Math.cos( $k * normalization_angle( 890534.22 * t + 145.7 ) )
497
+ th += 1.2740 * Math.cos( $k * normalization_angle( 413335.35 * t + 10.74 ) )
498
+ th += 6.2888 * Math.cos( $k * normalization_angle( 477198.868 * t + 44.963) )
499
+
500
+ #-----------------------------------------------------------------------
501
+ # 比例項の計算
502
+ #-----------------------------------------------------------------------
503
+ ang = normalization_angle( 481267.8809 * t )
504
+ ang = normalization_angle( ang + 218.3162 )
505
+ th = normalization_angle( th + ang )
506
+
507
+ return th
508
+ end
509
+
510
+ #=========================================================================
511
+ # 年月日、時分秒(世界時)からユリウス日(JD)を計算する
512
+ #
513
+ # ※ この関数では、グレゴリオ暦法による年月日から求めるものである。
514
+ # (ユリウス暦法による年月日から求める場合には使用できない。)
515
+ #=========================================================================
516
+ def self.ymdt2jd(year, mon, day, hour, min, sec)
517
+ if mon < 3
518
+ year -= 1
519
+ mon += 12
520
+ end
521
+
522
+ jd = ( 365.25 * year ).to_i
523
+ jd += ( year / 400.0 ).to_i
524
+ jd -= ( year / 100.0 ).to_i
525
+ jd += ( 30.59 * ( mon - 2 ) ).to_i
526
+ jd += 1721088
527
+ jd += day
528
+
529
+ t = sec / 3600.0
530
+ t += min / 60.0
531
+ t += hour
532
+ t = t / 24.0
533
+
534
+ jd += t
535
+
536
+ return jd
537
+ end
538
+
539
+ #=========================================================================
540
+ # ユリウス日(JD)から年月日、時分秒(世界時)を計算する
541
+ #
542
+ # 戻り値の配列TIME[]の内訳
543
+ # TIME[0] ... 年 TIME[1] ... 月 TIME[2] ... 日
544
+ # TIME[3] ... 時 TIME[4] ... 分 TIME[5] ... 秒
545
+ #
546
+ # ※ この関数で求めた年月日は、グレゴリオ暦法によって表されている。
547
+ #
548
+ #=========================================================================
549
+ def self.jd2ymdt(jd)
550
+ time = []
551
+
552
+ x0 = ( jd + 68570.0 ).to_i
553
+ x1 = ( x0 / 36524.25 ).to_i
554
+ x2 = x0 - ( 36524.25 * x1 + 0.75 ).to_i
555
+ x3 = ( ( x2+1 ) / 365.2425 ).to_i
556
+ x4 = x2 - ( 365.25 * x3 ).to_i + 31.0
557
+ x5 = ( x4.to_i / 30.59 ).to_i
558
+ x6 = ( x5.to_i / 11.0 ).to_i
559
+
560
+ time[2] = x4 - ( 30.59 * x5 ).to_i
561
+ time[1] = x5 - 12 * x6 + 2
562
+ time[0] = 100 * ( x1 - 49 ) + x3 + x6
563
+
564
+ if time[1] == 2 && time[2] > 28
565
+ if time[0] % 100 == 0 && time[0] % 400 == 0
566
+ time[2] = 29
567
+ elsif time[0] % 4 ==0
568
+ time[2]=29
569
+ else
570
+ time[2]=28
571
+ end
572
+ end
573
+
574
+ tm = 86400.0 * ( jd - jd.to_i )
575
+ time[3] = ( tm / 3600.0 ).to_i
576
+ time[4] = ( (tm - 3600.0 * time[3] ) / 60.0 ).to_i
577
+ time[5] = ( tm - 3600.0 * time[3] - 60 * time[4] ).to_i
578
+
579
+ return time
580
+ end
581
+
582
+ #=========================================================================
583
+ # 六曜算出関数
584
+ #
585
+ # 引数  .... 計算対象となる年月日 $year $mon $day
586
+ # 戻り値 .... 六曜 (大安 赤口 先勝 友引 先負 仏滅)
587
+ #=========================================================================
588
+ def self.rokuyou(year, mon, day)
589
+ rokuyou = %w(大安 赤口 先勝 友引 先負 仏滅)
590
+
591
+ q_yaer, uruu, q_mon, q_day = calc_kyureki(year, mon, day)
592
+
593
+ return rokuyou[ (q_mon + q_day) % 6 ]
594
+ end
595
+
596
+ #=========================================================================
597
+ # 今日が24節気かどうか調べる
598
+ #
599
+ # 引数  .... 計算対象となる年月日 $year $mon $day
600
+ # 戻り値 .... 24節気の名称
601
+ #=========================================================================
602
+ def self.sekki(year, mon, day)
603
+ #-----------------------------------------------------------------------
604
+ # 24節気の定義
605
+ #-----------------------------------------------------------------------
606
+ sekki24 = %w(春分 清明 穀雨 立夏 小満 芒種 夏至 小暑 大暑 立秋 処暑 白露
607
+ 秋分 寒露 霜降 立冬 小雪 大雪 冬至 小寒 大寒 立春 雨水 啓蟄)
608
+
609
+ tm = ymdt2jd(year, mon, day, 0, 0, 0)
610
+
611
+ #-----------------------------------------------------------------------
612
+ # 時刻引数を分解する
613
+ #-----------------------------------------------------------------------
614
+ tm1 = tm.to_i
615
+ tm2 = tm - tm1
616
+ tm2 -= 9.0 / 24.0
617
+ t = (tm2 + 0.5) / 36525.0 + (tm1 - 2451545.0) / 36525.0
618
+
619
+ #今日の太陽の黄経
620
+ rm_sun_today = longitude_sun(t)
621
+
622
+ tm += 1
623
+ tm1 = tm.to_i
624
+ tm2 = tm - tm1
625
+ tm2 -= 9.0 / 24.0
626
+ t = (tm2 + 0.5) / 36525.0 + (tm1 - 2451545.0) / 36525.0
627
+
628
+ # 明日の太陽の黄経
629
+ rm_sun_tommorow = longitude_sun(t)
630
+
631
+ #
632
+ rm_sun_today0 = 15.0 * (rm_sun_today / 15.0).to_i
633
+ rm_sun_tommorow0 = 15.0 * (rm_sun_tommorow / 15.0).to_i
634
+
635
+ if rm_sun_today0 != rm_sun_tommorow0
636
+ return sekki24[rm_sun_tommorow0 / 15]
637
+ else
638
+ return ''
639
+ end
640
+ end
641
+ end
data/qreki.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'qreki/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "qreki"
8
+ spec.version = Qreki::VERSION
9
+ spec.authors = ["Masaki Ozawa"]
10
+ spec.email = ["ozamasa123@gmail.com"]
11
+ spec.description = %q{qreki}
12
+ spec.summary = %q{qreki}
13
+ spec.homepage = "https://github.com/ozamasa/qreki"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ end
@@ -0,0 +1,51 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+ require 'qreki'
4
+
5
+ describe Qreki do
6
+ before do
7
+ # 2013,11,1 # => 2013,false,9,28
8
+ # 2014,11,1 # => 2014,true, 9,9
9
+ # 2014,3,30 # => 2014,false,2,30
10
+ end
11
+
12
+ it "should calc eql 2013,11,1 => 2013,false,9,28 赤口" do
13
+ @q = Qreki.calc(2013,11,1)
14
+ @q.year.should eql 2013
15
+ @q.uruu.should eql false
16
+ @q.month.should eql 9
17
+ @q.day.should eql 28
18
+ @q.rokuyou.should eql "赤口"
19
+ @q.sekki.should eql ""
20
+ end
21
+
22
+ it "should calc eql 2014,11,1 => 2014,true, 9,9 大安" do
23
+ @q = Qreki.calc(2014,11,1)
24
+ @q.year.should eql 2014
25
+ @q.uruu.should eql true
26
+ @q.month.should eql 9
27
+ @q.day.should eql 9
28
+ @q.rokuyou.should eql "大安"
29
+ @q.sekki.should eql ""
30
+ end
31
+
32
+ it "should calc eql 2014,3,30 => 2014,false,2,30" do
33
+ @q = Qreki.calc(2014,3,30) # => 2014,false,2,30
34
+ @q.year.should eql 2014
35
+ @q.uruu.should eql false
36
+ @q.month.should eql 2
37
+ @q.day.should eql 30
38
+ @q.rokuyou.should eql "先勝"
39
+ @q.sekki.should eql ""
40
+ end
41
+
42
+ it "should calc_from_date eql 2013,11,7 => 2013,false,10,5" do
43
+ @q = Qreki.calc_from_date(Date.new(2013,11,7))
44
+ @q.year.should eql 2013
45
+ @q.uruu.should eql false
46
+ @q.month.should eql 10
47
+ @q.day.should eql 5
48
+ @q.rokuyou.should eql "友引"
49
+ @q.sekki.should eql "立冬"
50
+ end
51
+ end
@@ -0,0 +1,3 @@
1
+ # encoding: utf-8
2
+ require 'rubygems'
3
+ require 'qreki'
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: qreki
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.2
5
+ platform: ruby
6
+ authors:
7
+ - Masaki Ozawa
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-11-14 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: qreki
42
+ email:
43
+ - ozamasa123@gmail.com
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - .gitignore
49
+ - Gemfile
50
+ - LICENSE.txt
51
+ - README.md
52
+ - Rakefile
53
+ - lib/qreki.rb
54
+ - lib/qreki/version.rb
55
+ - qreki.gemspec
56
+ - spec/qreki_spec.rb
57
+ - spec/spec_helper.rb
58
+ homepage: https://github.com/ozamasa/qreki
59
+ licenses:
60
+ - MIT
61
+ metadata: {}
62
+ post_install_message:
63
+ rdoc_options: []
64
+ require_paths:
65
+ - lib
66
+ required_ruby_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - '>='
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ requirements: []
77
+ rubyforge_project:
78
+ rubygems_version: 2.0.3
79
+ signing_key:
80
+ specification_version: 4
81
+ summary: qreki
82
+ test_files:
83
+ - spec/qreki_spec.rb
84
+ - spec/spec_helper.rb