when_exe 0.3.2 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. data/LICENSE.ja.txt +25 -25
  2. data/LICENSE.txt +31 -31
  3. data/bin/locales.rb +2 -1
  4. data/bin/when.rb.config +1 -1
  5. data/lib/when_exe.rb +70 -48
  6. data/lib/when_exe/basictypes.rb +99 -65
  7. data/lib/when_exe/calendartypes.rb +40 -178
  8. data/lib/when_exe/coordinates.rb +156 -62
  9. data/lib/when_exe/core/compatibility.rb +10 -0
  10. data/lib/when_exe/core/extension.rb +40 -0
  11. data/lib/when_exe/ephemeris.rb +112 -50
  12. data/lib/when_exe/icalendar.rb +125 -91
  13. data/lib/when_exe/inspect.rb +100 -48
  14. data/lib/when_exe/locales/ar.rb +48 -48
  15. data/lib/when_exe/locales/bg.rb +1 -1
  16. data/lib/when_exe/locales/bs.rb +4 -2
  17. data/lib/when_exe/locales/ca.rb +1 -1
  18. data/lib/when_exe/locales/en_CA.rb +3 -4
  19. data/lib/when_exe/locales/en_IE.rb +88 -0
  20. data/lib/when_exe/locales/en_US.rb +87 -0
  21. data/lib/when_exe/locales/es_CR.rb +84 -0
  22. data/lib/when_exe/locales/es_EC.rb +85 -0
  23. data/lib/when_exe/locales/es_PA.rb +85 -0
  24. data/lib/when_exe/locales/fr.rb +39 -39
  25. data/lib/when_exe/locales/hu.rb +15 -14
  26. data/lib/when_exe/locales/it.rb +1 -1
  27. data/lib/when_exe/locales/ja.rb +2 -2
  28. data/lib/when_exe/locales/locales.rb +7 -0
  29. data/lib/when_exe/locales/lt.rb +21 -19
  30. data/lib/when_exe/locales/ms.rb +84 -0
  31. data/lib/when_exe/locales/nl.rb +2 -2
  32. data/lib/when_exe/locales/ru.rb +1 -1
  33. data/lib/when_exe/locales/uk.rb +1 -1
  34. data/lib/when_exe/locales/ur.rb +84 -0
  35. data/lib/when_exe/mini_application.rb +44 -43
  36. data/lib/when_exe/parts/enumerator.rb +3 -3
  37. data/lib/when_exe/parts/geometric_complex.rb +6 -1
  38. data/lib/when_exe/parts/locale.rb +49 -18
  39. data/lib/when_exe/parts/method_cash.rb +61 -0
  40. data/lib/when_exe/parts/resource.rb +221 -106
  41. data/lib/when_exe/parts/timezone.rb +70 -33
  42. data/lib/when_exe/region/bahai.rb +2 -2
  43. data/lib/when_exe/region/balinese.rb +40 -43
  44. data/lib/when_exe/region/chinese.rb +93 -33
  45. data/lib/when_exe/region/chinese_calendar.rb +117 -1
  46. data/lib/when_exe/region/chinese_epoch.rb +65 -10
  47. data/lib/when_exe/region/christian.rb +97 -2
  48. data/lib/when_exe/region/ephemeric_notes.rb +353 -0
  49. data/lib/when_exe/region/french.rb +1 -1
  50. data/lib/when_exe/region/geologicalage.rb +171 -171
  51. data/lib/when_exe/region/indian.rb +18 -14
  52. data/lib/when_exe/region/iranian.rb +1 -1
  53. data/lib/when_exe/region/japanese.rb +49 -12
  54. data/lib/when_exe/region/japanese_notes.rb +838 -507
  55. data/lib/when_exe/region/japanese_residues.rb +724 -662
  56. data/lib/when_exe/region/javanese.rb +7 -7
  57. data/lib/when_exe/region/mayan.rb +19 -17
  58. data/lib/when_exe/region/nihon_shoki.rb +3 -3
  59. data/lib/when_exe/region/residue.rb +29 -28
  60. data/lib/when_exe/region/shire.rb +2 -2
  61. data/lib/when_exe/region/tibetan.rb +87 -5
  62. data/lib/when_exe/region/world.rb +1 -1
  63. data/lib/when_exe/timestandard.rb +85 -7
  64. data/lib/when_exe/tmobjects.rb +32 -4
  65. data/lib/when_exe/tmposition.rb +104 -55
  66. data/lib/when_exe/tmreference.rb +157 -60
  67. data/lib/when_exe/version.rb +2 -2
  68. data/test/examples/JapanHolidays.ics +3 -3
  69. data/test/examples/JapanHolidaysRFC6350.ics +499 -0
  70. data/test/examples/Residue.m17n +3 -2
  71. data/test/examples/Spatial.m17n +3 -3
  72. data/test/examples/USA-DST.ics +27 -27
  73. data/test/examples/today.rb +1 -1
  74. data/test/test.rb +4 -2
  75. data/test/test/basictypes.rb +40 -15
  76. data/test/test/coordinates.rb +9 -4
  77. data/test/test/icalendar.rb +24 -14
  78. data/test/test/inspect.rb +5 -3
  79. data/test/test/parts.rb +11 -2
  80. data/test/test/region/chinese.rb +4 -4
  81. data/test/test/region/civil.rb +124 -0
  82. data/test/test/region/geologicalage.rb +5 -2
  83. data/test/test/region/indian.rb +2 -0
  84. data/test/test/region/japanese.rb +156 -1
  85. data/test/test/region/jewish.rb +3 -3
  86. data/test/test/region/m17n.rb +9 -9
  87. data/test/test/region/mayan.rb +122 -5
  88. data/test/test/region/residue.rb +1 -1
  89. data/test/test/tmobjects.rb +27 -64
  90. data/test/test/tmposition.rb +48 -1
  91. data/test/test/tmreference.rb +66 -4
  92. data/when_exe.gemspec +1 -1
  93. metadata +15 -6
