zakuro 0.8.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +38 -160
- data/VERSION +1 -1
- data/doc/condition.md +36 -0
- data/doc/dropped_date.md +41 -0
- data/doc/expection.md +108 -0
- data/doc/operation/csv/month.csv +100 -79
- data/doc/operation/operation.xlsx +0 -0
- data/doc/usage.md +120 -0
- data/doc/vanished_date.md +86 -0
- data/doc/version/daien.md +163 -0
- data/doc/version/genka.md +116 -0
- data/doc/version/gihou.md +172 -0
- data/doc/version/section/common_post_process.md +60 -0
- data/doc/version/section/common_pre_process.md +185 -0
- data/doc/version/section/const.md +45 -0
- data/doc/version/section/decimal.md +101 -0
- data/doc/version/section/lunisolar_calendar.md +55 -0
- data/doc/version/section/senmyou_november_1st.md +41 -0
- data/{lib/zakuro/version/senmyou/README.md → doc/version/senmyou.md} +15 -168
- data/lib/zakuro/calculation/cycle/abstract_remainder.rb +58 -0
- data/lib/zakuro/calculation/monthly/first_day.rb +9 -1
- data/lib/zakuro/calculation/option/vanished_date/abstract_parameter.rb +40 -0
- data/lib/zakuro/calculation/option/vanished_date/location.rb +84 -0
- data/lib/zakuro/calculation/range/medieval_annual_range.rb +5 -3
- data/lib/zakuro/calculation/range/transfer/gengou_scroller.rb +1 -0
- data/lib/zakuro/calculation/stella/lunar/abstract_location.rb +6 -2
- data/lib/zakuro/calculation/stella/lunar/choukei_value.rb +14 -0
- data/lib/zakuro/calculation/summary/internal/option.rb +59 -4
- data/lib/zakuro/context/option.rb +17 -0
- data/lib/zakuro/context/version_class_resolver.rb +17 -1
- data/lib/zakuro/operation/yaml/month.yaml +955 -281
- data/lib/zakuro/result/data/option/vanished_date/calculation.rb +45 -0
- data/lib/zakuro/result/data/option/vanished_date/option.rb +47 -0
- data/lib/zakuro/result/data/single_day.rb +2 -0
- data/lib/zakuro/version/daien/const/number.rb +2 -0
- data/lib/zakuro/version/daien/const/remainder.rb +7 -2
- data/lib/zakuro/version/daien/cycle/remainder.rb +38 -20
- data/lib/zakuro/version/daien/monthly/lunar_phase.rb +2 -4
- data/lib/zakuro/version/daien/option/dropped_date/parameter.rb +5 -3
- data/lib/zakuro/version/daien/option/vanished_date/parameter.rb +33 -0
- data/lib/zakuro/version/daien/stella/lunar/location.rb +5 -8
- data/lib/zakuro/version/genka/cycle/remainder.rb +6 -2
- data/lib/zakuro/version/genka/monthly/lunar_phase.rb +14 -3
- data/lib/zakuro/version/genka/option/vanished_date/parameter.rb +31 -0
- data/lib/zakuro/version/gihou/const/remainder.rb +1 -5
- data/lib/zakuro/version/gihou/cycle/remainder.rb +0 -26
- data/lib/zakuro/version/gihou/monthly/lunar_phase.rb +2 -4
- data/lib/zakuro/version/gihou/option/vanished_date/parameter.rb +31 -0
- data/lib/zakuro/version/gihou/stella/lunar/location.rb +5 -8
- data/lib/zakuro/version/senmyou/const/number.rb +3 -1
- data/lib/zakuro/version/senmyou/const/remainder.rb +3 -0
- data/lib/zakuro/version/senmyou/cycle/remainder.rb +17 -34
- data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +5 -5
- data/lib/zakuro/version/senmyou/option/vanished_date/parameter.rb +33 -0
- data/lib/zakuro/version/senmyou/stella/lunar/location.rb +6 -8
- data/lib/zakuro/version/senmyou/stella/lunar/value.rb +9 -0
- metadata +24 -3
@@ -10,117 +10,19 @@
|
|
10
10
|
|
11
11
|
宣明暦は太陰太陽暦である
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
私たち現代の日本人が使うグレゴリオ暦は太陽暦である
|
16
|
-
|
17
|
-
太陽暦は `年` を太陽に対する公転周期、 `日` を地球の自転周期で求める
|
18
|
-
|
19
|
-
太陰太陽暦はそれに加えて、`月` を月の満ち欠けの周期(朔望月)に合わせる
|
20
|
-
|
21
|
-
本来この `年` と `月` の周期には何らかの関連性はなく、暦の側で辻褄合わせする必要がある
|
22
|
-
|
23
|
-
(今回は触れないが、メトン周期はこのような辻褄合わせの一つである)
|
24
|
-
|
25
|
-
`年` の太陽年は約365.24日、 `月` の1朔望月は約29.5日である
|
26
|
-
|
27
|
-
1朔望月 * 12 = 354日であり、 1太陽年には常に約11日ほど満たないことになる
|
28
|
-
|
29
|
-
古代中国人はこれを12ヶ月の平年(353/354/355/356日)と、13ヶ月の閏年(383/384/385日)で解決した
|
30
|
-
|
31
|
-
問題は1年に含まれる朔望月のそれぞれを1月、2月...などと位置付けるのか
|
32
|
-
|
33
|
-
これを理解するために、元弘元年-元弘2年を例にする
|
34
|
-
|
35
|
-
![太陽と月](../../../../images/太陽と月.png)
|
36
|
-
|
37
|
-
「定朔」は月の始まりを示す
|
38
|
-
|
39
|
-
毎月1日の始まりであり、ここから次の月までは1朔望月かかる
|
40
|
-
|
41
|
-
具体的に言えば、朔月(新月)-> 上弦 -> 望月(満月) -> 下弦 -> 次の朔月(新月)と約29.5日かけて移り変わる
|
42
|
-
|
43
|
-
下の「黄経」は(地球から見える)太陽の位置を示し、360度で1太陽年が経過する
|
44
|
-
|
45
|
-
この黄経15度ごとに名前が与えられており、これを「二十四節気」と呼ぶ
|
46
|
-
|
47
|
-
宣明暦ではこの定朔の範囲にどの二十四節気が含まれるかを計算し、中気に対応する月名を与えている
|
48
|
-
|
49
|
-
11月を例に取ると、「3-2240」と「33-6480」の間には大雪(「13-4659」)と冬至(「28-6495」)が含まれている
|
50
|
-
|
51
|
-
この大余小余(xx-xxxx)の表現を細かくは説明しないが、とりあえずは左側の数字だけ見ていただければ良い
|
52
|
-
|
53
|
-
この冬至は11月の中気であり、これが含まれている1朔望月を「11月」と呼ぶ
|
54
|
-
|
55
|
-
次に閏2月を例に取ると、中気が一つも含まれていないことが分かる
|
56
|
-
|
57
|
-
「1-329」と「30-4043」の間には節気しかない
|
58
|
-
|
59
|
-
これを閏月と呼び、これが含まれる元弘3年は13ヶ月ある閏年になる
|
60
|
-
|
61
|
-
このように、太陰太陽暦では太陽の位置を24分割し、月の所属を明らかにする方法を取っている
|
13
|
+
詳細は [太陰太陽暦](./section/lunisolar_calendar.md) に記載してある
|
62
14
|
|
63
15
|
# 計算
|
64
16
|
|
65
17
|
計算にあたって、暦共通の計算と、宣明暦固有の計算がある
|
66
18
|
|
67
|
-
|
68
|
-
|
69
|
-
その上で宣明暦固有の計算を説明することとする
|
70
|
-
|
71
|
-
## 共通の計算
|
72
|
-
|
73
|
-
これから記すことは原則として実装の問題であり、計算手順そのものは特定の資料に依拠するものではない
|
74
|
-
|
75
|
-
『日本暦日原典』と同等の計算結果を出すためには、暦法編(同p.491〜)だけでは不十分であり、元号年の求め方など他に求めるべき項目がある
|
76
|
-
|
77
|
-
これはそれらを補完するための手順となる
|
78
|
-
|
79
|
-
### 計算の流れ
|
80
|
-
|
81
|
-
正慶1年の日数を出すための流れを図示する
|
82
|
-
|
83
|
-
![各月の求め方](../../../../images/各月の求め方.png)
|
84
|
-
|
85
|
-
最後の「355日」を出すためには、月ごとの日数を出す必要がある
|
86
|
-
|
87
|
-
月ごとの日数は定朔によって得られるが、それは経朔を補正することで得られる
|
88
|
-
|
89
|
-
この図の正慶1年は宣明暦に属するため、定朔まで求める必要がある
|
90
|
-
|
91
|
-
11月定朔に必要な「経朔」「入定気(二十四節気)」「月の進退」は冬至計算で求められる
|
92
|
-
|
93
|
-
従って、まずは各年の冬至を求めなければならない
|
94
|
-
|
95
|
-
計算の多くはそれぞれの暦に依存するが、まずは共通の計算部分を列挙する
|
96
|
-
|
97
|
-
### 元号の求め方
|
98
|
-
|
99
|
-
元慶(877-6-1 ~ 885-3-10)をもとに考える
|
19
|
+
暦共通の計算は前処理/後処理として説明する
|
100
20
|
|
101
|
-
|
21
|
+
その間に宣明暦固有の計算を説明することとする
|
102
22
|
|
103
|
-
|
23
|
+
## 共通前処理
|
104
24
|
|
105
|
-
|
106
|
-
|
107
|
-
もし元慶2年以降を計算したい場合は、Aの西暦開始日から該当年月日までを加算で求める
|
108
|
-
|
109
|
-
具体的には、和暦上の月の大小(29日 or 30日)を用いた加算となる
|
110
|
-
|
111
|
-
念のため補足するが、西暦(太陽暦)のように1年あたりの日数は一定しない
|
112
|
-
|
113
|
-
平年(353/354/355/356)または閏年(383/384/385)のパターンがあり、月の大小(29/30)や閏月(中気のない月)の有無で変動する
|
114
|
-
|
115
|
-
したがって、2年目以降を加算なしに特定することはできない
|
116
|
-
|
117
|
-
### 南北朝について
|
118
|
-
|
119
|
-
南北朝による元号の並立がある(正慶1年 / 元弘2年)
|
120
|
-
|
121
|
-
このような場合、元号は早くから始まったほうを基準に計算しなければならない(正慶 よりは 元弘 の方が一年早い)
|
122
|
-
|
123
|
-
並立は最大でも2つであり、並びは『日本暦日原典』に従う
|
25
|
+
詳細は [共通前処理](./section/common_pre_process.md) に記載してある
|
124
26
|
|
125
27
|
## 宣明暦固有の計算
|
126
28
|
|
@@ -140,9 +42,6 @@
|
|
140
42
|
4. 11月の月の進退を進めて12月の月の進退を求める
|
141
43
|
5. 12月の月の進退から月の運動の補正値を求める
|
142
44
|
6. 太陽・月の運動の補正値から12月定朔(補正後の月初日)を求める
|
143
|
-
3. 1ヶ月ごとの固有値を求める
|
144
|
-
1. 月の大小を求める
|
145
|
-
2. 二十四節気の所属を求める
|
146
45
|
|
147
46
|
1の計算方法は『日本暦日原典』p.511-516に依拠する
|
148
47
|
|
@@ -228,7 +127,7 @@
|
|
228
127
|
|
229
128
|
前提として、11月の朔日は二十四節気の小雪〜大雪、または大雪〜冬至の範囲内にある
|
230
129
|
|
231
|
-
![入定気の起算](
|
130
|
+
![入定気の起算](../../images/入定気の起算.png)
|
232
131
|
|
233
132
|
上記はp.513の第五図を参考の上、下記の変更を加えている
|
234
133
|
|
@@ -243,6 +142,8 @@ a: `大雪定数` (14-5235.5) - `天正閏余`
|
|
243
142
|
|
244
143
|
b: `小雪定数` (14-4235.5) - ( `天正閏余` - `大雪定数` (14-5235.5))
|
245
144
|
|
145
|
+
( これは不完全な計算である。詳細は [宣明暦の11月朔日計算](./section/senmyou_november_1st.md) を参照のこと)
|
146
|
+
|
246
147
|
慶安3年(1650年)の `天正閏余` (18-6867) はbのパターンであり、以下のように計算できる
|
247
148
|
|
248
149
|
18-6867 - 14-5235.5 = 4-2631.3
|
@@ -377,6 +278,8 @@ NOTE: 後述の表が遠地点始まりで地球に向かって進み、近地
|
|
377
278
|
|
378
279
|
前回の結果(2-2446.665)を求めるに当たり、`暦中日(暦周の半分)` で減算したが、この場合は 進退列の`退` を見ることになる
|
379
280
|
|
281
|
+
まずは前回結果の小余を [小数点](./section/decimal.md) に従って切り捨て、 大余 2 、小余 2446 とする
|
282
|
+
|
380
283
|
次に大余に相当する入暦列、小余に相当する小余列を確認し、損益率 -726 / 眺朒積 -830 を引き当てる
|
381
284
|
|
382
285
|
( `損益率` (-726) * `小余` (2446) ) / `統法(1日)` (8400) = -211 ... 余り -3396
|
@@ -409,7 +312,7 @@ NOTE: 後述の表が遠地点始まりで地球に向かって進み、近地
|
|
409
312
|
|
410
313
|
なお、太陽・月の運動の補正値を求めるくだりは、「安藤有益著『再考長慶宣明暦算法』 について」p.89-90 を参考にする
|
411
314
|
|
412
|
-
![各月の求め方](
|
315
|
+
![各月の求め方](../../images/各月の求め方.png)
|
413
316
|
|
414
317
|
再掲する形になるが、流れについては上記の図を参考にしてほしい
|
415
318
|
|
@@ -454,7 +357,7 @@ NOTE: 後述の表が遠地点始まりで地球に向かって進み、近地
|
|
454
357
|
|
455
358
|
12月以降を求めたい場合は、上記の定数を二十四節気の並びに合わせて順次使用する
|
456
359
|
|
457
|
-
![12月以降の入定気](
|
360
|
+
![12月以降の入定気](../../images/12月以降の入定気.png)
|
458
361
|
|
459
362
|
12月経朔の入定気は、上図のように弦を4回足して得られる
|
460
363
|
|
@@ -486,7 +389,7 @@ NOTE: 後述の表が遠地点始まりで地球に向かって進み、近地
|
|
486
389
|
|
487
390
|
次に12月経朔に対応する月の進退を求める
|
488
391
|
|
489
|
-
![12月以降の月の進退](
|
392
|
+
![12月以降の月の進退](../../images/12月以降の月の進退.png)
|
490
393
|
|
491
394
|
基本的な求め方は太陽の時と変わらない
|
492
395
|
|
@@ -522,70 +425,14 @@ NOTE: 後述の表が遠地点始まりで地球に向かって進み、近地
|
|
522
425
|
つまり、以下により12月定朔は確定する
|
523
426
|
|
524
427
|
21-6780 + 大余1 = 22-6780
|
428
|
+
## 共通後処理
|
525
429
|
|
526
|
-
|
527
|
-
|
528
|
-
これまでは定朔を求めてきたが、この定朔をもとに月ごとの固有値を求める
|
529
|
-
|
530
|
-
この計算は当月と次月の定朔を必要とするため、例として11月定朔/12月定朔を使うことにする
|
531
|
-
|
532
|
-
#### 月の大小を求める
|
533
|
-
|
534
|
-
太陰太陽暦において1ヶ月の日数は29日または30日である
|
535
|
-
|
536
|
-
求め方は『日本暦日原典』凡例のp.6を参照した
|
537
|
-
|
538
|
-
これを求める上で、朔日の大余(1日を示す単位)を比較する
|
539
|
-
|
540
|
-
例えば、 11月の朔日(定朔)が 52-2655 で、 12月の朔日(定朔)が 22-6780 の場合、52 と 22 を取り出し、 差分が10で割り切れるかを検証する
|
541
|
-
|
542
|
-
52 - 22 = 30 は10で割り切れるため、これは11月は大の月(30日)である
|
543
|
-
|
544
|
-
もし割り切れない場合(差分が29の場合)は小の月(29日)である
|
545
|
-
|
546
|
-
なお、引用元では定朔の干支から求めているが、干支の元ネタが大余のため、実装の容易さから上記のような解説となった
|
547
|
-
|
548
|
-
#### 二十四節気の所属を求める
|
549
|
-
|
550
|
-
その月が何月であるかは二十四節気の中気にあることはすでに述べた通りである
|
551
|
-
|
552
|
-
ここでは中気節気と月を対応させることにする
|
553
|
-
|
554
|
-
求め方だがこれは確たる引用元がない
|
555
|
-
|
556
|
-
『日本暦日原典』においても同著者の「宣明暦に関する研究」に遡っても言及がなかった
|
557
|
-
|
558
|
-
ただし以下のようにすれば『日本暦日原典』通りに求めることができる
|
559
|
-
|
560
|
-
11月定朔を求める時に、前年冬至として 11-2730 を求めていた
|
561
|
-
|
562
|
-
また、 `気策(24分の1年)` (15-1835.5) が定義されており、二十四節気のそれぞれの間隔が固定値であることが分かる
|
563
|
-
|
564
|
-
つまり、 `前年冬至` (11-2730) + `気策(24分の1年)` (15-1835.5) = `小寒` (26-4565.5) ≒ 26-4565
|
565
|
-
|
566
|
-
結果から秒は省略する(切り捨てる)
|
567
|
-
|
568
|
-
これを繰り返すことで二十四節気それぞれの値を得ることができる
|
569
|
-
|
570
|
-
もし前年冬至〜当年冬至まで処理を繰り返す場合は、単に24個分を求めるというよりは、
|
571
|
-
前年大雪(前年冬至 - 気策)、当年冬至、当年小寒まで求めておいた方が良い
|
572
|
-
|
573
|
-
こうして得られた二十四節気を11月から順に比較していく
|
574
|
-
|
575
|
-
11月を例に取ると、 11月定朔( 52-2655 ) <= 二十四節気 < 12月定朔(22-6780) である
|
576
|
-
|
577
|
-
すでに言及した通り大余は60で一巡して0になるため、範囲計算はそれを考慮して行う必要がある
|
578
|
-
|
579
|
-
11月には前年大雪( 56-894 )と前年冬至( 11-2730 )が含まれているため、これが11月の中気/節気(取り上げた順番に従うと 節気/中気)となる
|
580
|
-
|
581
|
-
以上の手続きで『日本暦日原典』通りの結果が得られる
|
430
|
+
詳細は [共通後処理](./section/common_post_process.md) に記載してある
|
582
431
|
|
583
432
|
# 結語
|
584
433
|
|
585
434
|
暦共通・宣明暦の暦算は以上である
|
586
435
|
|
587
|
-
今後は複数の暦を扱い、適宜ページ分割していくことにしたい
|
588
|
-
|
589
436
|
# 参考文献
|
590
437
|
|
591
438
|
* 内田 正男『日本暦日原典』雄山閣出版 1975(1975)
|
@@ -349,6 +349,51 @@ module Zakuro
|
|
349
349
|
#
|
350
350
|
def floor_minute
|
351
351
|
result = float_minute
|
352
|
+
# NOTE: 『日本暦日原典』に準じ、少数点以下桁数を2桁とし、3桁目は四捨五入する
|
353
|
+
# これが判明したのは、月の運動による計算を行う際、下記の小余が±1ズレていたことによる
|
354
|
+
#
|
355
|
+
# ## 儀鳳暦
|
356
|
+
# * 大宝 2年 5 大 丁卯 3-1129 702 5 31 (12)22-138 (11)6-1185
|
357
|
+
# * 養老 3年 閏7 小 丁巳 53-767 719 8 20 (17)7-478
|
358
|
+
#
|
359
|
+
# ## 大衍暦
|
360
|
+
# * 神護景雲 2年 5 小 甲辰 40-632 768 5 21 (12)8-363 (11)52-2739
|
361
|
+
# * 仁寿 2年 10 大 癸亥 59-1781 852 11 15 (22)0-2538 (23)16-162
|
362
|
+
#
|
363
|
+
# ## 宣明暦
|
364
|
+
# * 天暦 2年 7 小 戊申 44-8274 948 8 8 (16)53-690 (17)8-2525
|
365
|
+
# * 仁平 2年 3 小 丙申 32-1497 1152 4 7 (8)41-2025 (9)56-3860
|
366
|
+
# * 承久 2年 庚辰 2 小 壬戌 58-7037 1220 3 7 (6)7-3693 (7)22-5529
|
367
|
+
# * 安貞 1年 8 大 丁未 43-5913 1227 9 12 (18)46-6506 (19)1-8341
|
368
|
+
# * 永享 10年 12 大 辛亥 47-2832 1438 12 17 (2)15-1196 (1)59-7760
|
369
|
+
#
|
370
|
+
# これらは月の運行で表の引き当て時に使う大余小余のズレが原因だった
|
371
|
+
# 小余は、小余と秒の合算値で求められるが、次の合算値が『日本暦日原典』で切り上げられていた
|
372
|
+
#
|
373
|
+
# ## 儀鳳暦
|
374
|
+
# |小余|小余(秒 / 12)|合算|
|
375
|
+
# |:----|:----|:----|
|
376
|
+
# |950.4999913|0.5|950.9999913|
|
377
|
+
# |390.7499913|0.25|390.9999913|
|
378
|
+
#
|
379
|
+
# ## 大衍暦
|
380
|
+
# |小余|小余(秒 / 80)|合算|
|
381
|
+
# |:----|:----|:----|
|
382
|
+
# |1697.921259|0.075|1697.996259|
|
383
|
+
# |2656.833759|0.1625|2656.996259|
|
384
|
+
#
|
385
|
+
# ## 宣明暦
|
386
|
+
# |小余|小余(秒 / 100)|合算|
|
387
|
+
# |:----|:----|:----|
|
388
|
+
# |6291.709782|0.29|6291.999782|
|
389
|
+
# |361.9497818|0.05|361.9997818|
|
390
|
+
# |5470.569782|0.43|5470.999782|
|
391
|
+
# |4552.089782|0.91|4552.999782|
|
392
|
+
# |2161.659782|0.34|2161.999782|
|
393
|
+
#
|
394
|
+
# 従って、少数点以下桁数を2桁とし、3桁目は四捨五入することとした
|
395
|
+
result = result.round(2)
|
396
|
+
# 秒は切り捨てる
|
352
397
|
result.floor
|
353
398
|
end
|
354
399
|
|
@@ -393,6 +438,19 @@ module Zakuro
|
|
393
438
|
self
|
394
439
|
end
|
395
440
|
|
441
|
+
#
|
442
|
+
# 特定の文字フォーマットにして出力する
|
443
|
+
#
|
444
|
+
# @param [String] form フォーマット(大余、小余、秒それぞれを%dで指定する)
|
445
|
+
#
|
446
|
+
# @return [String] フォーマットした結果
|
447
|
+
#
|
448
|
+
def format(form: '%d-%d')
|
449
|
+
return '' if invalid?
|
450
|
+
|
451
|
+
super(form, @day, @minute, @second)
|
452
|
+
end
|
453
|
+
|
396
454
|
private
|
397
455
|
|
398
456
|
# 繰り上げ、繰り下げ
|
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
require_relative '../../era/western/calendar'
|
4
4
|
|
5
|
+
require_relative '../cycle/abstract_remainder'
|
6
|
+
|
5
7
|
# :nodoc:
|
6
8
|
module Zakuro
|
7
9
|
# :nodoc:
|
@@ -16,6 +18,8 @@ module Zakuro
|
|
16
18
|
attr_reader :western_date
|
17
19
|
# @return [Remainder] 大余小余
|
18
20
|
attr_reader :remainder
|
21
|
+
# @return [Remainder] 大余小余(経朔)
|
22
|
+
attr_reader :average_remainder
|
19
23
|
|
20
24
|
#
|
21
25
|
# 初期化
|
@@ -24,11 +28,14 @@ module Zakuro
|
|
24
28
|
# @param [Western::Calendar] western_date 大余小余
|
25
29
|
#
|
26
30
|
def initialize(western_date: Western::Calendar.new,
|
27
|
-
remainder: Calculation::Cycle::AbstractRemainder.new
|
31
|
+
remainder: Calculation::Cycle::AbstractRemainder.new,
|
32
|
+
average_remainder: Calculation::Cycle::AbstractRemainder.new)
|
28
33
|
# 西暦日
|
29
34
|
@western_date = western_date
|
30
35
|
# 大余小余
|
31
36
|
@remainder = remainder
|
37
|
+
# 大余小余(経朔)
|
38
|
+
@average_remainder = average_remainder
|
32
39
|
end
|
33
40
|
|
34
41
|
#
|
@@ -39,6 +46,7 @@ module Zakuro
|
|
39
46
|
def initialize_copy(obj)
|
40
47
|
@western_date = obj.western_date.clone
|
41
48
|
@remainder = obj.remainder.clone
|
49
|
+
@average_remainder = obj.average_remainder.clone
|
42
50
|
end
|
43
51
|
end
|
44
52
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# :nodoc:
|
4
|
+
module Zakuro
|
5
|
+
# :nodoc:
|
6
|
+
module Calculation
|
7
|
+
# :nodoc:
|
8
|
+
module Option
|
9
|
+
# :nodoc:
|
10
|
+
module VanishedDate
|
11
|
+
#
|
12
|
+
# AbstractParameter 滅日引数
|
13
|
+
#
|
14
|
+
class AbstractParameter
|
15
|
+
# @return [True] 有効
|
16
|
+
# @return [False] 無効
|
17
|
+
attr_reader :valid
|
18
|
+
# @return [Cycle::AbstractRemainder] 「有滅之朔」判定
|
19
|
+
attr_reader :limit
|
20
|
+
# @return [Class] 滅余クラス
|
21
|
+
attr_reader :remainder_class
|
22
|
+
|
23
|
+
#
|
24
|
+
# 初期化
|
25
|
+
#
|
26
|
+
# @param [True, False] valid 有効/無効
|
27
|
+
# @param [Cycle::AbstractRemainder] limit 「有滅之朔」判定
|
28
|
+
# @param [Class] remainder_class 滅余クラス
|
29
|
+
#
|
30
|
+
def initialize(valid: false, limit: Cycle::AbstractRemainder.new,
|
31
|
+
remainder_class: Object)
|
32
|
+
@valid = valid
|
33
|
+
@limit = limit
|
34
|
+
@remainder_class = remainder_class
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# :nodoc:
|
4
|
+
module Zakuro
|
5
|
+
# :nodoc:
|
6
|
+
module Calculation
|
7
|
+
# :nodoc:
|
8
|
+
module Option
|
9
|
+
# :nodoc:
|
10
|
+
module VanishedDate
|
11
|
+
#
|
12
|
+
# Location 滅日位置
|
13
|
+
#
|
14
|
+
class Location
|
15
|
+
# @return [Integer] 理想上の月日数
|
16
|
+
IDEAL_MONTH = 30
|
17
|
+
|
18
|
+
# @return [Context::Context] 暦コンテキスト
|
19
|
+
attr_reader :context
|
20
|
+
# @return [True] 有効
|
21
|
+
# @return [False] 無効
|
22
|
+
attr_reader :valid
|
23
|
+
# @return [Cycle::AbstractRemainder] 「有没之気」判定
|
24
|
+
attr_reader :limit
|
25
|
+
# @return [Cycle::AbstractRemainder] 経朔
|
26
|
+
attr_reader :average_remainder
|
27
|
+
# @return [Class] 滅余クラス
|
28
|
+
attr_reader :remainder_class
|
29
|
+
|
30
|
+
#
|
31
|
+
# 初期化
|
32
|
+
#
|
33
|
+
# @param [Context::Context] context 暦コンテキスト
|
34
|
+
# @param [Cycle::AbstractRemainder] average_remainder 経朔
|
35
|
+
#
|
36
|
+
def initialize(context:, average_remainder:)
|
37
|
+
parameter = context.resolver.vanished_date_parameter.new
|
38
|
+
@context = context
|
39
|
+
@valid = parameter.valid
|
40
|
+
@limit = parameter.limit
|
41
|
+
@average_remainder = average_remainder
|
42
|
+
@remainder_class = parameter.remainder_class
|
43
|
+
end
|
44
|
+
|
45
|
+
#
|
46
|
+
# 不正か
|
47
|
+
#
|
48
|
+
# @return [True] 不正
|
49
|
+
# @return [False] 不正なし
|
50
|
+
#
|
51
|
+
def invalid?
|
52
|
+
!@valid
|
53
|
+
end
|
54
|
+
|
55
|
+
#
|
56
|
+
# 滅日が存在するか?
|
57
|
+
#
|
58
|
+
# @return [True] 存在あり
|
59
|
+
# @return [False] 存在なし
|
60
|
+
#
|
61
|
+
def exist?
|
62
|
+
minute_later = average_remainder.class.new(
|
63
|
+
day: 0, minute: average_remainder.minute, second: average_remainder.second
|
64
|
+
)
|
65
|
+
minute_later < limit
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# 「滅余」を返す
|
70
|
+
#
|
71
|
+
# @return [Cycle::AbstractRemainder] 滅余
|
72
|
+
#
|
73
|
+
def get
|
74
|
+
# 経朔の小余 * 30
|
75
|
+
minute = remainder_class.new(day: 0, minute: IDEAL_MONTH * average_remainder.minute, second: 0)
|
76
|
+
day = remainder_class.new(day: average_remainder.day, minute: 0, second: 0)
|
77
|
+
|
78
|
+
minute.add(day)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -64,13 +64,15 @@ module Zakuro
|
|
64
64
|
|
65
65
|
# 14ヶ月分を生成する(閏年で最大13ヶ月 + 末月の大小/二十四節気を求めるために必要な月)
|
66
66
|
(0..13).each do |_index|
|
67
|
+
average_remainder = lunar_phase.average_remainder.clone
|
67
68
|
adjusted = lunar_phase.next_month
|
68
69
|
|
69
70
|
result.push(
|
70
71
|
Monthly::InitializedMonth.new(
|
71
|
-
context: context,
|
72
|
-
|
73
|
-
|
72
|
+
context: context, month_label: Monthly::MonthLabel.new,
|
73
|
+
first_day: Monthly::FirstDay.new(
|
74
|
+
remainder: adjusted, average_remainder: average_remainder
|
75
|
+
),
|
74
76
|
phase_index: 0
|
75
77
|
)
|
76
78
|
)
|
@@ -43,6 +43,7 @@ module Zakuro
|
|
43
43
|
month_label: month.month_label,
|
44
44
|
first_day: Monthly::FirstDay.new(
|
45
45
|
remainder: month.first_day.remainder,
|
46
|
+
average_remainder: month.first_day.average_remainder,
|
46
47
|
western_date: gengou.start_date.clone
|
47
48
|
),
|
48
49
|
solar_terms: month.solar_terms, gengou: gengou
|
@@ -19,17 +19,21 @@ module Zakuro
|
|
19
19
|
attr_reader :western_year
|
20
20
|
# @return [Cycle::LunarRemainder] 大余小余(初回:昨年天正閏余)
|
21
21
|
attr_reader :remainder
|
22
|
+
# @return [Cycle::LunarRemainder] 弦(1朔望月の1/4)
|
23
|
+
attr_reader :quarter
|
22
24
|
|
23
25
|
#
|
24
26
|
# 初期化
|
25
27
|
#
|
26
28
|
# @param [Cycle::LunarRemainder] lunar_age 天正閏余(大余小余)
|
29
|
+
# @param [Cycle::LunarRemainder] quarter 弦(1朔望月の1/4)
|
27
30
|
# @param [Integer] western_year 西暦年
|
28
31
|
#
|
29
|
-
def initialize(lunar_age:, western_year:)
|
32
|
+
def initialize(lunar_age:, quarter:, western_year:)
|
30
33
|
@calculated = false
|
31
34
|
@western_year = western_year
|
32
35
|
@remainder = lunar_age
|
36
|
+
@quarter = quarter
|
33
37
|
end
|
34
38
|
|
35
39
|
#
|
@@ -43,7 +47,7 @@ module Zakuro
|
|
43
47
|
# 弦の分だけ月地点を進める
|
44
48
|
#
|
45
49
|
def add_quarter
|
46
|
-
|
50
|
+
remainder.add!(quarter)
|
47
51
|
end
|
48
52
|
|
49
53
|
#
|
@@ -13,6 +13,9 @@ module Zakuro
|
|
13
13
|
#
|
14
14
|
module ChoukeiValue
|
15
15
|
class << self
|
16
|
+
# @return [Output::Logger] ロガー
|
17
|
+
LOGGER = Output::Logger.new(location: 'choukei_value')
|
18
|
+
|
16
19
|
#
|
17
20
|
# 四捨五入した大余を返す
|
18
21
|
#
|
@@ -23,7 +26,12 @@ module Zakuro
|
|
23
26
|
# @return [Integer] 累計値(大余)
|
24
27
|
#
|
25
28
|
def rounded_day(per:, denominator:, minute:)
|
29
|
+
# LOGGER.debug("minute: #{minute}")
|
30
|
+
|
26
31
|
remainder_minute = Type::OldFloat.new((per * minute).to_f)
|
32
|
+
|
33
|
+
# LOGGER.debug("remainder_minute.get: #{remainder_minute.get}")
|
34
|
+
|
27
35
|
day = day_only(remainder_minute: remainder_minute.get, denominator: denominator)
|
28
36
|
# 繰り上げ結果を足す
|
29
37
|
day += carried_minute(remainder_minute: remainder_minute, denominator: denominator)
|
@@ -42,6 +50,12 @@ module Zakuro
|
|
42
50
|
# @return [Float] 小余
|
43
51
|
#
|
44
52
|
def remainder_without_second(remainder:)
|
53
|
+
# LOGGER.debug("minute.to_f: #{remainder.minute.to_f}")
|
54
|
+
# LOGGER.debug("second.to_f: #{remainder.second.to_f}")
|
55
|
+
# LOGGER.debug("base_minute: #{remainder.base_minute}")
|
56
|
+
# LOGGER.debug(
|
57
|
+
# "second.to_f / base_minute: #{remainder.second.to_f / remainder.base_minute}"
|
58
|
+
# )
|
45
59
|
adjusted = remainder.class.new(
|
46
60
|
day: remainder.day, minute: remainder.floor_minute, second: 0
|
47
61
|
)
|