Class: When::Ephemeris::Coords
- Inherits:
-
Object
- Object
- When::Ephemeris::Coords
- Includes:
- When::Ephemeris
- Defined in:
- lib/when_exe/ephemeris.rb
Overview
天体の座標
Constant Summary
Constants included from When::Ephemeris
AU, AcS, BCENT, C0, CIRCLE, COS, COSL, COSLT, COST, DAY, DEG, EPOCH1800, EPOCH1900, EPOCH1975, EPOCH2000, FARAWAY, JCENT, JYEAR, Jupiter, LIN, Mars, Mercury, Neptune, P0B, P0L, P0P, P0dB, P0dL, P1B, P1L, P1R, P2B, P2L, P2Q, P2dL, P3L, P3Q, P4B, P4L, P4Q, P4dL, P5B, P5L, P5Q, P5dL, P5l, P5n, P5r, P5t, P6B, P6L, P6Q, P6dL, P6l, P6n, P6r, P6t, P7B, P7L, P7R, P8B, P8L, P8R, P9B, P9L, P9R, PSEC, Pluto, SIN, SINL, SINLT, SINT, Saturn, Uranus, Venus
Class Method Summary collapse
Instance Method Summary collapse
-
#+(other) ⇒ When::Ephemeris::Coords
加法.
-
#-(other) ⇒ When::Ephemeris::Coords
減法.
-
#-@ ⇒ When::Ephemeris::Coords
点対称の反転.
-
#[](z) ⇒ Numeric
要素参照.
-
#c ⇒ Numeric
周回数.
-
#cos_pes(planet) ⇒ Numeric
地球から見た惑星と太陽の視距離の余弦 - cosine of angle Planet - Earth - Sun.
-
#cos_spe(planet) ⇒ Numeric
惑星から見た太陽と地球の視距離の余弦(惑星の満ち具合) - cosine of angle Sun - Planet - Earth.
-
#initialize(*args) ⇒ Coords
constructor
オブジェクトの生成.
-
#luminosity_spe(planet) ⇒ Numeric
惑星の明るさ - luminosity used cosine of angle Sun - Planet - Earth.
-
#nutation(c) ⇒ When::Ephemeris::Coords
章動.
-
#parallax(t, loc) ⇒ When::Ephemeris::Coords
地心視差 (黄道座標) / 地心位置 -> 測心位置(観測地中心位置).
-
#phi ⇒ Numeric
経度 / CIRCLE.
-
#polar ⇒ Array<Numeric>
極座標.
-
#precession(dt, t0) ⇒ When::Ephemeris::Coords
歳差.
-
#r_to_h(t, loc) ⇒ When::Ephemeris::Coords
赤道座標 -> 地平座標.
-
#r_to_y(t, loc = nil) ⇒ When::Ephemeris::Coords
赤道座標 -> 黄道座標.
-
#radius ⇒ Numeric
距離.
-
#rectangular ⇒ Array<Numeric>
直交座標.
-
#rotate_x(t) ⇒ When::Ephemeris::Coords
X 軸を軸とする回転.
-
#rotate_y(t) ⇒ When::Ephemeris::Coords
Y 軸を軸とする回転.
-
#rotate_z(t) ⇒ When::Ephemeris::Coords
Z 軸を軸とする回転.
-
#spherical_law_of_cosines(other) ⇒ Numeric
(also: #cos_esp)
球面の余弦 spherical law of cosines.
-
#theta ⇒ Numeric
緯度 / CIRCLE.
-
#x ⇒ Numeric
x 座標.
-
#y ⇒ Numeric
y 座標.
-
#y_to_r(t, loc = nil) ⇒ When::Ephemeris::Coords
黄道座標 -> 赤道座標.
-
#z ⇒ Numeric
z 座標.
Methods included from When::Ephemeris
_rot, _to_p2, _to_p3, _to_r3, acos, asin, cosc, cosd, delta_e, delta_p, julian_century_from_2000, julian_year_from_1975, obl, polynomial, root, sinc, sind, tanc, tand, trigonometric
Constructor Details
#initialize(x, y, z, options = { :system=>:rectangular }) ⇒ Coords #initialize(phi, theta, radius, c, options = {}) ⇒ Coords
c - 周回数(デフォルト - phi から生成) z軸の周りを何週して現在の位置にあるかを保持する
オブジェクトの生成
686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 |
# File 'lib/when_exe/ephemeris.rb', line 686 def initialize(*args) @options = args[-1].kind_of?(Hash) ? args.pop.dup : {} if @options[:system] == :rectangular @x, @y, @z, @c = args @x ||= 0.0 # X座標 @y ||= 0.0 # Y座標 @z ||= 0.0 # Z座標 else @phi, @theta, @radius, @c = args @phi ||= 0.0 # 経度 @theta ||= 0.0 # 緯度 @radius ||= 1.0 # 距離 @c ||= @phi # 周期番号 @phi -= (@phi - @c + 0.5).floor end end |
Class Method Details
.rectangular(x, y, z, c = nil) ⇒ When::Ephemeris::Coords
オブジェクトの生成
358 359 360 |
# File 'lib/when_exe/ephemeris.rb', line 358 def rectangular(x, y, z, c=nil) Coords.new(x, y, z, c, {:system=>:rectangular}) end |
Instance Method Details
#+(other) ⇒ When::Ephemeris::Coords
加法
448 449 450 451 |
# File 'lib/when_exe/ephemeris.rb', line 448 def +(other) raise TypeError, 'operand should be When::Ephemeris::Coords' unless other.kind_of?(Coords) self.class.rectangular(x+other.x, y+other.y, z+other.z, c+other.c) end |
#-(other) ⇒ When::Ephemeris::Coords
減法
459 460 461 462 |
# File 'lib/when_exe/ephemeris.rb', line 459 def -(other) raise TypeError, 'operand should be When::Ephemeris::Coords' unless other.kind_of?(Coords) self.class.rectangular(x-other.x, y-other.y, z-other.z, c-other.c) end |
#-@ ⇒ When::Ephemeris::Coords
点対称の反転
468 469 470 |
# File 'lib/when_exe/ephemeris.rb', line 468 def -@ self.class.polar(phi+0.5, -theta, radius, c) end |
#[](z) ⇒ Numeric
要素参照
438 439 440 |
# File 'lib/when_exe/ephemeris.rb', line 438 def [](z) send(z.to_sym) end |
#cos_pes(planet) ⇒ Numeric
地球から見た惑星と太陽の視距離の余弦 - cosine of angle Planet - Earth - Sun
643 644 645 |
# File 'lib/when_exe/ephemeris.rb', line 643 def cos_pes(planet) spherical_law_of_cosines(self - planet) end |
#cos_spe(planet) ⇒ Numeric
惑星から見た太陽と地球の視距離の余弦(惑星の満ち具合) - cosine of angle Sun - Planet - Earth
653 654 655 |
# File 'lib/when_exe/ephemeris.rb', line 653 def cos_spe(planet) planet.spherical_law_of_cosines(planet - self) end |
#luminosity_spe(planet) ⇒ Numeric
惑星の明るさ - luminosity used cosine of angle Sun - Planet - Earth
663 664 665 666 |
# File 'lib/when_exe/ephemeris.rb', line 663 def luminosity_spe(planet) difference = planet - self (planet.spherical_law_of_cosines(difference) + 1) / ( 2 * planet.radius * planet.radius * difference.radius * difference.radius) end |
#nutation(c) ⇒ When::Ephemeris::Coords
章動
513 514 515 |
# File 'lib/when_exe/ephemeris.rb', line 513 def nutation(c) rotate_z(delta_p(c)).rotate_x(delta_e(c)) end |
#parallax(t, loc) ⇒ When::Ephemeris::Coords
地心視差 (黄道座標) / 地心位置 -> 測心位置(観測地中心位置)
562 563 564 565 |
# File 'lib/when_exe/ephemeris.rb', line 562 def parallax(t, loc) return self if loc.alt==When::Coordinates::Spatial::Center self - loc.coords_diff(t) end |
#phi ⇒ Numeric
経度 / CIRCLE
412 |
# File 'lib/when_exe/ephemeris.rb', line 412 def phi ; @phi || polar[0] ; end |
#polar ⇒ Array<Numeric>
極座標
401 402 403 404 405 406 |
# File 'lib/when_exe/ephemeris.rb', line 401 def polar @phi, @theta, @radius = _to_p3(@x, @y, @z) unless @radius @c ||= @phi @phi -= (@phi - @c + 0.5).floor return [@phi, @theta, @radius, @c] end |
#precession(dt, t0) ⇒ When::Ephemeris::Coords
歳差
525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 |
# File 'lib/when_exe/ephemeris.rb', line 525 def precession(dt, t0) return self if (theta.abs>=0.25) b0 = dt / (360 * 3600.0) b1 = [+0.302, +0.018] b2 = [+0.791, +0.001] b3 = [-0.462, -0.042] b1.unshift(2304.250 + 1.396 * t0) b2.unshift(polynomial(dt, b1)) b3.unshift(2004.682 - 0.853 * t0) z0 = b0 * b2[0] zt = b0 * polynomial(dt, b2) th = b0 * polynomial(dt, b3) a = phi + z0 b = th / 2 cA = cosc(a) sA = sinc(a) tB = tanc(b) q = sinc(th)*(tanc(theta) + tB*cA) dRA = atan2(q*sA, 1-q*cA) / CIRCLE dDC = atan2(tB*(cA-sA*tanc(dRA/2)), 1) / CIRCLE self.class.polar(phi + dRA + z0 + zt, theta + 2*dDC, radius, @c) end |
#r_to_h(t, loc) ⇒ When::Ephemeris::Coords
赤道座標 -> 地平座標
616 617 618 619 |
# File 'lib/when_exe/ephemeris.rb', line 616 def r_to_h(t, loc) rotate_z(-loc.local_sidereal_time(t) / 24). rotate_y(loc.lat / (360.0*When::Coordinates::Spatial::DEGREE) - 0.25) end |
#r_to_y(t, loc = nil) ⇒ When::Ephemeris::Coords
赤道座標 -> 黄道座標
575 576 577 578 579 580 581 582 583 584 585 586 587 |
# File 'lib/when_exe/ephemeris.rb', line 575 def r_to_y(t, loc=nil) t = +t loc = loc.datum unless loc.kind_of?(Datum) n = loc.axis_of_rotation(t) if loc if (n) c = rotate_z(+0.25 - n.radius). rotate_y(+0.25 - n.theta). rotate_z(+n.phi) else c = self end return c.rotate_x(-obl(julian_century_from_2000(t))) end |
#radius ⇒ Numeric
距離
424 |
# File 'lib/when_exe/ephemeris.rb', line 424 def radius ; @radius || polar[2] ; end |
#rectangular ⇒ Array<Numeric>
直交座標
370 371 372 373 |
# File 'lib/when_exe/ephemeris.rb', line 370 def rectangular @x, @y, @z = _to_r3(@phi, @theta, @radius) unless @z return [@x, @y, @z] end |
#rotate_x(t) ⇒ When::Ephemeris::Coords
X 軸を軸とする回転
478 479 480 481 482 |
# File 'lib/when_exe/ephemeris.rb', line 478 def rotate_x(t) cos = cosc(t) sin = sinc(t) self.class.rectangular(x, y*cos-z*sin, y*sin+z*cos, c) end |
#rotate_y(t) ⇒ When::Ephemeris::Coords
Y 軸を軸とする回転
490 491 492 493 494 |
# File 'lib/when_exe/ephemeris.rb', line 490 def rotate_y(t) cos = cosc(t) sin = sinc(t) self.class.rectangular(z*sin+x*cos, y, z*cos-x*sin, c) end |
#rotate_z(t) ⇒ When::Ephemeris::Coords
Z 軸を軸とする回転
502 503 504 |
# File 'lib/when_exe/ephemeris.rb', line 502 def rotate_z(t) self.class.polar(phi+t, theta, radius, c+t) end |
#spherical_law_of_cosines(other) ⇒ Numeric Also known as: cos_esp
球面の余弦 spherical law of cosines
627 628 629 |
# File 'lib/when_exe/ephemeris.rb', line 627 def spherical_law_of_cosines(other) sinc(theta)*sinc(other.theta) + cosc(theta)*cosc(other.theta)*cosc(phi-other.phi) end |
#theta ⇒ Numeric
緯度 / CIRCLE
418 |
# File 'lib/when_exe/ephemeris.rb', line 418 def theta ; @theta || polar[1] ; end |
#x ⇒ Numeric
x 座標
379 |
# File 'lib/when_exe/ephemeris.rb', line 379 def x ; @x || rectangular[0] ; end |
#y ⇒ Numeric
y 座標
385 |
# File 'lib/when_exe/ephemeris.rb', line 385 def y ; @y || rectangular[1] ; end |
#y_to_r(t, loc = nil) ⇒ When::Ephemeris::Coords
黄道座標 -> 赤道座標
597 598 599 600 601 602 603 604 605 606 |
# File 'lib/when_exe/ephemeris.rb', line 597 def y_to_r(t, loc=nil) t = +t c = rotate_x(+obl(julian_century_from_2000(t))) loc = loc.datum unless loc.kind_of?(Datum) n = loc.axis_of_rotation(t) if loc return c unless n c.rotate_z(-n.phi). rotate_y(-0.25 + n.theta). rotate_z(-0.25 + n.radius) end |
#z ⇒ Numeric
z 座標
391 |
# File 'lib/when_exe/ephemeris.rb', line 391 def z ; @z || rectangular[2] ; end |