@@ -42,6 +42,16 @@ class String
42
42
  end
43
43
  end
44
44
  end
45
+
46
+ unless "1".respond_to?(:ord)
47
+ # 文字列の先頭文字のコードを取得する
48
+ # (多バイト文字非対応)
49
+ #
50
+ # @return [Integer]
51
+ def ord
52
+ self[0]
53
+ end
54
+ end
45
55
  end
46
56
 
47
57
  #
@@ -5,6 +5,7 @@
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'
8
9
  require 'when_exe/core/duration'
9
10
 
10
11
  #
@@ -27,6 +28,7 @@ class Time
27
28
  # @note core/extension
28
29
  #
29
30
  def julian_date(options={})
31
+ options[:clock] ||= Clock(self.utc_offset)
30
32
  When::TM::JulianDate.universal_time(self.to_f * When::TM::IntervalLength::SECOND, options)
31
33
  end
32
34
  alias :to_julian_date :julian_date
@@ -55,6 +57,33 @@ class Date
55
57
 
56
58
  include When::TM::TemporalPosition::Conversion if When::TM.const_defined?(:TemporalPosition)
57
59
 
60
+ alias :__method_missing :method_missing
61
+
62
+ # その他のメソッド
63
+ #
64
+ # @note
65
+ # self で定義されていないメソッドは
66
+ # tm_position で変換して処理する
67
+ #
68
+ def method_missing(name, *args, &block)
69
+ return __method_missing(name, *args, &block) if When::Parts::MethodCash::Escape.key?(name)
70
+ self.class.module_eval %Q{
71
+ def #{name}(*args, &block)
72
+ result = tm_position.send("#{name}", *args, &block)
73
+ case result
74
+ when When::TM::DateAndTime ; result.to_date_time
75
+ when When::TM::CalDate ; result.to_date
76
+ else ; result
77
+ end
78
+ end
79
+ } unless When::Parts::MethodCash.escape(name)
80
+ result = tm_position.send(name, *args, &block)
81
+ case result
82
+ when When::TM::DateAndTime ; result.to_date_time
83
+ when When::TM::CalDate ; result.to_date
84
+ else ; result
85
+ end
86
+ end
58
87
  end
59
88
 
60
89
  #
@@ -392,4 +421,15 @@ class Array
392
421
  When.TemporalPosition(*(self.dup << options))
393
422
  end
394
423
  alias :to_tm_position :tm_position
