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