座標系の変換

※このページは、JavaScript を使っています。(IE4, NN4 以上を推奨)


《解説》

●天文計算で使用される座標系

 天体の運動を論じるには、「時空間」を表現するための「座標」と「時間」という概念が必要です。時間については、主に「力学時」を使いますが、座標系については、天文学では、ちょっと複雑な体系になっています。

 三次元座標を記述する代表的な座標系には、以下のものがあります。

  (1) 直交座標系(rectanguler coordinates system)

x,y,zの座標で表す。

  (2) 極座標系(polar coordinates system)

経度(longitude)、緯度(latitude)、中心からの距離(radius)で表す。
なお、惑星運動を記述する時は、太陽と惑星間の距離のことを動径(radius vector,rで表す)と呼びます。

 どちらの座標系も、原点(origin)と基準軸(axis)というものが必要になりますが、この原点と基準軸の決め方により、天文学では、様々な座標系が存在します。

 まず、原点の決め方により、以下のような座標系が使われます。

  (1) 太陽系重心座標系または太陽系座標系 : 太陽系重心を原点とする。
  (2) 日心座標系 : 太陽中心(重心)を原点とする。
  (3) 地心座標系 : 地球中心(重心)を原点とする。
  (4) 測心座標系 : 観測地を原点とする。

 次に、基準軸の取り方により、以下のような座標系が使われます。

  (1) 黄道座標系(ecliptic coordinates system)

 地球の公転面である黄道(ecliptic)を基準面、春分点 (vernal equinox,γで表す)方向を基準軸(経度=緯度=0)として使用します。
 極座標系であれば、黄経 (celestial longitude,λで表す)と黄緯 (celestial latitude,βで表す)で、天体位置を記述します。
 主に、太陽系天体の位置計算に使われます。

  (2) 赤道座標系(equatorial coordinates system)

 地球の赤道(equator)を基準面、春分点方向を基準軸として使用します。
 極座標系であれば、赤経 (right ascension,αで表す)と赤緯 (declination,δで表す)で天体位置を記述します。

  (3) 地方赤道座標系(local equatorial coordinates system)

 時角座標とも呼ばれ、地球の赤道を基準面、子午線(meridian)が南側で赤道と交わる方向を基準軸として使用します。
 極座標系であれば、時角 (hour angle,Hで表す)と赤緯(δ)で天体位置を記述します。

  (4) 地平座標系(horizontal coordinates system)

 地平線(horizon)を基準面、子午線が南側で地平線と交わる方向を基準軸として使用します。
 極座標系であれば、方位角 (azimuth,Aで表す)と高度角 (altitude,hで表す)で天体位置を記述します。

  (5) 銀河座標系(galactic coordinates system)

 銀河面(galactic plane、天の川の最も濃い面で、星間ガスである水素の発する電波の最も強い面)を基準面、銀河中心方向を基準軸として使用します。原点は通常は太陽中心を用います。
 極座標系であれば、銀経 (galactic longitude,l で表す)と銀緯 (galactic latitude,bで表す)と距離で天体位置を記述します。
 太陽系の天体位置計算では、普通は使用することはありません。

 というわけで、天文計算を行おうとすると、座標系の理解だけでも、ずいぶんと大変な手間がかかります。もちろん、話はこれだけでは終わりません。ここで採用されている基準面や基準軸が、時間により変動する「歳差」と「章動」という、やっかいな問題があるからです。
 とりあえず、座標系の相互変換の基礎を、以下で述べます。

●座標系の一般的な変換

 座標系の一般的な変換式を、以下に示します。
 前に説明した全ての座標系は、以下の方法で相互変換可能です。

 (1) 極座標から直交座標への変換

経度λ、緯度β、中心距離 r を、直交座標(x,y,z)に変換する。
 x = r*cos(λ)*cos(β)
 y = r*sin(λ)*cos(β)
 z = r*sin(β)

 (2) 直交座標から極座標への変換

直交座標(x,y,z)を、経度λ、緯度β、中心距離 r に変換する。
 λ = arctan2(y,x)
  r = sqrt(x*x+y*y+z*z)
 β = arcsin(z/r)
ここで、arctan2 というのは、以下のように arctan の結果を -π(-180゜)〜+π(+180゜)に拡張したものです。
 arctan2(y,x) = arctan(y/x)   … x>0 のとき
 arctan2(y,x) = arctan(y/x)+π … x<0,y>0 のとき
 arctan2(y,x) = arctan(y/x)-π … x<0,y<0 のとき

 (3) 直交座標での原点の変更(座標系の平行移動)

原点を、(xo,yo,zo) に変更する。
 x = x-xo
 y = y-yo
 z = z-zo

 (4) 直交座標での座標系回転(x軸回りの回転)

x軸回り(反時計回りを正)に、y,z座標軸をθだけ回転する。
 x = x
 y = y*cos(θ) + z*sin(θ)
 z = -y*sin(θ) + z*cos(θ)

 (5) 直交座標での座標系回転(y軸回りの回転)

y軸回り(反時計回りを正)に、x,z座標軸をθだけ回転する。
 x = x*cos(θ) - z*sin(θ)
 y = y
 z = x*sin(θ) + z*cos(θ)

 (6) 直交座標での座標系回転(z軸回りの回転)