424
+
425
+ # self を[幹,枝]と解釈してWhen::Coordinates::Pair を生成
426
+ #
427
+ # @see When::Coordinates::Pair._force_pair
428
+ #
429
+ # @return [When::Coordinates::Pair]
430
+ #
431
+ def to_pair
432
+ Coordinates::Pair._force_pair(*self)
433
+ end
434
+ alias :pair :to_pair
395
435
  end
@@ -1,6 +1,6 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  =begin
3
- Copyright (C) 2011-2013 Takashi SUGA
3
+ Copyright (C) 2011-2014 Takashi SUGA
4
4
 
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
@@ -279,28 +279,32 @@ module When::Ephemeris
279
279
  #
280
280
  # @param [Numeric] t0 独立変数の初期近似値
281
281
  # @param [Numeric] y0 逆変換される関数値(nil なら極値を求める)
282
+ # @param [Numeric] delta 戻り値が周期量である場合の周期
282
283
  # @param [Numeric] count 収束までの最大繰り返し回数
283
284
  # @param [Float] error 収束と判断する誤差
284
285
  # @param [Block] func 逆変換される関数
285
286
  #
286
287
  # @return [Numeric] 逆変換結果
287
288
  #
288
- def root(t0, y0=nil, count=10, error=1E-6, &func)
289
+ def root(t0, y0=nil, delta=0, count=10, error=1E-6, &func)
289
290
 
290
291
  # 近似値0,1
291
292
  # printf("y0=%20.7f\n",y0)
292
- t = [t0, t0+0.1 ]
293
- y = [func.call(t[0]), func.call(t[1])]
293
+ d = [0.01, error * 10].max
294
+ t = [t0-d, t0+d ]
295
+ y = [func.call(t[0]), func.call(t[1])]
296
+ y.map! {|y1| _adjust(y1, y0, delta)} unless delta==0
294
297
  # printf("t=%20.7f,L=%20.7f\n",t[1],y[1])
295
298
 
296
299
  # 近似値2(1次関数による近似)
297
- t << (y0 ? (t[1]-t[0])/(y[1]-y[0])*(y0-y[0])+t[0] : t0-0.1)
300
+ t << (y0 ? (t[1]-t[0])/(y[1]-y[0])*(y0-y[0])+t[0] : t0)
298
301
 
299
302
  # 繰り返し
300
303
  i = count
301
304
  while ((t[2]-t[1]).abs > error) && (i > 0)
302
305
  # 予備計算
303
306
  y << func.call(t[2])
307
+ y[2] = _adjust(y[2], y0, delta) unless delta==0
304
308
  break if y0 && (y[2]-y0).abs <= error / 10
305
309
 
306
310
  # printf("t=%20.7f,L=%20.7f\n",t[2],y[2])
@@ -330,11 +334,18 @@ module When::Ephemeris
330
334
 
331
335
  t.shift
332
336
  y.shift
337
+ i -= 1
333
338
  end
334
339
  raise RangeError, "The result does not converge." if i<=0
335
340
  return t[2]
336
341
  end
337
342
 
343
+ # y が周期量である場合の周期の補正
344
+ def _adjust(y1, y0, delta)
345
+ (-2..+2).to_a.map {|i| y1 + i * delta}.sort_by {|y| (y-y0).abs}[0]
346
+ end
347
+ private :_adjust
348
+
338
349
  #
339
350
  # 天体の座標
340
351
  #
@@ -403,7 +414,7 @@ module When::Ephemeris
403
414
  def polar
404
415
  @phi, @theta, @radius = _to_p3(@x, @y, @z) unless @radius
405
416
  @c ||= @phi
406
- @phi -= (@phi - @c + 0.5).floor
417
+ @phi -= (@phi - @c).round
407
418
  return [@phi, @theta, @radius, @c]
408
419
  end
409
420
 
@@ -607,6 +618,30 @@ module When::Ephemeris
607
618
  rotate_z(-0.25 + n.radius)
608
619
  end
609
620
 
