when_exe 0.3.7 → 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +210 -171
- data/bin/irb.rc +1 -0
- data/lib/when_exe.rb +78 -53
- data/lib/when_exe/basictypes.rb +27 -8
- data/lib/when_exe/calendarnote.rb +848 -805
- data/lib/when_exe/calendartypes.rb +110 -240
- data/lib/when_exe/coordinates.rb +2440 -2175
- data/lib/when_exe/core/compatibility.rb +1 -1
- data/lib/when_exe/core/duration.rb +13 -11
- data/lib/when_exe/core/extension.rb +38 -45
- data/lib/when_exe/ephemeris.rb +43 -14
- data/lib/when_exe/ephemeris/eclipse.rb +149 -0
- data/lib/when_exe/ephemeris/notes.rb +39 -7
- data/lib/when_exe/icalendar.rb +2 -6
- data/lib/when_exe/inspect.rb +1408 -1399
- data/lib/when_exe/parts/enumerator.rb +486 -477
- data/lib/when_exe/parts/resource.rb +1101 -1069
- data/lib/when_exe/parts/timezone.rb +6 -5
- data/lib/when_exe/region/babylonian.rb +405 -405
- data/lib/when_exe/region/bahai.rb +21 -61
- data/lib/when_exe/region/chinese/epochs.rb +81 -81
- data/lib/when_exe/region/chinese/twins.rb +51 -51
- data/lib/when_exe/region/christian.rb +7 -2
- data/lib/when_exe/region/coptic.rb +1 -1
- data/lib/when_exe/region/discordian.rb +9 -16
- data/lib/when_exe/region/french.rb +1 -1
- data/lib/when_exe/region/hanke_henry.rb +57 -0
- data/lib/when_exe/region/indian.rb +41 -73
- data/lib/when_exe/region/international_fixed.rb +97 -0
- data/lib/when_exe/region/iranian.rb +203 -203
- data/lib/when_exe/region/japanese.rb +13 -13
- data/lib/when_exe/region/japanese/eclipses.rb +1194 -0
- data/lib/when_exe/region/japanese/notes.rb +1482 -1383
- data/lib/when_exe/region/japanese/residues.rb +726 -721
- data/lib/when_exe/region/japanese/twins.rb +37 -37
- data/lib/when_exe/region/jewish.rb +2 -2
- data/lib/when_exe/region/pax.rb +60 -0
- data/lib/when_exe/region/positivist.rb +100 -0
- data/lib/when_exe/region/roman.rb +333 -334
- data/lib/when_exe/region/shire.rb +3 -20
- data/lib/when_exe/region/thai.rb +2 -2
- data/lib/when_exe/region/tibetan.rb +3 -3
- data/lib/when_exe/region/tranquility.rb +208 -0
- data/lib/when_exe/region/vanishing_leprechaun.rb +53 -0
- data/lib/when_exe/region/vietnamese.rb +4 -4
- data/lib/when_exe/region/world.rb +9 -13
- data/lib/when_exe/region/world_season.rb +89 -0
- data/lib/when_exe/region/zoroastrian.rb +4 -2
- data/lib/when_exe/tmobjects.rb +14 -4
- data/lib/when_exe/tmposition.rb +239 -81
- data/lib/when_exe/tmreference.rb +57 -28
- data/lib/when_exe/version.rb +1 -1
- data/link_to_online_documents +6 -3
- data/test/examples/today.rb +1 -1
- data/test/scripts.rb +23 -0
- data/test/scripts/2.ext.rb +169 -0
- data/test/scripts/2.rb +169 -0
- data/test/scripts/3.ext.rb +133 -0
- data/test/scripts/3.rb +134 -0
- data/test/scripts/4.ext.rb +112 -0
- data/test/scripts/4.min.rb +65 -0
- data/test/scripts/4.rb +136 -0
- data/test/scripts/5.ext.rb +78 -0
- data/test/scripts/5.rb +81 -0
- data/test/scripts/6.gcal.rb +131 -0
- data/test/scripts/6.rb +205 -0
- data/test/scripts/6.tz.rb +105 -0
- data/test/scripts/7.phase.rb +109 -0
- data/test/scripts/7.rb +95 -0
- data/test/scripts/7.term.rb +128 -0
- data/test/scripts/7.week.rb +84 -0
- data/test/scripts/8.ext.rb +61 -0
- data/test/scripts/8.rb +62 -0
- data/test/scripts/9.ext.rb +131 -0
- data/test/scripts/9.rb +130 -0
- data/test/scripts/chinese-luni-solar.rb +52 -0
- data/test/{examples → scripts}/geometric_complex.rb +41 -41
- data/test/scripts/geometric_complex.txt +18 -0
- data/test/scripts/korea.rb +59 -0
- data/test/scripts/thai-reviewed.txt +211 -0
- data/test/scripts/thai.rb +36 -0
- data/test/scripts/thai.txt +210 -0
- data/test/test.rb +7 -0
- data/test/test/basictypes.rb +22 -0
- data/test/test/coordinates.rb +2 -1
- data/test/test/ephemeris.rb +34 -2
- data/test/test/icalendar.rb +12 -0
- data/test/test/inspect.rb +37 -1
- data/test/test/parts.rb +4 -3
- data/test/test/region/armenian.rb +20 -0
- data/test/test/region/bahai.rb +58 -0
- data/test/test/region/chinese.rb +14 -3
- data/test/test/region/christian.rb +16 -35
- data/test/test/region/discordian.rb +20 -0
- data/test/test/region/indian.rb +30 -2
- data/test/test/region/japanese.rb +24 -0
- data/test/test/region/jewish.rb +2 -0
- data/test/test/region/m17n.rb +9 -0
- data/test/test/region/reforms.rb +121 -0
- data/test/test/region/residue.rb +17 -11
- data/test/test/region/shire.rb +58 -0
- data/test/test/region/swedish.rb +45 -0
- data/test/test/region/zoroastrian.rb +58 -0
- data/test/test/tmobjects.rb +74 -0
- data/test/test/tmposition.rb +468 -397
- data/when_exe.gemspec +2 -2
- metadata +49 -6
@@ -33,20 +33,22 @@ end
|
|
33
33
|
# Extensions to Date class
|
34
34
|
#
|
35
35
|
# @private
|
36
|
-
|
36
|
+
if ::Object.const_defined?(:Date) && ::Date.method_defined?(:+)
|
37
|
+
class Date
|
37
38
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
39
|
+
alias :_plus_ :+
|
40
|
+
def +(other)
|
41
|
+
other.kind_of?(When::TM::Duration) ? self + other.rational_duration : self._plus_(other)
|
42
|
+
end
|
42
43
|
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
alias :_minus_ :-
|
46
|
+
def -(other)
|
47
|
+
case other
|
48
|
+
when When::TM::Duration ; self - other.rational_duration
|
49
|
+
when When::TimeValue ; self._minus_(other.to_date_or_datetime)
|
50
|
+
else ; self._minus_(other)
|
51
|
+
end
|
50
52
|
end
|
51
53
|
end
|
52
54
|
end
|
@@ -5,7 +5,6 @@
|
|
5
5
|
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
6
6
|
=end
|
7
7
|
|
8
|
-
require 'date'
|
9
8
|
require 'when_exe/core/duration'
|
10
9
|
|
11
10
|
#
|
@@ -53,55 +52,49 @@ end
|
|
53
52
|
#
|
54
53
|
# Extensions to Date class
|
55
54
|
#
|
56
|
-
|
57
|
-
|
58
|
-
|
55
|
+
if ::Object.const_defined?(:Date) && ::Date.method_defined?(:+)
|
56
|
+
class Date
|
57
|
+
|
58
|
+
if When::TM.const_defined?(:TemporalPosition)
|
59
|
+
|
60
|
+
include When::TM::TemporalPosition::Conversion
|
61
|
+
|
62
|
+
#
|
63
|
+
# 対応する When::TM::CalDate or DateAndTime を生成
|
64
|
+
#
|
65
|
+
# @param [Hash] options 暦法や時法などの指定
|
66
|
+
# see {When::TM::TemporalPosition._instance}
|
67
|
+
#
|
68
|
+
# @return [When::TM::CalDate, When::TM::DateAndTime]
|
69
|
+
#
|
70
|
+
# @note 暦法の指定がない場合、start メソッドの値によって
|
71
|
+
# Julian / Gregorian / Civil 暦法を選択する
|
72
|
+
#
|
73
|
+
def tm_pos(options={})
|
74
|
+
options[:frame] ||= When::CalendarTypes::Christian._default_start(self)
|
75
|
+
super(options)
|
76
|
+
end
|
77
|
+
alias :to_tm_pos :tm_pos
|
78
|
+
end
|
59
79
|
|
60
|
-
|
80
|
+
alias :__method_missing :method_missing
|
61
81
|
|
82
|
+
# その他のメソッド
|
62
83
|
#
|
63
|
-
#
|
64
|
-
#
|
65
|
-
#
|
66
|
-
# see {When::TM::TemporalPosition._instance}
|
84
|
+
# @note
|
85
|
+
# self で定義されていないメソッドは
|
86
|
+
# tm_pos で変換して処理する
|
67
87
|
#
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
options[:frame] ||= When::CalendarTypes::Christian._default_start(self)
|
75
|
-
super(options)
|
76
|
-
end
|
77
|
-
alias :to_tm_pos :tm_pos
|
78
|
-
end
|
79
|
-
|
80
|
-
alias :__method_missing :method_missing
|
81
|
-
|
82
|
-
# その他のメソッド
|
83
|
-
#
|
84
|
-
# @note
|
85
|
-
# self で定義されていないメソッドは
|
86
|
-
# tm_pos で変換して処理する
|
87
|
-
#
|
88
|
-
def method_missing(name, *args, &block)
|
89
|
-
return __method_missing(name, *args, &block) if When::Parts::MethodCash::Escape.key?(name)
|
90
|
-
self.class.module_eval %Q{
|
91
|
-
def #{name}(*args, &block)
|
92
|
-
result = tm_pos.send("#{name}", *args, &block)
|
93
|
-
case result
|
94
|
-
when When::TM::DateAndTime ; result.to_date_time
|
95
|
-
when When::TM::CalDate ; result.to_date
|
96
|
-
else ; result
|
88
|
+
def method_missing(name, *args, &block)
|
89
|
+
return __method_missing(name, *args, &block) if When::Parts::MethodCash::Escape.key?(name)
|
90
|
+
self.class.module_eval %Q{
|
91
|
+
def #{name}(*args, &block)
|
92
|
+
result = tm_pos.send("#{name}", *args, &block)
|
93
|
+
result.kind_of?(When::TimeValue) ? result.to_date_or_datetime : result
|
97
94
|
end
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
case result
|
102
|
-
when When::TM::DateAndTime ; result.to_date_time
|
103
|
-
when When::TM::CalDate ; result.to_date
|
104
|
-
else ; result
|
95
|
+
} unless When::Parts::MethodCash.escape(name)
|
96
|
+
result = tm_pos.send(name, *args, &block)
|
97
|
+
result.kind_of?(When::TimeValue) ? result.to_date_or_datetime : result
|
105
98
|
end
|
106
99
|
end
|
107
100
|
end
|
data/lib/when_exe/ephemeris.rb
CHANGED
@@ -289,12 +289,10 @@ module When::Ephemeris
|
|
289
289
|
def root(t0, y0=nil, delta=0, count=10, error=1E-6, &func)
|
290
290
|
|
291
291
|
# 近似値0,1
|
292
|
-
|
293
|
-
|
294
|
-
t = [t0-d, t0+d ]
|
292
|
+
diff = [0.01, error*1000].min
|
293
|
+
t = [t0-diff, t0+diff ]
|
295
294
|
y = [func.call(t[0]), func.call(t[1])]
|
296
295
|
y.map! {|y1| _adjust(y1, y0, delta)} unless delta==0
|
297
|
-
# printf("t=%20.7f,L=%20.7f\n",t[1],y[1])
|
298
296
|
|
299
297
|
# 近似値2(1次関数による近似)
|
300
298
|
t << (y0 ? (t[1]-t[0])/(y[1]-y[0])*(y0-y[0])+t[0] : t0)
|
@@ -319,15 +317,19 @@ module When::Ephemeris
|
|
319
317
|
|
320
318
|
if y0
|
321
319
|
# 判別式
|
322
|
-
if (
|
323
|
-
|
324
|
-
|
320
|
+
if (discriminant = b*b-4*a*(c-y0)) < 0
|
321
|
+
# 近似値(1次関数による近似)
|
322
|
+
if y12 == 0
|
323
|
+
i = -1
|
324
|
+
break
|
325
|
+
end
|
326
|
+
t << t12/y12*(y0-y[1]) + t[1]
|
327
|
+
else
|
328
|
+
# 近似値(2次関数による近似)
|
329
|
+
sqrtd = Math.sqrt(discriminant)
|
330
|
+
sqrtd = -sqrtd if b < 0
|
331
|
+
t << (t[2] + 2*(y0-c)/(b+sqrtd)) # <-桁落ち回避
|
325
332
|
end
|
326
|
-
|
327
|
-
# 近似値(2次関数による近似)
|
328
|
-
sqrtd = Math.sqrt(d)
|
329
|
-
sqrtd = -sqrtd if b < 0
|
330
|
-
t << (t[2] + 2*(y0-c)/(b+sqrtd)) # <-桁落ち回避
|
331
333
|
else
|
332
334
|
t << (t[2] - b / (2*a))
|
333
335
|
end
|
@@ -1117,7 +1119,7 @@ module When::Ephemeris
|
|
1117
1119
|
#
|
1118
1120
|
# @return [Numeric]
|
1119
1121
|
#
|
1120
|
-
def
|
1122
|
+
def phase_of_eclipse(t, target, base=Earth)
|
1121
1123
|
t = +t
|
1122
1124
|
distance = acos(self.coords(t, base).spherical_law_of_cosines(target.coords(t, base))) / CIRCLE
|
1123
1125
|
self_radius = self.apparent_radius(t, base)
|
@@ -1477,6 +1479,33 @@ module When::Ephemeris
|
|
1477
1479
|
day_event_in_the_day(t, 0, When.Resource('_ep:Moon'))
|
1478
1480
|
end
|
1479
1481
|
|
1482
|
+
# 日食の情報
|
1483
|
+
#
|
1484
|
+
# @param [When::TM::TemporalPosition] date
|
1485
|
+
# @param [Range<When::TM::TemporalPosition>] date
|
1486
|
+
# @param [Block] block
|
1487
|
+
#
|
1488
|
+
# @return [Array<String, Numeric, Array<Array<Numeric or When::TM::TemporalPosition, String>>>] 食の情報(のArray(dateがRangeの場合))
|
1489
|
+
# @see When::Coordinates::Spatial#eclipse_info
|
1490
|
+
#
|
1491
|
+
def solar_eclipse(date, &block)
|
1492
|
+
location.solar_eclipse(date, &block)
|
1493
|
+
end
|
1494
|
+
|
1495
|
+
# 月食の情報
|
1496
|
+
#
|
1497
|
+
# @param [When::TM::TemporalPosition] date
|
1498
|
+
# @param [Range<When::TM::TemporalPosition>] date
|
1499
|
+
# @note Rangeの場合午前6時より前は前日扱い
|
1500
|
+
# @param [Block] block
|
1501
|
+
#
|
1502
|
+
# @return [Array<String, Numeric, Array<Array<Numeric or When::TM::TemporalPosition, String>>>] 食の情報(のArray(dateがRangeの場合))
|
1503
|
+
# @see When::Coordinates::Spatial#eclipse_info
|
1504
|
+
#
|
1505
|
+
def lunar_eclipse(date, &block)
|
1506
|
+
location.lunar_eclipse(date, &block)
|
1507
|
+
end
|
1508
|
+
|
1480
1509
|
# 恒星の出没と太陽の位置関係に関するイベントの日時
|
1481
1510
|
#
|
1482
1511
|
# @param [Numeric] t ユリウス日(Terrestrial Time)
|
@@ -1568,7 +1597,7 @@ module When::Ephemeris
|
|
1568
1597
|
@long, @lat, @alt = [@location.long / When::Coordinates::Spatial::DEGREE,
|
1569
1598
|
@location.lat / When::Coordinates::Spatial::DEGREE,
|
1570
1599
|
@location.alt] if @location
|
1571
|
-
@formula ||= '
|
1600
|
+
@formula ||= '1S'
|
1572
1601
|
@time_standard ||= 'dynamical'
|
1573
1602
|
@is_dynamical = (@time_standard[0..0].downcase == 'd')
|
1574
1603
|
|
@@ -0,0 +1,149 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
=begin
|
3
|
+
Copyright (C) 2014 Takashi SUGA
|
4
|
+
|
5
|
+
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
6
|
+
=end
|
7
|
+
|
8
|
+
class When::Coordinates::Spatial
|
9
|
+
|
10
|
+
# @private
|
11
|
+
EclipseHalfYear = (346 + (14*3600+52*60+54.965) / 86400) / 2
|
12
|
+
|
13
|
+
# @private
|
14
|
+
EclipseRange = (75.0..120.0) # 82.05003457775217..114.62097737290446
|
15
|
+
|
16
|
+
# 日食の情報
|
17
|
+
#
|
18
|
+
# @param [When::TM::TemporalPosition] date
|
19
|
+
# @param [Range<When::TM::TemporalPosition>] date
|
20
|
+
# @param [Block] block
|
21
|
+
#
|
22
|
+
# @return [Array<String, Numeric, Array<Array<Numeric or When::TM::TemporalPosition, String>>>] 食の情報(のArray(dateがRangeの場合))
|
23
|
+
# @see When::Coordinates::Spatial#eclipse_info
|
24
|
+
#
|
25
|
+
def solar_eclipse(date, &block)
|
26
|
+
if date.kind_of?(Range)
|
27
|
+
last = date.last.to_i
|
28
|
+
last -= 1 if date.exclude_end?
|
29
|
+
first = date.first.to_i
|
30
|
+
date = date.first
|
31
|
+
end
|
32
|
+
clock = date.clock && (date.clock.tz_prop || date.clock.label)
|
33
|
+
cn = @mean.time_to_cn(date).round
|
34
|
+
list = []
|
35
|
+
loop do
|
36
|
+
unless @ecls.key?([cn,clock.to_s])
|
37
|
+
time = @mean.cn_to_time(cn)
|
38
|
+
data = EclipseRange.include?(time % EclipseHalfYear) ?
|
39
|
+
eclipse_info(@mean._to_seed_type(time, date), self, When.Resource('_ep:Sun'), When.Resource('_ep:Moon')) : nil
|
40
|
+
@ecls[[cn,clock.to_s]] = data ? [data[2][data[2].size / 2][0].to_i, data] : nil
|
41
|
+
end
|
42
|
+
key, info = @ecls[[cn,clock.to_s]]
|
43
|
+
return info unless first
|
44
|
+
list << (block_given? ? yield(info) : info) if key && first <= key && key <= last
|
45
|
+
break if (key || first) >= last
|
46
|
+
cn += 1
|
47
|
+
end
|
48
|
+
return list
|
49
|
+
end
|
50
|
+
|
51
|
+
# 月食の情報
|
52
|
+
#
|
53
|
+
# @param [When::TM::TemporalPosition] date
|
54
|
+
# @param [Range<When::TM::TemporalPosition>] date
|
55
|
+
# @note Rangeの場合午前6時より前は前日扱い
|
56
|
+
# @param [Block] block
|
57
|
+
#
|
58
|
+
# @return [Array<String, Numeric, Array<Array<Numeric or When::TM::TemporalPosition, String>>>] 食の情報(のArray(dateがRangeの場合))
|
59
|
+
# @see When::Coordinates::Spatial#eclipse_info
|
60
|
+
#
|
61
|
+
def lunar_eclipse(date, &block)
|
62
|
+
if date.kind_of?(Range)
|
63
|
+
last = date.last.to_i
|
64
|
+
last -= 1 if date.exclude_end?
|
65
|
+
first = date.first.to_i
|
66
|
+
date = date.first
|
67
|
+
end
|
68
|
+
clock = date.clock && (date.clock.tz_prop || date.clock.label)
|
69
|
+
cn = (@mean.time_to_cn(date)+0.25).floor+0.5
|
70
|
+
list = []
|
71
|
+
loop do
|
72
|
+
unless @ecls.key?([cn,clock.to_s])
|
73
|
+
time = @mean.cn_to_time(cn)
|
74
|
+
data = EclipseRange.include?(time % EclipseHalfYear) ?
|
75
|
+
eclipse_info(@mean._to_seed_type(time, date), When.Resource('_ep:Earth'), When.Resource('_ep:Moon'),
|
76
|
+
When.Resource('_ep:Shadow'), [self, When.Resource('_ep:Moon')]) : nil
|
77
|
+
@ecls[[cn,clock.to_s]] = data ? [(data[2][data[2].size / 2][0]-When::PT6H).to_i, data] : nil
|
78
|
+
end
|
79
|
+
key, info = @ecls[[cn,clock.to_s]]
|
80
|
+
return info unless first
|
81
|
+
list << (block_given? ? yield(info) : info) if key && first <= key && key <= last
|
82
|
+
break if (key || first) >= last
|
83
|
+
cn += 1
|
84
|
+
end
|
85
|
+
return list
|
86
|
+
end
|
87
|
+
|
88
|
+
# 食の情報
|
89
|
+
#
|
90
|
+
# @param [Numeric] date ユリウス日(Terrestrial Time)
|
91
|
+
# @param [When::TM::TemporalPosition] date
|
92
|
+
# @param [When::Ephemeris::Datum or When::Coordinates::Spatial] location 観測地
|
93
|
+
# @param [When::Ephemeris::Datum] target 隠される天体
|
94
|
+
# @param [When::Ephemeris::Datum] base 隠す天体
|
95
|
+
# @param [Array<When::Coordinates::Spatial, When::Ephemeris::Datum>] l_for_h 高度を計算する観測地と対象天体
|
96
|
+
#
|
97
|
+
# @return [Array<String, Numeric, Array<Array<Numeric or When::TM::TemporalPosition, String>>>] 食の情報
|
98
|
+
#
|
99
|
+
# [ String - 食の種類 'T' 皆既食, 'A' 金環食, 'P' 部分食, 'B' 帯食]
|
100
|
+
# [ Numeric - 最大食分 ]
|
101
|
+
# [ Array - 第1~4接触の日時と地平座標(高度/方位角) ]
|
102
|
+
#
|
103
|
+
def eclipse_info(date, location, target, base, l_for_h=[location, base])
|
104
|
+
|
105
|
+
tc = When::Ephemeris.root(+date) {|t| # 離角最小日時
|
106
|
+
base.elongation(t, target, location)**2
|
107
|
+
}
|
108
|
+
mag = base.phase_of_eclipse(tc, target, location) # 食分
|
109
|
+
return nil unless mag >= 0 # 食なし
|
110
|
+
|
111
|
+
t1, t4 = [-0.1, +0.1].map {|dt| # 第1, 第4接触
|
112
|
+
When::Ephemeris.root(tc+dt, 0) {|t|
|
113
|
+
base.phase_of_eclipse(t, target, location)
|
114
|
+
}
|
115
|
+
}
|
116
|
+
|
117
|
+
if mag >= 1
|
118
|
+
category = 'T'
|
119
|
+
t2, t3 = [-0.01, +0.01].map {|dt| # 第2, 第3接触
|
120
|
+
When::Ephemeris.root(tc+dt, 1.0) {|t|
|
121
|
+
base.phase_of_eclipse(t, target, location)
|
122
|
+
}
|
123
|
+
}
|
124
|
+
elsif target.phase_of_eclipse(tc, base, location) >= 1
|
125
|
+
category = 'A'
|
126
|
+
t2, t3 = [-0.01, +0.01].map {|dt| # 第2, 第3接触
|
127
|
+
When::Ephemeris.root(tc+dt, 1.0) {|t|
|
128
|
+
target.phase_of_eclipse(t, base, location)
|
129
|
+
}
|
130
|
+
}
|
131
|
+
else
|
132
|
+
category = 'P'
|
133
|
+
end
|
134
|
+
ts = [t1,t2,tc,t3,t4].compact
|
135
|
+
|
136
|
+
form = When::Ephemeris::Formula.new(:location=>l_for_h[0])
|
137
|
+
height, azimuth = ts.map {|t| # 基準天体の高度・方位角
|
138
|
+
coord = form._coords(t, HORIZONTAL, l_for_h[1])
|
139
|
+
[coord.theta * 360, ((0.5-coord.phi)-(0.5-coord.phi).floor) * 360]
|
140
|
+
}.transpose
|
141
|
+
return nil unless height.max >= 0 # 見えない食
|
142
|
+
category += 'B' if height.min < 0 # 地平線下で食が始まる/終わる
|
143
|
+
|
144
|
+
[category, mag, [ts.map {|t| form._to_seed_type(t, date)}, height, azimuth].transpose]
|
145
|
+
|
146
|
+
rescue RangeError
|
147
|
+
nil
|
148
|
+
end
|
149
|
+
end
|
@@ -58,8 +58,10 @@ class When::CalendarNote
|
|
58
58
|
#
|
59
59
|
# @return [When::TM::CalDate] date またはその直後のイベントの日時
|
60
60
|
#
|
61
|
-
def event_eval(date, parameter=@event, precision=
|
62
|
-
|
61
|
+
def event_eval(date, parameter=@event, precision=nil)
|
62
|
+
date = When.when?(date) unless date.kind_of?(When::TimeValue)
|
63
|
+
precision ||= date.precision
|
64
|
+
num, den = parameter.kind_of?(String) ? (parameter[/\d.*\z/]||'').split(/\//, 2) : parameter
|
63
65
|
num = (num || @num).to_f
|
64
66
|
den = (den || @den).to_f
|
65
67
|
date = date.floor(precision) if precision < date.precision
|
@@ -67,14 +69,24 @@ class When::CalendarNote
|
|
67
69
|
is_date_and_time = options.key?(:clock) || precision > When::DAY
|
68
70
|
options[:precision] = precision
|
69
71
|
options[:clock] ||= date.frame.time_basis || When::TM::Clock.local_time
|
72
|
+
sdn = _the_date(date, num, den)
|
73
|
+
time = When::TM::JulianDate._d_to_t(sdn)
|
74
|
+
if @formula.is_dynamical
|
75
|
+
time = date.time_standard.from_dynamical_time(time)
|
76
|
+
time += options[:clock].universal_time(sdn.round) if options[:clock].kind_of?(When::CalendarTypes::LocalTime)
|
77
|
+
end
|
78
|
+
event = date.frame.jul_trans(When::TM::JulianDate.universal_time(time), options)
|
79
|
+
is_date_and_time ? event : event.to_cal_date
|
80
|
+
end
|
81
|
+
|
82
|
+
# the event date
|
83
|
+
def _the_date(date, num, den)
|
70
84
|
quot, mod = (@formula.time_to_cn(date)*30.0).divmod(den)
|
71
85
|
cycle = quot * den + num
|
72
86
|
cycle += den if mod > (num % den)
|
73
|
-
|
74
|
-
time = date.time_standard.from_dynamical_time(time) if @formula.is_dynamical
|
75
|
-
event = date.frame.jul_trans(When::TM::JulianDate.universal_time(time), options)
|
76
|
-
is_date_and_time ? event : event.to_cal_date
|
87
|
+
@formula.cn_to_time(cycle/30.0)
|
77
88
|
end
|
89
|
+
private :_the_date
|
78
90
|
|
79
91
|
# 日付に対応する座標
|
80
92
|
#
|
@@ -114,7 +126,7 @@ class When::CalendarNote
|
|
114
126
|
def event_time(date, event_name, event)
|
115
127
|
etime = term(date - When.Duration('P3D'), event, When::SYSTEM)
|
116
128
|
if formula.respond_to?(:year_length) && formula.denominator && formula.denominator < 100000
|
117
|
-
fraction = etime.clk_time.
|
129
|
+
fraction = etime.clk_time.local_time
|
118
130
|
fraction += When::TM::Duration::DAY * (etime.to_i - date.to_i)
|
119
131
|
fraction = (fraction / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
|
120
132
|
fraction = fraction.to_i if fraction == fraction.to_i
|
@@ -159,6 +171,26 @@ class When::CalendarNote
|
|
159
171
|
end
|
160
172
|
end
|
161
173
|
|
174
|
+
#
|
175
|
+
# 冬至を定気で計算し、その他の二十四節気を前後の冬至の日時を時間で等分して求める
|
176
|
+
#
|
177
|
+
class SolarTermsRevised < SolarTerms
|
178
|
+
|
179
|
+
# the event date
|
180
|
+
def _the_date(date, num, den)
|
181
|
+
quot, mod = @formula.time_to_cn(date).divmod(12)
|
182
|
+
quot += 1 if mod >= 9
|
183
|
+
range = [12*quot-3, 12*quot+9].map {|cn| [cn*30, @formula.cn_to_time(cn)]}
|
184
|
+
time = @formula.is_dynamical ? +date : date.to_f
|
185
|
+
now = [range[0][0] + (range[1][0] - range[0][0]) / (range[1][1] - range[0][1]) * (time - range[0][1]), time]
|
186
|
+
|
187
|
+
quot, mod = now[0].divmod(den)
|
188
|
+
cycle = quot * den + num
|
189
|
+
cycle += den if mod > (num % den)
|
190
|
+
range[0][1] + (range[1][1] - range[0][1]) / (range[1][0] - range[0][0]) * (cycle - range[0][0])
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
162
194
|
#
|
163
195
|
# 月の位相
|
164
196
|
#
|