#include <stdio.h>
#include <math.h>
const double earth_R = 6378.137; // 地球の平均半径
const double PI = 3.141592653589793238462643383279; // 円周率
typedef struct { // 地点データ
double ido;
double keido;
double v[3]; // 単位ベクトル x,y,z 成分
} POS;
int main()
{
int i;
POS pos[2]; // 地点の情報
double angle; // 単位ベクトルのなす角度
double dv[3]; // 2点を結ぶベクトル (x,y,z)
// 入力
printf("地球上の2点間の距離を求める(地球の平均半径=%fkmと仮定)\n\n", earth_R
); printf(" 2地点の緯度経度をDegree(-180.0~180.0)で入力\n"); printf(" (※ 北緯 35度30分・西経 100度の場合、'35.5 -100' と入力\n"); printf(" 南緯 35度30分・東経 100度の場合、'-35.5 100' と入力 )\n"); for (i = 0; i < 2; i++) {
printf("・地点 %d の緯度経度:", i
+ 1); scanf("%lf %lf", &pos
[i
].
ido, &pos
[i
].
keido); }
// それぞれの単位ベクトルをを求める
for (i = 0; i < 2; i++) {
pos
[i
].
v[0] = cos(pos
[i
].
keido * PI
/ 180.0) * cos(pos
[i
].
ido * PI
/ 180.0); pos
[i
].
v[1] = sin(pos
[i
].
keido * PI
/ 180.0) * cos(pos
[i
].
ido * PI
/ 180.0); pos
[i
].
v[2] = sin(pos
[i
].
ido * PI
/ 180.0); }
// 2地点を結ぶベクトル dv[] (x,y,z) を求める
for (i = 0; i < 3; i++) {
dv[i] = pos[1].v[i] - pos[0].v[i];
}
// 単位ベクトルのなす角度 angle[rad] を求める
angle = 0.0; // 内積計算temp
for (i = 0; i < 3; i++) {
angle += pos[0].v[i] * pos[1].v[i];
}
// 表示
printf("・球面上の最短距離 = %fkm\n", earth_R
* angle
); printf("・最短距離(地下トンネル) = %fkm\n", earth_R
* sqrt(dv
[0] * dv
[0] + dv
[1] * dv
[1] + dv
[2] * dv
[2]));
// 終了
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+Cgpjb25zdCBkb3VibGUgZWFydGhfUiA9IDYzNzguMTM3OyAgICAvLyDlnLDnkIPjga7lubPlnYfljYrlvoQKY29uc3QgZG91YmxlIFBJID0gMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk7IC8vIOWGhuWRqOeOhwoKdHlwZWRlZiBzdHJ1Y3QgeyAgICAgICAgICAgICAgICAvLyDlnLDngrnjg4fjg7zjgr8KICAgIGRvdWJsZSBpZG87CiAgICBkb3VibGUga2VpZG87CiAgICBkb3VibGUgdlszXTsgICAgICAgICAgICAgICAgLy8g5Y2Y5L2N44OZ44Kv44OI44OrIHgseSx6IOaIkOWIhgp9IFBPUzsKCmludCBtYWluKCkKewogICAgaW50IGk7CiAgICBQT1MgcG9zWzJdOyAgICAgICAgICAgICAgICAgLy8g5Zyw54K544Gu5oOF5aCxCiAgICBkb3VibGUgYW5nbGU7ICAgICAgICAgICAgICAgLy8g5Y2Y5L2N44OZ44Kv44OI44Or44Gu44Gq44GZ6KeS5bqmCiAgICBkb3VibGUgZHZbM107ICAgICAgICAgICAgICAgLy8gMueCueOCkue1kOOBtuODmeOCr+ODiOODqyAoeCx5LHopCgogICAgLy8g5YWl5YqbCiAgICBwcmludGYoIuWcsOeQg+S4iuOBrjLngrnplpPjga7ot53pm6LjgpLmsYLjgoHjgoso5Zyw55CD44Gu5bmz5Z2H5Y2K5b6EPSVma23jgajku67lrpopXG5cbiIsIGVhcnRoX1IpOwogICAgcHJpbnRmKCIgIDLlnLDngrnjga7nt6/luqbntYzluqbjgpJEZWdyZWUoLTE4MC4w772eMTgwLjAp44Gn5YWl5YqbXG4iKTsKICAgIHByaW50ZigiICAgICjigLsg5YyX57evIDM15bqmMzDliIbjg7vopb/ntYwgMTAw5bqm44Gu5aC05ZCI44CBJzM1LjUgLTEwMCcg44Go5YWl5YqbXG4iKTsKICAgIHByaW50ZigiICAgICAgICDljZfnt68gMzXluqYzMOWIhuODu+adsee1jCAxMDDluqbjga7loLTlkIjjgIEnLTM1LjUgMTAwJyDjgajlhaXlipsgKVxuIik7CiAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCLjg7vlnLDngrkgJWQg44Gu57ev5bqm57WM5bqm77yaIiwgaSArIDEpOwogICAgICAgIHNjYW5mKCIlbGYgJWxmIiwgJnBvc1tpXS5pZG8sICZwb3NbaV0ua2VpZG8pOwogICAgfQogICAgLy8g44Gd44KM44Ge44KM44Gu5Y2Y5L2N44OZ44Kv44OI44Or44KS44KS5rGC44KB44KLCiAgICBmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CiAgICAgICAgcG9zW2ldLnZbMF0gPSBjb3MocG9zW2ldLmtlaWRvICogUEkgLyAxODAuMCkgKiBjb3MocG9zW2ldLmlkbyAqIFBJIC8gMTgwLjApOwogICAgICAgIHBvc1tpXS52WzFdID0gc2luKHBvc1tpXS5rZWlkbyAqIFBJIC8gMTgwLjApICogY29zKHBvc1tpXS5pZG8gKiBQSSAvIDE4MC4wKTsKICAgICAgICBwb3NbaV0udlsyXSA9IHNpbihwb3NbaV0uaWRvICogUEkgLyAxODAuMCk7CiAgICB9CiAgICAvLyAy5Zyw54K544KS57WQ44G244OZ44Kv44OI44OrIGR2W10gKHgseSx6KSDjgpLmsYLjgoHjgosKICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICBkdltpXSA9IHBvc1sxXS52W2ldIC0gcG9zWzBdLnZbaV07CiAgICB9CiAgICAvLyDljZjkvY3jg5njgq/jg4jjg6vjga7jgarjgZnop5LluqYgYW5nbGVbcmFkXSDjgpLmsYLjgoHjgosKICAgIGFuZ2xlID0gMC4wOyAgICAgICAgICAgICAgICAvLyDlhoXnqY3oqIjnrpd0ZW1wCiAgICBmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CiAgICAgICAgYW5nbGUgKz0gcG9zWzBdLnZbaV0gKiBwb3NbMV0udltpXTsKICAgIH0KICAgIGFuZ2xlID0gYWNvcyhhbmdsZSk7CiAgICAvLyDooajnpLoKICAgIHByaW50ZigiXG7lnLDngrkgMeKGkjLjga5cbiIpOwogICAgcHJpbnRmKCLjg7vnkIPpnaLkuIrjga7mnIDnn63ot53pm6IgICAgICAgPSAlZmttXG4iLCBlYXJ0aF9SICogYW5nbGUpOwogICAgcHJpbnRmKCLjg7vmnIDnn63ot53pm6Io5Zyw5LiL44OI44Oz44ON44OrKSA9ICVma21cbiIsIGVhcnRoX1IgKiBzcXJ0KGR2WzBdICogZHZbMF0gKyBkdlsxXSAqIGR2WzFdICsgZHZbMl0gKiBkdlsyXSkpOwoKICAgIC8vIOe1guS6hgogICAgcmV0dXJuIDA7Cn0=