621
+ # 赤道座標 -> 赤道座標[時角]
622
+ #
623
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
624
+ # @param [When::TM::TemporalPosition] t
625
+ # @param [When::Coordinates::Spatial] loc 観測地
626
+ #
627
+ # @return [When::Ephemeris::Coords]
628
+ #
629
+ def r_to_rh(t, loc)
630
+ rotate_z(-loc.local_sidereal_time(t) / 24)
631
+ end
632
+
633
+ # 赤道座標[時角] -> 地平座標
634
+ #
635
+ # @param [Numeric] t ユリウス日(Terrestrial Time)
636
+ # @param [When::TM::TemporalPosition] t
637
+ # @param [When::Coordinates::Spatial] loc 観測地
638
+ #
639
+ # @return [When::Ephemeris::Coords]
640
+ #
641
+ def rh_to_h(t, loc)
642
+ rotate_y(loc.lat / (360.0*When::Coordinates::Spatial::DEGREE) - 0.25)
643
+ end
644
+
610
645
  # 赤道座標 -> 地平座標
611
646
  #
612
647
  # @param [Numeric] t ユリウス日(Terrestrial Time)
@@ -698,7 +733,7 @@ module When::Ephemeris
698
733
  @theta ||= 0.0 # 緯度
699
734
  @radius ||= 1.0 # 距離
700
735
  @c ||= @phi # 周期番号
701
- @phi -= (@phi - @c + 0.5).floor
736
+ @phi -= (@phi - @c).round
702
737
  end
703
738
  end
704
739
  end
@@ -1150,8 +1185,10 @@ module When::Ephemeris
1150
1185
  def forwarded_formula(name, date)
1151
1186
  return nil unless When::Ephemeris::Formula.method_defined?(name)
1152
1187
  return @formula[0] if @formula && @formula[0].location
1153
- return When.Resource('_ep:Formula?location=' + date.location.iri.gsub('&', '%26')) if date.respond_to?(:location)
1154
- nil
1188
+ location = date.location if date.respond_to?(:location)
1189
+ location ||= When::Coordinates::Spatial.default_location
1190
+ return nil unless location
1191
+ When.Resource('_ep:Formula?location=(' + location.iri + ')')
1155
1192
  end
1156
1193
  end
1157
1194
 
@@ -1171,6 +1208,10 @@ module When::Ephemeris
1171
1208
  # @return [Numeric]
1172
1209
  attr_reader :lat
1173
1210
 
1211
+ # 観測地の高度 / m
1212
+ # @return [Numeric]
1213
+ attr_reader :alt
1214
+
1174
1215
  # 時刻系('universal' or 'dynamical')
1175
1216
  # @return [String]
1176
1217
  attr_reader :time_standard
@@ -1221,6 +1262,20 @@ module When::Ephemeris
1221
1262
  root(time0, cn) {|t| time_to_cn(t)}
1222
1263
  end
1223
1264
 
1265
+ # 当該日付のthiti の変化範囲
1266
+ #
1267
+ # @param [When::TM::TemporalPosition] date 日付
1268
+ #
1269
+ # @return [Range] 当該日付のthiti の変化範囲(朔を含む場合 nil)
1270
+ #
1271
+ def thiti_range(date)
1272
+ date = date.floor
1273
+ p0, p1 = [date, date.succ].map {|d|
1274
+ (30.0 * time_to_cn(d)) % 30.0
1275
+ }
1276
+ p0 >= p1 ? nil : p0...p1
1277
+ end
1278
+
1224
1279
  # 指定の周期番号パターンになる最も近い過去の日時
1225
1280
  #
1226
1281
  # @param [Numeric] date ユリウス日(Terrestrial Time)
@@ -1244,9 +1299,10 @@ module When::Ephemeris
1244
1299
  # @param [When::TM::TemporalPosition] t
1245
1300
  # @param [Integer] system 座標系
1246
1301
  #
1247
- # [ 0 - When::Coordinates::Spatial::ECLIPTIC (黄道座標) ]
1248
- # [ 1 - When::Coordinates::Spatial::EQUATORIAL (赤道座標) ]
1249
- # [ 2 - When::Coordinates::Spatial::HORIZONTAL (地平座標) ]
1302
+ # [ 0 - 黄道座標 When::Coordinates::Spatial::ECLIPTIC ]
1303
+ # [ 1 - 赤道座標 When::Coordinates::Spatial::EQUATORIAL ]
1304
+ # [ 2 - 赤道座標[時角] When::Coordinates::Spatial::EQUATORIAL_HA ]
1305
+ # [ 3 - 地平座標 When::Coordinates::Spatial::HORIZONTAL ]
1250
1306
  #
1251
1307
  # @param [When::Ephemeris::CelestialObject] target 対象星
