Module: Zakuro::Version::Gihou::Lunar::Adjustment

Defined in:
lib/zakuro/version/gihou/stella/lunar/adjustment.rb

Overview

Adjustment 補正値情報

Defined Under Namespace

Classes: Range, Row, Value

Constant Summary collapse

DAY_LIMIT =

遠/近の地点での中間

7、14、21日の小余の境界は下記のようにして求めた

* 宣明暦の7日の小余は7465である。入暦は1始まりなので、0始まりで表現すると 6-7465 となる
* 6 * 8400(統法) + 7465(初益) = 57865
* これを儀鳳暦に変えると、 57865 / 1340(総法) = 6 余り 1190.845238..
* これを入暦の1始まりに置き換え、少数部を消すと 7-1190、これが7日目となる
* 同様の方法で14日と21日も求める
* 57865 * 2 = 115730 / 1340(総法) = 13 余り 1041.690476 = 14-1041
* 57865 * 3 = 173595 / 1340(総法) = 20 余り 892.5357143 = 21-892

28日は変日の範囲内743とした。

* 宣明暦では 進退 14-6529(1始まりなので実質13) * 2 = 27-4658
* 暦周 27-4658.19 に一致する。これを変日27-743.1と同等とみなした

Returns:

  • (Hash<Integer>)

    遠/近の地点での中間

{
  7 => 1191,  # 天平勝宝2年(750年)5月 により 1190 ではないことを確認した
  14 => 1042, # 養老6年(722年) 6月 により 1041 ではないことを確認した
  21 => 892,
  28 => 743.06 # 天平13年(741年) 2月 により 743 ではないことを確認した
}.freeze
LIST =
Note:

7日、14日、21日、28日の小余は DAY_LIMIT を参照のこと

Returns 月の補正値情報.

Returns:

  • (Array<Row>)

    月の補正値情報

[
  Row.new(day: 1, range: Range.new, value: Value.new(per: -134, stack: 0)),
  Row.new(day: 2, range: Range.new, value: Value.new(per: -117, stack: -134)),
  Row.new(day: 3, range: Range.new, value: Value.new(per: -99, stack: -251)),
  Row.new(day: 4, range: Range.new, value: Value.new(per: -78, stack: -350)),
  Row.new(day: 5, range: Range.new, value: Value.new(per: -56, stack: -428)),
  Row.new(day: 6, range: Range.new, value: Value.new(per: -33, stack: -484)),
  Row.new(day: 7, range: Range.new(max: DAY_LIMIT[7]), value: Value.new(per: -9, stack: -517)),
  Row.new(day: 7, range: Range.new(min: DAY_LIMIT[7]), value: Value.new(per: 0, stack: -526)),
  Row.new(day: 8, range: Range.new, value: Value.new(per: +14, stack: -526)),
  Row.new(day: 9, range: Range.new, value: Value.new(per: +38, stack: -512)),
  Row.new(day: 10, range: Range.new, value: Value.new(per: +62, stack: -474)),
  Row.new(day: 11, range: Range.new, value: Value.new(per: +85, stack: -412)),
  Row.new(day: 12, range: Range.new, value: Value.new(per: +104, stack: -327)),
  Row.new(day: 13, range: Range.new, value: Value.new(per: +121, stack: -223)),
  Row.new(day: 14, range: Range.new(max: DAY_LIMIT[14]), value: Value.new(per: +102, stack: -102)),
  Row.new(day: 14, range: Range.new(min: DAY_LIMIT[14]), value: Value.new(per: +29, stack: 0)),
  Row.new(day: 15, range: Range.new, value: Value.new(per: +128, stack: +29)),
  Row.new(day: 16, range: Range.new, value: Value.new(per: +115, stack: +157)),
  Row.new(day: 17, range: Range.new, value: Value.new(per: +95, stack: +272)),
  Row.new(day: 18, range: Range.new, value: Value.new(per: +74, stack: +367)),
  Row.new(day: 19, range: Range.new, value: Value.new(per: +52, stack: +441)),
  Row.new(day: 20, range: Range.new, value: Value.new(per: +28, stack: +493)),
  Row.new(day: 21, range: Range.new(max: DAY_LIMIT[21]), value: Value.new(per: +4, stack: +521)),
  Row.new(day: 21, range: Range.new(min: DAY_LIMIT[21]), value: Value.new(per: 0, stack: +525)),
  Row.new(day: 22, range: Range.new, value: Value.new(per: -20, stack: +525)),
  Row.new(day: 23, range: Range.new, value: Value.new(per: -44, stack: +505)),
  Row.new(day: 24, range: Range.new, value: Value.new(per: -68, stack: +461)),
  Row.new(day: 25, range: Range.new, value: Value.new(per: -89, stack: +393)),
  Row.new(day: 26, range: Range.new, value: Value.new(per: -108, stack: +304)),
  Row.new(day: 27, range: Range.new, value: Value.new(per: -125, stack: +196)),
  Row.new(day: 28, range: Range.new(max: DAY_LIMIT[28]), value: Value.new(per: -71, stack: +71))
].freeze

Class Method Summary collapse

Class Method Details

.minus_minute(day:, minute:) ⇒ Integer

小余の下げ幅を求める

Parameters:

  • day (Integer)

    大余

  • minute (Integer)

    小余

Returns:

  • (Integer)

    小余の下げ幅



244
245
246
247
248
249
250
251
252
# File 'lib/zakuro/version/gihou/stella/lunar/adjustment.rb', line 244

def minus_minute(day:, minute:)
  limit = DAY_LIMIT.fetch(day, -1)
  # 該当なし
  return minute if limit == -1

  return minute unless minute > limit

  minute - limit
end

.specify(day:, minute:) ⇒ Row

月軌道の補正に必要な基本値を引き当てる

Parameters:

  • forward (True, False)

    進(遠地点より数える)/退(近地点より数える)

  • day (Integer)

    大余

  • minute (Integer)

    小余

Returns:

  • (Row)

    補正値

Raises:

  • (ArgumentError)

    引数エラー



225
226
227
228
229
230
231
232
# File 'lib/zakuro/version/gihou/stella/lunar/adjustment.rb', line 225

def specify(day:, minute:)
  LIST.each do |row|
    # NOTE: 範囲が重複している場合、最初に引き当てたほうを優先する
    return row if row.match?(day: day, minute: minute)
  end

  raise ArgumentError.new, "invalid parameter: #{day}/#{minute}"
end