lib/when_exe/region/martian.rb in when_exe-0.3.6 vs lib/when_exe/region/martian.rb in when_exe-0.3.7
- old
+ new
@@ -1,255 +1,258 @@
-# -*- coding: utf-8 -*-
-=begin
- Copyright (C) 2013-2014 Takashi SUGA
-
- You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
-=end
-
-module When
-
- class BasicTypes::M17n
-
- Martian = [self, [
- "locale:[=en:, ja=ja:, alias]",
- "names:[Martian=]",
- "[Darian=en:Darian_calendar, ダリアン暦]",
-
- [self,
- "names:[DarianMonth=, 月=ja:%%<月_(暦)>]",
- "[Sagittarius, いて= ]",
- "[Dhanus=, 人馬= ]",
- "[Capricornus, やぎ= ]",
- "[Makara=, 磨羯= ]",
- "[Aquarius, みずがめ=]",
- "[Kumbha=, 宝瓶= ]",
- "[Pisces, うお= ]",
- "[Mina=, 双魚= ]",
- "[Aries, おひつじ=]",
- "[Mesha=, 白羊= ]",
- "[Taurus, おうし= ]",
- "[Rishabha=, 金牛= ]",
- "[Gemini, ふたご= ]",
- "[Mithuna=, 双児= ]",
- "[Cancer, かに= ]",
- "[Karka=, 巨蟹= ]",
- "[Leo, しし= ]",
- "[Simha=, 獅子= ]",
- "[Virgo, おとめ= ]",
- "[Kanya=, 処女= ]",
- "[Libra, てんびん=]",
- "[Tula=, 天秤= ]",
- "[Scorpius, さそり= ]",
- "[Vrishika=, 天蠍= ]"
- ]
- ]]
- end
-
- module TimeStandard
-
- #
- # Martian Time, Coordinated
- #
- class MartianTimeCoordinated < TimeStandard
-
- J2000Jan6 = 2451549.5
- Ratio = 1.02749125
- MTC0 = 44796.0 - 0.0002 - 0.5
-
- # 当該時刻系の日付を dynamical date に変換する
- #
- # @param [Numeric] date 当該時刻系の日付
- #
- # @return [Numeric] dynamical date
- #
- def to_dynamical_date(date)
- (date - @mtc0) * Ratio + J2000Jan6
- end
-
- # dynamical date を当該時刻系の日付に変換する
- #
- # @param [Numeric] date dynamical date
- #
- # @return [Numeric] 当該時刻系の日付
- #
- def from_dynamical_date(date)
- (date - J2000Jan6) / Ratio + @mtc0
- end
-
- # universal time を dynamical time に変換する
- #
- # @param [Numeric] time universal time
- #
- # @return [Numeric] dynamical time
- #
- def to_dynamical_time(time)
- When::TM::JulianDate._d_to_t(
- to_dynamical_date(
- When::TM::JulianDate._t_to_d(time)))
- end
-
- # dynamical time を universal time に変換する
- #
- # @param [Numeric] time dynamical time
- #
- # @return [Numeric] universal time
- #
- def from_dynamical_time(time)
- When::TM::JulianDate._d_to_t(
- from_dynamical_date(
- When::TM::JulianDate._t_to_d(time)))
- end
-
- private
-
- # オブジェクトの正規化
- def _normalize(args=[], options={})
- @location = When.Resource(@location || '_l:long=0&lat=0&datum=Mars')
- @mtc0 = MTC0 + @location.long / (360.0 * When::Coordinates::Spatial::DEGREE)
- super
- end
- end
- end
-
- class CalendarNote
-
- #
- # Darian Week
- #
- class DarianWeek < WorldWeek
-
- Notes = [When::BasicTypes::M17n, [
- "locale:[=en:, ja=ja:, alias]",
- "names:[Darian]",
-
- # 年の暦注 ----------------------------
- [When::BasicTypes::M17n,
- "names:[year]"
- ],
-
- # 月の暦注 ----------------------------
- [When::BasicTypes::M17n,
- "names:[month]",
- [When::BasicTypes::M17n,
- "names:[Month]"
- ]
- ],
-
- # 日の暦注 ----------------------------
- [When::BasicTypes::M17n,
- "names:[day]",
- [When::BasicTypes::M17n,
- "names:[Week]",
- [DayOfWeek, "label:[Solis=, 日曜日]", {'delta'=>7}],
- [DayOfWeek, "label:[Lunae=, 月曜日]", {'delta'=>7}],
- [DayOfWeek, "label:[Martis=, 火曜日]", {'delta'=>7}],
- [DayOfWeek, "label:[Mercurii=, 水曜日]", {'delta'=>7}],
- [DayOfWeek, "label:[Jovis=, 木曜日]", {'delta'=>7}],
- [DayOfWeek, "label:[Veneris=, 金曜日]", {'delta'=>7}],
- [DayOfWeek, "label:[Saturni=, 土曜日]", {'delta'=>7}]
- ]
- ]
- ]]
-
- #
- # 当日または直前の solis の日
- #
- # @param date [When::TM::TemporalPosition]
- # @param parameter [nil] 未使用
- #
- # @return [When::TM::TemporalPosition]
- #
- def solis(date, parameter=nil)
- date = When.Calendar('Darian').jul_trans(date, {:events=>['from_solis']})
- y,m,d = date.cal_date
- dow = (d-1) % 7
- return date if dow == 0
- date += When::TM::PeriodDuration.new([0,0,-dow])
- date.events = ['from_solis']
- date
- end
-
- #
- # この日は何曜?
- #
- # @param [When::TM::TemporalPosition] date
- # @param [When::TM::CalDate] base (not used)
- #
- # @return [Array<When::CalendarNote::Week::DayOfWeek, Array<Integer,Integer>>]
- #
- def week(date, base=nil)
- date = _to_date_for_note(date)
- index = (date.cal_date.last - 1) % 7
- [@days_of_week[index], [index, 7]]
- end
-
- #
- # 曜日の名前の一覧
- #
- # @param [When::TM::TemporalPosition] date (ダミー)
- #
- # @return [Array<When::CalendarNote::Week::DayOfWeek>]
- #
- def week_labels(date)
- @days_of_week.child
- end
-
- #
- # 暦日を当該暦注計算用クラスに変換
- #
- # @private
- def _to_date_for_note(date)
- date = When::Darian ^ date unless date.frame.label.to_s == 'Darian'
- date
- end
-
- private
-
- # オブジェクトの正規化
- def _normalize(args=[], options={})
- @event ||= 'solis'
- super
- end
- end
- end
-
- module CalendarTypes
-
- #
- # Martian Time, Coordinated
- #
- class MTC < LocalTime
-
- private
-
- # オブジェクトの正規化
- def _normalize(args=[], options={})
- @label = m17n('MTC')
- @time_standard = When.Resource("_t:MartianTimeCoordinated?location=(_l:long=#{@long||0}&datum=Mars)")
- super
- end
- end
-
- #
- # Darian Calendar
- #
- Darian = [CyclicTableBased, {
- 'label' => 'Martian::Darian',
- 'time_basis' => 'MTC',
- 'origin_of_LSC' => -94798,
- 'indices' => [
- When.Index('Martian::DarianMonth', {:unit =>24}),
- When::Coordinates::DefaultDayIndex
- ],
- 'rule_table' => {
- 'T' => {'Rule' =>['LongCentury', ['ShortCentury', 4]]},
- 'LongCentury' => {'Rule' =>[ ['LongDecade', 10]]},
- 'ShortCentury' => {'Rule' =>['ShortDecade', ['LongDecade', 9]]},
- 'LongDecade' => {'Rule' =>[669] * 2 + [668, 669] * 4 },
- 'ShortDecade' => {'Rule' => [668, 669] * 5 },
- 668 => {'Length'=>[28, 28, 28, 28, 28, 27] * 4 },
- 669 => {'Length'=>[28, 28, 28, 28, 28, 27] * 3 + [28] * 6}
- },
- 'note' => 'DarianWeek'
- }]
- end
-end
+# -*- coding: utf-8 -*-
+=begin
+ Copyright (C) 2013-2014 Takashi SUGA
+
+ You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
+=end
+
+module When
+
+ class BasicTypes::M17n
+
+ Martian = [self, [
+ "locale:[=en:, ja=ja:, alias]",
+ "names:[Martian=]",
+ "[Darian=en:Darian_calendar, ダリアン暦]",
+
+ [self,
+ "names:[DarianMonth=, 月=ja:%%<月_(暦)>]",
+ "[Sagittarius, いて= ]",
+ "[Dhanus=, 人馬= ]",
+ "[Capricornus, やぎ= ]",
+ "[Makara=, 磨羯= ]",
+ "[Aquarius, みずがめ=]",
+ "[Kumbha=, 宝瓶= ]",
+ "[Pisces, うお= ]",
+ "[Mina=, 双魚= ]",
+ "[Aries, おひつじ=]",
+ "[Mesha=, 白羊= ]",
+ "[Taurus, おうし= ]",
+ "[Rishabha=, 金牛= ]",
+ "[Gemini, ふたご= ]",
+ "[Mithuna=, 双児= ]",
+ "[Cancer, かに= ]",
+ "[Karka=, 巨蟹= ]",
+ "[Leo, しし= ]",
+ "[Simha=, 獅子= ]",
+ "[Virgo, おとめ= ]",
+ "[Kanya=, 処女= ]",
+ "[Libra, てんびん=]",
+ "[Tula=, 天秤= ]",
+ "[Scorpius, さそり= ]",
+ "[Vrishika=, 天蠍= ]"
+ ]
+ ]]
+ end
+
+ module TimeStandard
+
+ #
+ # Martian Time, Coordinated
+ #
+ class MartianTimeCoordinated < TimeStandard
+
+ J2000Jan6 = 2451549.5
+ Ratio = 1.02749125
+ MTC0 = 44796.0 - 0.0002 - 0.5
+
+ # 当該時刻系の日付を dynamical date に変換する
+ #
+ # @param [Numeric] date 当該時刻系の日付
+ #
+ # @return [Numeric] dynamical date
+ #
+ def to_dynamical_date(date)
+ (date - @mtc0) * Ratio + J2000Jan6
+ end
+
+ # dynamical date を当該時刻系の日付に変換する
+ #
+ # @param [Numeric] date dynamical date
+ #
+ # @return [Numeric] 当該時刻系の日付
+ #
+ def from_dynamical_date(date)
+ (date - J2000Jan6) / Ratio + @mtc0
+ end
+
+ # universal time を dynamical time に変換する
+ #
+ # @param [Numeric] time universal time
+ #
+ # @return [Numeric] dynamical time
+ #
+ def to_dynamical_time(time)
+ When::TM::JulianDate._d_to_t(
+ to_dynamical_date(
+ When::TM::JulianDate._t_to_d(time)))
+ end
+
+ # dynamical time を universal time に変換する
+ #
+ # @param [Numeric] time dynamical time
+ #
+ # @return [Numeric] universal time
+ #
+ def from_dynamical_time(time)
+ When::TM::JulianDate._d_to_t(
+ from_dynamical_date(
+ When::TM::JulianDate._t_to_d(time)))
+ end
+
+ private
+
+ # オブジェクトの正規化
+ def _normalize(args=[], options={})
+ @location = When.Resource(@location || '_l:long=0&lat=0&datum=Mars')
+ @mtc0 = MTC0 + @location.long / (360.0 * When::Coordinates::Spatial::DEGREE)
+ super
+ end
+ end
+ end
+
+ class CalendarNote
+
+ #
+ # Darian Week
+ #
+ class DarianWeek < WorldWeek
+
+ Notes = [When::BasicTypes::M17n, [
+ "locale:[=en:, ja=ja:, alias]",
+ "names:[Darian]",
+
+ # 年の暦注 ----------------------------
+ [When::BasicTypes::M17n,
+ "names:[year]"
+ ],
+
+ # 月の暦注 ----------------------------
+ [When::BasicTypes::M17n,
+ "names:[month]",
+ [When::BasicTypes::M17n,
+ "names:[Month]"
+ ]
+ ],
+
+ # 日の暦注 ----------------------------
+ [When::BasicTypes::M17n,
+ "names:[day]",
+ [When::BasicTypes::M17n,
+ "names:[Week]",
+ [DayOfWeek, "label:[Solis=, 日曜日]", {'delta'=>7}],
+ [DayOfWeek, "label:[Lunae=, 月曜日]", {'delta'=>7}],
+ [DayOfWeek, "label:[Martis=, 火曜日]", {'delta'=>7}],
+ [DayOfWeek, "label:[Mercurii=, 水曜日]", {'delta'=>7}],
+ [DayOfWeek, "label:[Jovis=, 木曜日]", {'delta'=>7}],
+ [DayOfWeek, "label:[Veneris=, 金曜日]", {'delta'=>7}],
+ [DayOfWeek, "label:[Saturni=, 土曜日]", {'delta'=>7}]
+ ]
+ ]
+ ]]
+
+ #
+ # 当日または直前の solis の日
+ #
+ # @param date [When::TM::TemporalPosition]
+ # @param parameter [nil] 未使用
+ #
+ # @return [When::TM::TemporalPosition]
+ #
+ def solis(date, parameter=nil)
+ date = When.Calendar('Darian').jul_trans(date, {:events=>['from_solis']})
+ y,m,d = date.cal_date
+ dow = (d-1) % 7
+ return date if dow == 0
+ date += When::TM::PeriodDuration.new([0,0,-dow])
+ date.events = ['from_solis']
+ date
+ end
+
+ #
+ # この日は何曜?
+ #
+ # @param [When::TM::TemporalPosition] date
+ # @param [When::TM::CalDate] base (not used)
+ #
+ # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>]
+ #
+ def week(date, base=nil)
+ date = _to_date_for_note(date)
+ index = (date.cal_date.last - 1) % 7
+ {:value=>@days_of_week[index], :position=>[index, 7]}
+ end
+
+ #
+ # 曜日の名前の一覧
+ #
+ # @param [When::TM::TemporalPosition] date (ダミー)
+ #
+ # @return [Array<When::CalendarNote::Week::DayOfWeek>]
+ #
+ def week_labels(date)
+ @days_of_week.child
+ end
+
+ #
+ # 暦日を当該暦注計算用クラスに変換
+ #
+ # @private
+ def _to_date_for_note(date)
+ date = When::Darian ^ date unless date.frame.label.to_s == 'Darian'
+ date
+ end
+
+ private
+
+ # オブジェクトの正規化
+ def _normalize(args=[], options={})
+ @event ||= 'solis'
+ super
+ end
+ end
+ end
+
+ module CalendarTypes
+
+ #
+ # Martian Time, Coordinated
+ #
+ class MTC < UTC
+
+ private
+
+ # オブジェクトの正規化
+ def _normalize(args=[], options={})
+ label = 'MTC'
+ long = @long||0
+ label += "?long=#{long}" unless long.to_f == 0
+ @label = m17n(label)
+ @time_standard = When.Resource("_t:MartianTimeCoordinated?location=(_l:long=#{long}&datum=Mars)")
+ super
+ end
+ end
+
+ #
+ # Darian Calendar
+ #
+ Darian = [CyclicTableBased, {
+ 'label' => 'Martian::Darian',
+ 'time_basis' => 'MTC',
+ 'origin_of_LSC' => -94798,
+ 'indices' => [
+ When.Index('Martian::DarianMonth', {:unit =>24}),
+ When::Coordinates::DefaultDayIndex
+ ],
+ 'rule_table' => {
+ 'T' => {'Rule' =>['LongCentury', ['ShortCentury', 4]]},
+ 'LongCentury' => {'Rule' =>[ ['LongDecade', 10]]},
+ 'ShortCentury' => {'Rule' =>['ShortDecade', ['LongDecade', 9]]},
+ 'LongDecade' => {'Rule' =>[669] * 2 + [668, 669] * 4 },
+ 'ShortDecade' => {'Rule' => [668, 669] * 5 },
+ 668 => {'Length'=>[28, 28, 28, 28, 28, 27] * 4 },
+ 669 => {'Length'=>[28, 28, 28, 28, 28, 27] * 3 + [28] * 6}
+ },
+ 'note' => 'DarianWeek'
+ }]
+ end
+end