Class: When::Ephemeris::Coords

Inherits:
Object
  • Object
show all
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

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

Note:

c - 周回数(デフォルト - phi から生成) z軸の周りを何週して現在の位置にあるかを保持する

オブジェクトの生成

Overloads:

  • #initialize(x, y, z, options = { :system=>:rectangular }) ⇒ Coords

    引数パターン 1

    Parameters:

    • x (Numeric)

      x 座標

    • y (Numeric)

      y 座標

    • z (Numeric)

      z 座標

    • options (Hash) (defaults to: { :system=>:rectangular })

      { :system=>:rectangular }

  • #initialize(phi, theta, radius, c, options = {}) ⇒ Coords

    Parameters:

    • phi (Numeric)

      経度 / CIRCLE

    • theta (Numeric)

      緯度 / CIRCLE

    • radius (Numeric)

      距離

    • c (Numeric)

      周回数

    • options (Hash) (defaults to: {})

      { :system=>:rectangular以外 }



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

オブジェクトの生成

Parameters:

  • x (Numeric)

    x 座標

  • y (Numeric)

    y 座標

  • z (Numeric)

    z 座標

  • c (Numeric) (defaults to: nil)

    周回数(デフォルト - phi から生成)

    極座標との1対1対応を保証するため、z軸の周りを何週して 現在の位置にあるかを保持する

Returns:



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

加法

Parameters:

Returns:

Raises:

  • (TypeError)


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

減法

Parameters:

Returns:

Raises:

  • (TypeError)


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

要素参照

Parameters:

  • z (String, Symbol)

    要素名(‘x’, ‘y’, ‘z’, ‘phi’, ‘theta’, ‘r’, ‘c’, :x, :y, :z, :phi, :theta, :r, :c)

Returns:



438
439
440
# File 'lib/when_exe/ephemeris.rb', line 438

def [](z)
  send(z.to_sym)
end

#cNumeric

周回数

Returns:



430
# File 'lib/when_exe/ephemeris.rb', line 430

def c  ; @c  || polar[3] ; end

#cos_pes(planet) ⇒ Numeric

地球から見た惑星と太陽の視距離の余弦 - cosine of angle Planet - Earth - Sun

Parameters:

Returns:



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

Parameters:

Returns:



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

Parameters:

Returns:



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

章動

Parameters:

  • c (Numeric)

    2000年からの経過世紀

Returns:



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

地心視差 (黄道座標) / 地心位置 -> 測心位置(観測地中心位置)

Parameters:

Returns:



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

#phiNumeric

経度 / CIRCLE

Returns:



412
# File 'lib/when_exe/ephemeris.rb', line 412

def phi ; @phi || polar[0] ; end

#polarArray<Numeric>

極座標

Returns:

  • (Array<Numeric>)

    ( phi, theta, radius, c )

    phi - 経度 / CIRCLE
    theta - 緯度 / CIRCLE
    radius - 距離
    c - 周回数


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

歳差

Parameters:

  • dt (Numeric)

    分点からの経過時間 / ベッセル世紀

  • t0 (Numeric)

    分点 / ベッセル世紀

Returns:



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

赤道座標 -> 地平座標

Parameters:

Returns:



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

赤道座標 -> 黄道座標

Parameters:

Returns:



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

#radiusNumeric

距離

Returns:



424
# File 'lib/when_exe/ephemeris.rb', line 424

def radius ; @radius || polar[2] ; end

#rectangularArray<Numeric>

直交座標

Returns:

  • (Array<Numeric>)

    ( x, y, z )

    x - x 座標
    y - y 座標
    z - z 座標


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 軸を軸とする回転

Parameters:

  • t (Numeric)

    回転角 / CIRCLE

Returns:



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 軸を軸とする回転

Parameters:

  • t (Numeric)

    回転角 / CIRCLE

Returns:



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 軸を軸とする回転

Parameters:

  • t (Numeric)

    回転角 / CIRCLE

Returns:



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

Parameters:

Returns:



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

#thetaNumeric

緯度 / CIRCLE

Returns:



418
# File 'lib/when_exe/ephemeris.rb', line 418

def theta ; @theta || polar[1] ; end

#xNumeric

x 座標

Returns:



379
# File 'lib/when_exe/ephemeris.rb', line 379

def x ; @x || rectangular[0] ; end

#yNumeric

y 座標

Returns:



385
# File 'lib/when_exe/ephemeris.rb', line 385

def y ; @y || rectangular[1] ; end

#y_to_r(t, loc = nil) ⇒ When::Ephemeris::Coords

黄道座標 -> 赤道座標

Parameters:

Returns:



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

#zNumeric

z 座標

Returns:



391
# File 'lib/when_exe/ephemeris.rb', line 391

def z ; @z || rectangular[2] ; end