lib/zakuro/version/senmyou/range/annual_range.rb in zakuro-0.1.1 vs lib/zakuro/version/senmyou/range/annual_range.rb in zakuro-0.1.2
- old
+ new
@@ -5,10 +5,11 @@
require_relative '../monthly/initialized_month'
require_relative '../base/solar_term'
require_relative '../monthly/lunar_phase'
require_relative '../stella/solar_orbit'
require_relative '../stella/solar_average'
+require_relative '../stella/solar_location'
require_relative '../stella/lunar_orbit'
# :nodoc:
module Zakuro
# :nodoc:
@@ -66,19 +67,17 @@
def self.collect_annual_range_after_last_november_1st(western_year:)
annual_range = initialized_annual_range(western_year: western_year)
apply_big_and_small_of_the_month(annual_range: annual_range)
- SolarAverage.set_solar_terms_into_annual_range(western_year: western_year,
- annual_range: annual_range)
+ solar_average = SolarAverage.new(western_year: western_year)
+ solar_average.set(annual_range: annual_range)
# 月間隔を取得するためだけの末尾要素を削除
annual_range.pop
- adjust_leap_month(annual_range: annual_range)
-
- annual_range
+ initialize_month_label(annual_range: annual_range)
end
#
# 11月定朔の補正値を求める
#
@@ -91,11 +90,11 @@
# 補正
solar_term = SolarTerm.new(
remainder: winter_solstice_age
)
solar_term = \
- SolarOrbit.calc_solar_term_by_remainder(
+ SolarLocation.get(
solar_term: solar_term
)
moon_remainder, is_forward = LunarOrbit.calc_moon_point(
remainder: winter_solstice_age, western_year: western_year
@@ -116,69 +115,45 @@
#
def self.initialized_annual_range(western_year:)
result = []
lunar_phase = LunarPhase.new(western_year: western_year)
- is_last_year = true
-
- monthes = [11, 12] + [*1..12]
-
- monthes.each do |month|
- LOGGER.debug('---', "month: #{month}", "is_last_year: #{is_last_year}")
-
+ # 14ヶ月分を生成する(閏年で最大13ヶ月 + 末月の大小/二十四節気を求めるために必要な月)
+ (0..13).each do |_index|
adjusted = lunar_phase.next_month
result.push(
- InitializedMonth.new(month_label: MonthLabel.new(number: month),
+ InitializedMonth.new(month_label: MonthLabel.new,
first_day: FirstDay.new(remainder: adjusted),
- is_last_year: is_last_year, phase_index: 0)
+ phase_index: 0)
)
- is_last_year = false if month == 12
end
+
result
end
private_class_method :initialized_annual_range
#
# 1年データの各月に月の大小を設定する
#
# @param [Array<Month>] annual_range 1年データ
#
def self.apply_big_and_small_of_the_month(annual_range:)
- annual_range.each_with_index do |range, index|
- # 最後は比較対象がないためスキップする(=計算外の余分な月が最後に必要である)
- next if index == annual_range.size - 1
-
- next_month = annual_range[index + 1]
- range.eval_many_days(next_month_day: next_month.remainder.day)
+ # NOTE: 最後の月は処理できない(=計算外の余分な月が最後に必要である)
+ annual_range.each_cons(2) do |(current_month, next_month)|
+ current_month.eval_many_days(next_month_day: next_month.remainder.day)
end
end
private_class_method :apply_big_and_small_of_the_month
- # :reek:TooManyStatements { max_statements: 10 }
-
#
- # 閏月が存在した場合に以降の月を1つずつ減らす
- # @example 7,8,9 と続く月の8月が閏の場合、7, 閏7, 8 となる
+ # 月表示情報を更新する
#
# @param [Array<Month>] annual_range 1年データ
#
- def self.adjust_leap_month(annual_range:)
- # 閏による月の再調整を行う
- leaped = false
- annual_range.each_with_index do |month, index|
- month.eval_leaped
- # NOTE: 初回閏月(閏11月)は前回月が存在しないため調整外
- leaped = true if month.leaped? && !index.zero?
-
- next unless leaped
-
- # NOTE: 常気法では閏月は2-3年に一度のため、1年に二度発生しない前提
-
- # 閏の分だけ1ヶ月ずらす
- month.back_to_last_month
- end
+ def self.initialize_month_label(annual_range:)
+ annual_range.each(&:rename_month_label_by_solar_term)
end
- private_class_method :adjust_leap_month
+ private_class_method :initialize_month_label
end
end
end