前提・実現したいこと
緯度経度から距離を算出する式
https://teratail.com/questions/90662
回答の「コードをぱぱっと置いときます。」で、def azimuth(x1, y1, x2, y2):は、正しく動作しましたが、
def distance(x1, y1, x2, y2, r):で距離を求めると、0.129にならず、ゼロになります。
両方の関数とも、CCS C に移植して動作させました。
MPLAB IDE v8.70 の MPLAB SIMでデバックテスト。ターゲットCPU未使用。
発生している問題・エラーメッセージ
エラーメッセージ 無し
該当のソースコード
CCS C
float distance(x1, y1, x2, y2) {
float _x1, _y1, _x2, _y2, a, b, c, d, tmp ,r;
r = 6378.137e3; //地球半径
_x1 = x1 * pi/180;
_y1 = y1 * pi/180;
_x2 = x2 * pi/180;
_y2 = y2 * pi/180;
a = _x2 - _x1;
b = sin(_y1) * sin(_y2);
c = cos(_y1) * cos(_y2) * cos(a);
d = b + c;
tmp = r * acos(d);
return tmp;
}
//メイン
float dis; //目標地までの距離
dis = distance(Tookei_S,Hokui_S, TookeiWP_S, HokuiWP_S) / 1e3; //Kmに変換。
試したこと
オリジナルの関数を変数で分解して関数電卓で検算しても結果は同じ。
★その後の状況
電卓を使って手計算してみた結果
Do2Ra = PI/180 = 0.0174532925199433として計算
_x1 = Tookei_S * Do2Ra; //2.426007660272119
_y1 = Hokui_S * Do2Ra; //0.6108652381980155
_x2 = TookeiWP_S * Do2Ra; //2.443460952792062
_y2 = HokuiWP_S * Do2Ra; //0.6283185307179588
Dx = _x2 - _x1; //0.017453292519943
val = sin(_y1) * sin(_y2) + cos(_y1) * cos(_y2) * cos(Dx); //Val
//以下部分的に電卓で計算
//sin(_y1) =0.01066140770962710955720304810472
//sin(_y2) =0.01096600731730257117720846470937
//cos(_y1) =0.99994316557774877549975045573468
//cos(_y2) =0.99993987153404222401529954032816
//cos(Dx) =0.99999995360411414000869052659551
//sin(_y1) * sin(_y2) = 0.0109660073173025
//cos(_y1) * cos(_y2) * cos(Dx) = 0.9998829941386981
//val = 1.010849001456001
dis = 6378.137 * acos(val); //地球半径
//acos(val) 1 より大きいので計算不能でゼロになる。従って disはゼロ
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/07 07:19
2018/08/08 06:14