lib/zakuro/version/senmyou/stella/solar/average.rb in zakuro-0.1.5 vs lib/zakuro/version/senmyou/stella/solar/average.rb in zakuro-0.2.0
- old
+ new
@@ -1,51 +1,46 @@
# frozen_string_literal: true
+require_relative '../../../../calculation/stella/solar/abstract_average'
+
require_relative '../../const/remainder'
+require_relative '../../cycle/solar_term'
+
require_relative '../origin/winter_solstice'
+require_relative './location'
+
# :nodoc:
module Zakuro
# :nodoc:
module Senmyou
# :nodoc:
module Solar
#
- # Average 常気(太陽軌道平均)
+ # Average 平気(太陽軌道平均)
#
- class Average
- # @return [Remainder] 気策
- SOLAR_TERM_AVERAGE = Const::Remainder::Solar::SOLAR_TERM_AVERAGE
-
+ class Average < Calculation::Solar::AbstractAverage
#
# 初期化
#
# @param [Integer] western_year 西暦年
#
def initialize(western_year:)
- @solar_term = Average.first_solar_term(western_year: western_year)
+ solar_term = Average.first_solar_term(western_year: western_year)
+ super(solar_term: solar_term)
end
#
# 冬至から数えた1年データの月ごとに二十四節気を割り当てる
#
# @param [Array<Month>] annual_range 1年データ
#
# @return [Array<Month>] 1年データ
#
def set(annual_range:)
- # 次月と比較しながら当月の二十四節気を決める
- # NOTE: 最後の月は処理できない(=計算外の余分な月が最後に必要である)
- annual_range.each_cons(2) do |(current_month, next_month)|
- set_solar_term(
- current_month: current_month,
- next_month: next_month
- )
- end
-
- annual_range
+ super(annual_range: annual_range)
end
#
# 計算開始する二十四節気を求める
#
@@ -93,82 +88,9 @@
# 入定気の一つ後の二十四節気まで戻す(ただし11月経朔が二十四節気上にある場合は戻さない)
solar_term_index += 1 unless solar_location.remainder == Cycle::Remainder.new(total: 0)
solar_term_index
- end
-
- # :reek:TooManyStatements { max_statements: 7 }
-
- #
- # 月内(当月朔日から当月末日(来月朔日の前日)の間)に二十四節気があるか
- # @note 大余60で一巡するため 以下2パターンがある
- # * current_month <= next_month : (二十四節気) >= current_month && (二十四節気) < next_month
- # * current_month > next_month : (二十四節気) >= current_month || (二十四節気) < next_month
- #
- # @param [Remainder] solar_term 二十四節気
- # @param [Remainder] current_month 月初
- # @param [Remainder] next_month 月末
- #
- # @return [True] 対象の二十四節気がある
- # @return [False] 対象の二十四節気がない
- #
- def self.in_solar_term?(solar_term:, current_month:, next_month:)
- # 大余で比較する
- target_time = solar_term.day
- current_month_time = current_month.day
- next_month_time = next_month.day
- current_month_over = (target_time >= current_month_time)
- next_month_under = (target_time < next_month_time)
-
- return current_month_over && next_month_under if current_month_time <= next_month_time
-
- current_month_over || next_month_under
- end
-
- private
-
- # :reek:TooManyStatements { max_statements: 8 }
-
- #
- # 二十四節気を設定する
- #
- # @param [Month] current_month 当月
- # @param [Month] next_month 次月
- #
- def set_solar_term(current_month:, next_month:)
- # 安全策として無限ループは回避する
- # * 最大試行回数:4回(設定なし => 設定あり => 設定あり => 設定なし)
- # * 閏月は1回しか設定しない
- # * 最大2回設定する(中気・節気)
- (0..3).each do |_index|
- in_range = Average.in_solar_term?(
- solar_term: @solar_term.remainder, current_month: current_month.remainder,
- next_month: next_month.remainder
- )
-
- # 範囲外
- unless in_range
- # 1つ以上設定されていれば切り上げる(一つ飛ばしで二十四節気を設定することはない)
- break unless current_month.empty_solar_term?
-
- next_solar_term
- next
- end
-
- current_month.add_term(term: @solar_term.clone)
- next_solar_term
-
- # 宣明暦は最大2つまで
- break if current_month.solar_term_size == 2
- end
- end
-
- #
- # 次の二十四節気に移る
- #
- def next_solar_term
- @solar_term.next_term!
end
end
end
end
end