z軸回り(反時計回りを正)に、x,y座標軸をθだけ回転する。
 x = x*cos(θ)+y*sin(θ)
 y = -x*sin(θ)+y*cos(θ)
 z = z
極座標系のままでも、経度λからθを引くことにより、計算できます。

●プログラムの説明

 JavaScriptプログラムの主要部分は、以下の関数です。

 これらを組み合わせて、
  (1) 極座標から直交座標への変換
  (2) 原点の変更
  (3) x軸回りの座標系回転
  (4) y軸回りの座標系回転
  (5) z軸回りの座標系回転
  (6) 直交座標から極座標へと変換
の一連の処理を行うプログラムにしてみました。

 例として、経度=黄経、緯度=黄緯、距離=1、原点=(0,0,0)、x軸回転角=-23.4、y軸回転角=0、z軸回転角=0 を指定すると、黄道座標から赤道座標への変換ができます。
 また、x軸回転角=23.4 とすると、赤道座標から黄道座標への変換ができます。

関数の機能:
 極座標から直交座標へと変換する。
  x軸方向=経度0゜、緯度0゜
  y軸方向=経度90゜、緯度0゜
  z軸方向=緯度90゜
関数の引数:
 lon - 経度 [単位:ラジアン]
 lat - 緯度 [単位:ラジアン]
 rad - 中心距離 [単位:任意]
関数の戻り値:
 なし
入力グローバル変数:
 なし
出力グローバル変数:
 xw - x座標値
 yw - y座標値
 zw - z座標値
function TransPolarToRect(lon,lat,rad)
{
  xw=rad*Math.cos(lon)*Math.cos(lat);
  yw=rad*Math.sin(lon)*Math.cos(lat);
  zw=rad*Math.sin(lat);
}
関数の機能:
 直交座標から極座標へと変換する。
  x軸方向=経度0゜、緯度0゜
  y軸方向=経度90゜、緯度0゜
  z軸方向=緯度90゜
関数の引数:
 x - x座標値
 y - y座標値
 z - z座標値
関数の戻り値:
 なし
入力グローバル変数:
 なし
出力グローバル変数:
 lonw - 経度 [単位:ラジアン]
 latw - 緯度[単位:ラジアン]
 radw - 中心距離 [単位:任意]
function TransRectToPolar(x,y,z)
{
  lonw=Math.atan2(y,x);
  if(lonw<0) lonw+=Math.PI*2;
  radw=Math.sqrt(x*x+y*y+z*z);
  latw=Math.asin(z/radw);
}
関数の機能:
 直交座標での原点の変更を行う。
関数の引数:
 x - x座標値
 y - y座標値
 z - z座標値
 xo - 新しい原点のx座標値
 yo - 新しい原点のy座標値
 zo - 新しい原点のz座標値
関数の戻り値:
 なし
入力グローバル変数:
 なし
出力グローバル変数:
 xw - 原点変換後のx座標値
 yw - 原点変換後のy座標値
 zw - 原点変換後のz座標値
function TransRectOrigin(x,y,z,xo,yo,zo)
{
  xw=x-xo;
  yw=y-yo;
  zw=z-zo;
}
関数の機能:
 直交座標でのx軸回りの座標系回転を行う。
関数の引数:
 x - x座標値
 y - y座標値
 z - z座標値
 th - 回転角(反時計回りを正) [単位:ラジアン]
関数の戻り値:
 なし
入力グローバル変数:
 なし
出力グローバル変数:
 xw - 回転後のx座標値
 yw - 回転後のy座標値
 zw - 回転後のz座標値
function TransRotateX(x,y,z,th)
{
  xw=x;
  yw=y*Math.cos(th)+z*Math.sin(th);
  zw=-y*Math.sin(th)+z*Math.cos(th);
}
関数の機能:
 直交座標でのy軸回りの座標系回転を行う。
関数の引数:
 x - x座標値
 y - y座標値
 z - z座標値
 th - 回転角(反時計回りを正) [単位:ラジアン]
関数の戻り値:
 なし
入力グローバル変数:
 なし
出力グローバル変数:
 xw - 回転後のx座標値
 yw - 回転後のy座標値
 zw - 回転後のz座標値
function TransRotateY(x,y,z,th)
{
  xw=x*Math.cos(th)-z*Math.sin(th);
  yw=y;
  zw=x*Math.sin(th)+z*Math.cos(th);
}
関数の機能:
 直交座標でのz軸回りの座標系回転を行う。
関数の引数:
 x - x座標値
 y - y座標値
 z - z座標値
 th - 回転角(反時計回りを正) [単位:ラジアン]
関数の戻り値:
 なし
入力グローバル変数:
 なし
出力グローバル変数:
 xw - 回転後のx座標値
 yw - 回転後のy座標値
 zw - 回転後のz座標値
function TransRotateZ(x,y,z,th)
{
  xw=x*Math.cos(th)+y*Math.sin(th);
  yw=-x*Math.sin(th)+y*Math.cos(th);
  zw=z;
}

☆プログラム実行結果

経度
緯度
距離
新原点のx座標
新原点のy座標
新原点のz座標
x軸回りの回転角
y軸回りの回転角
z軸回りの回転角
x座標
y座標
z座標
経度
緯度
距離

HOME
inserted by FC2 system