※このページは、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; }