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