1252
1308
  #
@@ -1254,8 +1310,9 @@ module When::Ephemeris
1254
1310
  #
1255
1311
  def _coords(t, system, target)
1256
1312
  pos = target.coords(t, @location)
1257
- pos = pos.y_to_r(t, @location) if system >= 1
1258
- pos = pos.r_to_h(t, @location) if system >= 2
1313
+ pos = pos.y_to_r(t, @location) if system >= When::Coordinates::Spatial::EQUATORIAL
1314
+ pos = pos.r_to_rh(t, @location) if system >= When::Coordinates::Spatial::EQUATORIAL_HA
1315
+ pos = pos.rh_to_h(t, @location) if system >= When::Coordinates::Spatial::HORIZONTAL
1259
1316
  return pos
1260
1317
  end
1261
1318
 
@@ -1312,15 +1369,15 @@ module When::Ephemeris
1312
1369
  def day_event(t, event, target=When.Resource('_ep:Sun'), height=nil)
1313
1370
  # 時刻の初期値
1314
1371
  dl = @location.long / (360.0 * When::Coordinates::Spatial::DEGREE)
1315
- t0 = (+t + 0.5 + dl).floor - dl
1372
+ t0 = (+t + dl).round - dl
1316
1373
  dt = _coords(t0, When::Coordinates::Spatial::EQUATORIAL, target).phi -
1317
1374
  @location.local_sidereal_time(t0) / 24.0 + 0.25 * (event||0)
1318
- t0 += dt - (dt+0.5).floor
1375
+ t0 += dt - dt.round
1319
1376
 
1320
1377
  # 天体の地平座標での高度または方位角
1321
1378
  case event
1322
1379
  when 0
1323
- meridian = _coords(t0, When::Coordinates::Spatial::HORIZONTAL, target).phi.round
1380
+ meridian = _coords(t0, When::Coordinates::Spatial::EQUATORIAL_HA, target).phi.round
1324
1381
  when +1, -1
1325
1382
  height ||= target.instance_of?(When::Ephemeris::Sun) ? '0' : 'A'
1326
1383
  if height.kind_of?(String)
@@ -1335,8 +1392,8 @@ module When::Ephemeris
1335
1392
 
1336
1393
  # イベントの時刻
1337
1394
  _to_seed_type(
1338
- event == 0 ? (root(t0, meridian) {|t1| _coords(t1, When::Coordinates::Spatial::HORIZONTAL, target).phi }) :
1339
- (root(t0, height ) {|t1| _coords(t1, When::Coordinates::Spatial::HORIZONTAL, target).theta }),
1395
+ event == 0 ? (root(t0, meridian, 1) {|t1| _coords(t1, When::Coordinates::Spatial::EQUATORIAL_HA, target).phi}) :
1396
+ (root(t0, height ) {|t1| _coords(t1, When::Coordinates::Spatial::HORIZONTAL, target).theta }),
1340
1397
  t)
1341
1398
  end
1342
1399
 
@@ -1351,7 +1408,7 @@ module When::Ephemeris
1351
1408
  #
1352
1409
  # @return [Numeric, When::TM::TemporalPosotion] 日の出の日時(ユリウス日(Terrestrial Time)またはWhen::TM::DateAndTime
1353
1410
  #
1354
- def sun_rise(t, height='0')
1411
+ def sunrise(t, height='0')
1355
1412
  day_event(t, -1, When.Resource('_ep:Sun'), height)
1356
1413
  end
1357
1414
 
@@ -1366,7 +1423,7 @@ module When::Ephemeris
1366
1423
  #
1367
1424
  # @return [Numeric, When::TM::TemporalPosotion] 日の入りの日時(ユリウス日(Terrestrial Time)またはWhen::TM::DateAndTime
1368
1425
  #
1369
- def sun_set(t, height='0')
1426
+ def sunset(t, height='0')
1370
1427
  day_event(t, +1, When.Resource('_ep:Sun'), height)
1371
1428
  end
1372
1429
 
@@ -1403,8 +1460,8 @@ module When::Ephemeris
1403
1460
  # @return [Numeric, When::TM::TemporalPosotion] 月の出の日時(ユリウス日(Terrestrial Time)またはWhen::TM::DateAndTime
1404
1461
  # 該当時刻がなければ nil
1405
1462
  #
