zakuro 0.8.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +38 -160
  3. data/VERSION +1 -1
  4. data/doc/condition.md +36 -0
  5. data/doc/dropped_date.md +41 -0
  6. data/doc/expection.md +108 -0
  7. data/doc/operation/csv/month.csv +100 -79
  8. data/doc/operation/operation.xlsx +0 -0
  9. data/doc/usage.md +120 -0
  10. data/doc/vanished_date.md +86 -0
  11. data/doc/version/daien.md +163 -0
  12. data/doc/version/genka.md +116 -0
  13. data/doc/version/gihou.md +172 -0
  14. data/doc/version/section/common_post_process.md +60 -0
  15. data/doc/version/section/common_pre_process.md +185 -0
  16. data/doc/version/section/const.md +45 -0
  17. data/doc/version/section/decimal.md +101 -0
  18. data/doc/version/section/lunisolar_calendar.md +55 -0
  19. data/doc/version/section/senmyou_november_1st.md +41 -0
  20. data/{lib/zakuro/version/senmyou/README.md → doc/version/senmyou.md} +15 -168
  21. data/lib/zakuro/calculation/cycle/abstract_remainder.rb +58 -0
  22. data/lib/zakuro/calculation/monthly/first_day.rb +9 -1
  23. data/lib/zakuro/calculation/option/vanished_date/abstract_parameter.rb +40 -0
  24. data/lib/zakuro/calculation/option/vanished_date/location.rb +84 -0
  25. data/lib/zakuro/calculation/range/medieval_annual_range.rb +5 -3
  26. data/lib/zakuro/calculation/range/transfer/gengou_scroller.rb +1 -0
  27. data/lib/zakuro/calculation/stella/lunar/abstract_location.rb +6 -2
  28. data/lib/zakuro/calculation/stella/lunar/choukei_value.rb +14 -0
  29. data/lib/zakuro/calculation/summary/internal/option.rb +59 -4
  30. data/lib/zakuro/context/option.rb +17 -0
  31. data/lib/zakuro/context/version_class_resolver.rb +17 -1
  32. data/lib/zakuro/operation/yaml/month.yaml +955 -281
  33. data/lib/zakuro/result/data/option/vanished_date/calculation.rb +45 -0
  34. data/lib/zakuro/result/data/option/vanished_date/option.rb +47 -0
  35. data/lib/zakuro/result/data/single_day.rb +2 -0
  36. data/lib/zakuro/version/daien/const/number.rb +2 -0
  37. data/lib/zakuro/version/daien/const/remainder.rb +7 -2
  38. data/lib/zakuro/version/daien/cycle/remainder.rb +38 -20
  39. data/lib/zakuro/version/daien/monthly/lunar_phase.rb +2 -4
  40. data/lib/zakuro/version/daien/option/dropped_date/parameter.rb +5 -3
  41. data/lib/zakuro/version/daien/option/vanished_date/parameter.rb +33 -0
  42. data/lib/zakuro/version/daien/stella/lunar/location.rb +5 -8
  43. data/lib/zakuro/version/genka/cycle/remainder.rb +6 -2
  44. data/lib/zakuro/version/genka/monthly/lunar_phase.rb +14 -3
  45. data/lib/zakuro/version/genka/option/vanished_date/parameter.rb +31 -0
  46. data/lib/zakuro/version/gihou/const/remainder.rb +1 -5
  47. data/lib/zakuro/version/gihou/cycle/remainder.rb +0 -26
  48. data/lib/zakuro/version/gihou/monthly/lunar_phase.rb +2 -4
  49. data/lib/zakuro/version/gihou/option/vanished_date/parameter.rb +31 -0
  50. data/lib/zakuro/version/gihou/stella/lunar/location.rb +5 -8
  51. data/lib/zakuro/version/senmyou/const/number.rb +3 -1
  52. data/lib/zakuro/version/senmyou/const/remainder.rb +3 -0
  53. data/lib/zakuro/version/senmyou/cycle/remainder.rb +17 -34
  54. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +5 -5
  55. data/lib/zakuro/version/senmyou/option/vanished_date/parameter.rb +33 -0
  56. data/lib/zakuro/version/senmyou/stella/lunar/location.rb +6 -8
  57. data/lib/zakuro/version/senmyou/stella/lunar/value.rb +9 -0
  58. 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
- 元号開始年が存在する元号年(877)から、次の元号の開始年(885) + 1 までを和暦計算する。これをAとする
21
+ その間に宣明暦固有の計算を説明することとする
102
22
 
103
- 元号のはじまりは固定値のため、西暦開始日と、それに対応する和暦開始日を持つ(例: 元慶01年04月16日 = 877-6-1)
23
+ ## 共通前処理
104
24
 
105
- この和暦開始日は必ずAの1年目に存在するため、1年目の和暦日を特定し、その日と西暦開始日を関連付ける
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
- ![入定気の起算](../../../../images/入定気の起算.png)
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
- ![各月の求め方](../../../../images/各月の求め方.png)
315
+ ![各月の求め方](../../images/各月の求め方.png)
413
316
 
414
317
  再掲する形になるが、流れについては上記の図を参考にしてほしい
415
318
 
@@ -454,7 +357,7 @@ NOTE: 後述の表が遠地点始まりで地球に向かって進み、近地
454
357
 
455
358
  12月以降を求めたい場合は、上記の定数を二十四節気の並びに合わせて順次使用する
456
359
 
457
- ![12月以降の入定気](../../../../images/12月以降の入定気.png)
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月以降の月の進退](../../../../images/12月以降の月の進退.png)
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
- ### 1ヶ月ごとの固有値を求める
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
- month_label: Monthly::MonthLabel.new,
73
- first_day: Monthly::FirstDay.new(remainder: adjusted),
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
- # abstract
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
  )