fork(10) download
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. const double earth_R = 6378.137; // 地球の平均半径
  5. const double PI = 3.141592653589793238462643383279; // 円周率
  6.  
  7. typedef struct { // 地点データ
  8. double ido;
  9. double keido;
  10. double v[3]; // 単位ベクトル x,y,z 成分
  11. } POS;
  12.  
  13. int main()
  14. {
  15. int i;
  16. POS pos[2]; // 地点の情報
  17. double angle; // 単位ベクトルのなす角度
  18. double dv[3]; // 2点を結ぶベクトル (x,y,z)
  19.  
  20. // 入力
  21. printf("地球上の2点間の距離を求める(地球の平均半径=%fkmと仮定)\n\n", earth_R);
  22. printf(" 2地点の緯度経度をDegree(-180.0~180.0)で入力\n");
  23. printf(" (※ 北緯 35度30分・西経 100度の場合、'35.5 -100' と入力\n");
  24. printf(" 南緯 35度30分・東経 100度の場合、'-35.5 100' と入力 )\n");
  25. for (i = 0; i < 2; i++) {
  26. printf("・地点 %d の緯度経度:", i + 1);
  27. scanf("%lf %lf", &pos[i].ido, &pos[i].keido);
  28. }
  29. // それぞれの単位ベクトルをを求める
  30. for (i = 0; i < 2; i++) {
  31. pos[i].v[0] = cos(pos[i].keido * PI / 180.0) * cos(pos[i].ido * PI / 180.0);
  32. pos[i].v[1] = sin(pos[i].keido * PI / 180.0) * cos(pos[i].ido * PI / 180.0);
  33. pos[i].v[2] = sin(pos[i].ido * PI / 180.0);
  34. }
  35. // 2地点を結ぶベクトル dv[] (x,y,z) を求める
  36. for (i = 0; i < 3; i++) {
  37. dv[i] = pos[1].v[i] - pos[0].v[i];
  38. }
  39. // 単位ベクトルのなす角度 angle[rad] を求める
  40. angle = 0.0; // 内積計算temp
  41. for (i = 0; i < 3; i++) {
  42. angle += pos[0].v[i] * pos[1].v[i];
  43. }
  44. angle = acos(angle);
  45. // 表示
  46. printf("\n地点 1→2の\n");
  47. printf("・球面上の最短距離 = %fkm\n", earth_R * angle);
  48. printf("・最短距離(地下トンネル) = %fkm\n", earth_R * sqrt(dv[0] * dv[0] + dv[1] * dv[1] + dv[2] * dv[2]));
  49.  
  50. // 終了
  51. return 0;
  52. }
Success #stdin #stdout 0.01s 1724KB
stdin
35.681377 139.766086
-34.603722 -58.381595
stdout
地球上の2点間の距離を求める(地球の平均半径=6378.137000kmと仮定)

  2地点の緯度経度をDegree(-180.0~180.0)で入力
    (※ 北緯 35度30分・西経 100度の場合、'35.5 -100' と入力
        南緯 35度30分・東経 100度の場合、'-35.5 100' と入力 )
・地点 1 の緯度経度:・地点 2 の緯度経度:
地点 1→2の
・球面上の最短距離       = 18383.559835km
・最短距離(地下トンネル) = 12649.200590km