1406
- def moon_rise(t, height='A')
1407
- _day_event(t, -1, When.Resource('_ep:Moon'), height)
1463
+ def moonrise(t, height='A')
1464
+ day_event_in_the_day(t, -1, When.Resource('_ep:Moon'), height)
1408
1465
  end
1409
1466
 
1410
1467
  # 月の入りの日時
@@ -1418,8 +1475,8 @@ module When::Ephemeris
1418
1475
  # @return [Numeric, When::TM::TemporalPosotion] 月の入りの日時(ユリウス日(Terrestrial Time)またはWhen::TM::DateAndTime
1419
1476
  # 該当時刻がなければ nil
1420
1477
  #
1421
- def moon_set(t, height='A')
1422
- _day_event(t, +1, When.Resource('_ep:Moon'), height)
1478
+ def moonset(t, height='A')
1479
+ day_event_in_the_day(t, +1, When.Resource('_ep:Moon'), height)
1423
1480
  end
1424
1481
 
1425
1482
  # 月の最大高度の日時
@@ -1431,7 +1488,7 @@ module When::Ephemeris
1431
1488
  # 該当時刻がなければ nil
1432
1489
  #
1433
1490
  def moon_noon(t)
1434
- _day_event(t, nil, When.Resource('_ep:Moon'))
1491
+ day_event_in_the_day(t, nil, When.Resource('_ep:Moon'))
1435
1492
  end
1436
1493
 
1437
1494
  # 月の南中の日時
@@ -1443,7 +1500,7 @@ module When::Ephemeris
1443
1500
  # 該当時刻がなければ nil
1444
1501
  #
1445
1502
  def meridian_passage_of_moon(t)
1446
- _day_event(t, 0, When.Resource('_ep:Moon'))
1503
+ day_event_in_the_day(t, 0, When.Resource('_ep:Moon'))
1447
1504
  end
1448
1505
 
1449
1506
  # 恒星の出没と太陽の位置関係に関するイベントの日時
@@ -1476,7 +1533,7 @@ module When::Ephemeris
1476
1533
  # The Sun's height when the event happens
1477
1534
  unless bs
1478
1535
  mag = target.luminosity
1479
- bs = Bs[mag<-0.5 ? 0 : (mag<4.5 ? (mag+0.5).floor+1 : 6)][event]
1536
+ bs = Bs[mag<-0.5 ? 0 : (mag<4.5 ? mag.round+1 : 6)][event]
1480
1537
  end
1481
1538
 
1482
1539
  # イベントの時刻
@@ -1490,25 +1547,29 @@ module When::Ephemeris
1490
1547
  break if tt >= +t
1491
1548
  lam += 1
1492
1549
  end
1493
- _to_seed_type(day_event((tt+0.5+long/360.0).floor, Sgn[event][0], When.Resource('_ep:Sun'), bs), t)
1550
+ _to_seed_type(day_event((tt+long/360.0).round, Sgn[event][0], When.Resource('_ep:Sun'), bs), t)
1494
1551
  end
1495
1552
 
1496
1553
  # ユリウス日(Numeric)を seed と同じ型に変換して返します。
1497
1554
  #
1498
1555
  # @param [Numeric] d ユリウス日(Terrestrial Time)
1499
1556
  # @param [Numeric] seed
1557
+ # @param [Hash] seed
1500
1558
  # @param [When::TM::TemporalPosition] seed
1501
1559
  #
1502
1560
  # @return [Numeric, When::TM::TemporalPosotion]
1503
1561
  #
1504
1562
  def _to_seed_type(d, seed)
1505
- return d if seed.kind_of?(Numeric)
1506
- options = seed._attr
1507
- options[:precision] = nil
1508
- options[:clock] ||= When::TM::Clock.local_time || When.utc
1563
+ case seed
1564
+ when Numeric ; return d
1565
+ when When::TimeValue ; seed = seed._attr
1566
+ else ; seed = seed.dup
1567
+ end
1568
+ seed[:precision] = nil
1569
+ seed[:clock] ||= When::TM::Clock.local_time
1509
1570
  t = When::TM::JulianDate._d_to_t(d)
