2008年 4月 1日 掲載
このページはもとが KDO の個人的なメモであり, 内容の正しさは保証できません.
使ってみておかしいと感じたら, ただちに使用を中止して, 自分で調べなおすなり, 計算しなおすなりしてください.
仕事で使う潮位計が水圧式なのだが,データの単位が psi だった. で,SI単位系への変換式をメモ.
psi = Pound per Square Inch
1psi = 1lbf/inch2 = 0.45359243kgf/(0.0254m)2 = 703.0696kgf/m2 = 6890.082Pa
1気圧≒1013hPa≒14.7psi
C言語で,実数を整数に変換するには, int型に型キャストする方法と, 数値計算ライブラリ(libm)の floor関数を使う方法の 2つの方法がある. 負の値について結果が異なるので,使い分けに注意する必要がある.
int型への型キャストでは小数点以下の数字が切り捨てられる. floor関数では,その数値以下の最大の整数が返ってくる
なお,floor の戻り値は int ではなく double である. また,使用する際は math.h を include し, コンパイルオプション -lm を忘れないように注意すること.
地球上の 2点間の距離と方位について計算する方法を考えてみた.
ここでは,簡単のため地球を完全な球体と仮定しているので, 厳密な値とは異なることに注意が必要である.
緯度φ,経度λの地点 X は,xyz座標系では,
と表される.ここで r は地球の半径.
(x, y, z)と(λ, φ)の関係図
X0(λ0,φ0)から X1(λ1,φ1)までの距離 rα と方位 β は,
と表される.
距離 rα の α は,余弦定理から簡単に求められる.
方位 β は,X0NO面と X0X1O面のなす角度である.
全体を z軸まわりに -λ0 回転させたあと, y軸まわりに -φ0回転させると,OX0' が x軸と一致し, X0'NO面が zx面(y=0)と一致する. 角度β は,X0'X1'O面とzx面のなす角度, すなわち yz平面(x=0)上での OX1'のyz成分の z軸からの角度になる.
ここで,z軸まわりの λ回転は,
y軸まわりの φ回転は,
である.
年月日とユリウス日の変換式を C で書いたものを掲載する. Meeus の式がもとになっている (参考文献:新こよみ便利帳,暦計算研究会編,恒星社厚生閣). 最近 100年程度のデータしかあつかわないので, グレゴリオ歴(1582年 10月 15日以降)以降の日付に特化した.
まずは,年月日時 ymdh(UTC) → ユリウス日 J(ソース ymd2j.c)
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int y, m, d, A, B, C; double J, h; y = atoi(argv[1]); /* year */ m = atoi(argv[2]); /* month */ d = atoi(argv[3]); /* day */ h = atof(argv[4]); /* time(h, UTC) */ if ( m <= 2 ){ y -= 1; m += 12; } A = (int)( y / 100 ); B = 2 - A + (int)( A / 4 ); C = (int)( 365.25 * y ); J = 1720994 + (int)( 30.6001 * ( m + 1 ) ) + B + C + d + h / 24 + 0.5; printf("%f\n", J); return 0; }
次に,ユリウス日時 J → 年月日時 ymdh(UTC)(ソース j2ymd.c)
#include <stdio.h> #include <stdlib.h> int main(int argc, char **argv) { int y, m, d, Z, A, B, C, D, E, K; double J, h, N; J = atof(argv[1]); /* Julian day */ N = J + 0.5; Z = (int)N; h = ( N - Z ) * 24; A = (int)( ( Z - 1867216.25 ) / 36524.25 ); B = Z + 1 + A - (int)( A / 4) + 1524; C = (int)( ( B - 122.1 ) / 365.25 ); K = (int)( 365.25 * C ); E = (int)( ( B - K ) / 30.6001 ); D = B - K - (int)( 30.6001 * E ); printf("%d\n",E); if ( E < 13.5 ){ m = E - 1; } else { m = E - 13; } if ( m > 2.5 ){ y = C - 4716; } else { y = C - 4715; } d = D; printf("%d %d %d %f\n", y, m, d, h); return 0; }
[ KDO's Note Index にもどる ] [ KDOホームにもどる ]
(C) 2008 KDO