1510
- options[:frame].jul_trans(@is_dynamical ? When::TM::JulianDate.dynamical_time(t) :
1511
- When::TM::JulianDate.universal_time(t), options)
1571
+ seed[:frame].jul_trans(@is_dynamical ? When::TM::JulianDate.dynamical_time(t) :
1572
+ When::TM::JulianDate.universal_time(t), seed)
1512
1573
  end
1513
1574
 
1514
1575
  private
@@ -1527,16 +1588,17 @@ module When::Ephemeris
1527
1588
  # @sun_0m = t = CYCLE_0M日 での太陽年番号
1528
1589
  # @sun_1m = t = CYCLE_1M日 までの太陽年番号の比例定数
1529
1590
  def _normalize(args=[], options={})
1530
- @location = When.Resource(@location.gsub('%26', '&'), '_l:') if @location.kind_of?(String)
1531
- @long, @lat = [@location.long / When::Coordinates::Spatial::DEGREE,
1532
- @location.lat / When::Coordinates::Spatial::DEGREE] if @location
1533
- @formula ||= '1L'
1534
- @time_standard ||= 'dynamical'
1535
- @is_dynamical = (@time_standard[0..0].downcase == 'd')
1591
+ @location = When.Resource(@location, '_l:') if @location.kind_of?(String)
1592
+ @long, @lat, @alt = [@location.long / When::Coordinates::Spatial::DEGREE,
1593
+ @location.lat / When::Coordinates::Spatial::DEGREE,
1594
+ @location.alt] if @location
1595
+ @formula ||= '1L'
1596
+ @time_standard ||= 'dynamical'
1597
+ @is_dynamical = (@time_standard[0..0].downcase == 'd')
1536
1598
 
1537
1599
  _normalize_grahas
1538
1600
 
1539
- @proc ||=
1601
+ @proc ||=
1540
1602
  case @formula
1541
1603
  when Hash
1542
1604
  @formula['Rem'] = (-@formula['Epoch']) % @formula['Period']
@@ -1599,7 +1661,7 @@ module When::Ephemeris
1599
1661
  #
1600
1662
  # 見つからなければ nil
1601
1663
  #
1602
- def _day_event(t, event, target=When.Resource('_ep:Sun'), height=nil)
1664
+ def day_event_in_the_day(t, event, target=When.Resource('_ep:Sun'), height=nil)
1603
1665
  today = t.to_i
1604
1666
  3.times do
1605
1667
  r = day_event(t, event, target, height)
@@ -1725,12 +1787,12 @@ module When::Ephemeris
1725
1787
  attr_reader :month_epoch
1726
1788
 
1727
1789
  # 計算の元期(日)
1728
- # @return [Numeric]
1729
- attr_reader :day_epoch
1790
+ # @return [Numeric]
1791
+ attr_reader :day_epoch
1730
1792
 
1731
1793
  # 回帰年
1732
- # @return [Numeric]
1733
- attr_reader :year_length
1794
+ # @return [Numeric]
1795
+ attr_reader :year_length
1734
1796
 
1735
1797
  # 恒星月
1736
1798
  # @return [Numeric]
@@ -1767,7 +1829,7 @@ module When::Ephemeris
1767
1829
  #
1768
1830
  # @return [Numeric] 日の出の日時のユリウス日
1769
1831
  #
1770
- def sun_rise(sdn, height=nil)
1832
+ def sunrise(sdn, height=nil)
1771
1833
  return sdn.to_i - @long / 360.0 - 0.25
1772
1834
  end
1773
1835
 
@@ -1799,8 +1861,8 @@ module When::Ephemeris
1799
1861
  def cn_to_time_(cn, time0=nil)
1800
1862
  time0 ||= (cn - @cycle_number_0m) / @cycle_number_1m
1801
1863
  case @formula
1802
- when /S/ ; (time0 + 1.0/256 - @day_epoch).divmod(@solar_terms)[0] * @solar_terms + @day_epoch
1803
- when /L/ ; (time0 + 1.0/256 - @day_epoch).divmod(@month_tithi)[0] * @month_tithi + @day_epoch
1864
+ when /S/ ; ((time0 + 1.0/256 - @day_epoch) / @solar_terms).floor * @solar_terms + @day_epoch
1865
+ when /L/ ; ((time0 + 1.0/256 - @day_epoch) / @month_tithi).floor * @month_tithi + @day_epoch
1804
1866
  end
1805
1867
  end
1806
1868