回答編集履歴

2

コード

2018/08/08 06:28

投稿

ozwk
ozwk

スコア13528

test CHANGED
@@ -7,3 +7,65 @@
7
7
  今回のような近距離だと、大円距離ではなく直線距離で近似するか、
8
8
 
9
9
  [wikipediaの大円距離のコンピュータによる計算](https://ja.wikipedia.org/wiki/%E5%A4%A7%E5%86%86%E8%B7%9D%E9%9B%A2#%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AB%E3%82%88%E3%82%8B%E8%A8%88%E7%AE%97)を使うかです。
10
+
11
+
12
+
13
+ ```C
14
+
15
+ #include <stdio.h>
16
+
17
+ #include <math.h>
18
+
19
+
20
+
21
+ float distance(float x1, float y1, float x2, float y2, float r){
22
+
23
+ float pi = 3.1415926535897932384626433832795;
24
+
25
+ x1 *= pi/180;
26
+
27
+ y1 *= pi/180;
28
+
29
+ x2 *= pi/180;
30
+
31
+ y2 *= pi/180;
32
+
33
+
34
+
35
+ float dx = x2 - x1;
36
+
37
+ float dy = y2 - y1;
38
+
39
+ float sy = sin(dy/2.0);
40
+
41
+ float sx = sin(dx/2.0);
42
+
43
+ float sigma = sy*sy + cos(y1)*cos(y2)*sx*sx;
44
+
45
+ return r *2.0*asin(sqrt(sigma));
46
+
47
+
48
+
49
+ }
50
+
51
+
52
+
53
+ int main(void){
54
+
55
+ float x1 = 139.988909;
56
+
57
+ float y1 = 35.685828;
58
+
59
+ float x2 = 139.990339;
60
+
61
+ float y2 = 35.685879;
62
+
63
+ float r = 6378.137e3;
64
+
65
+
66
+
67
+ printf("%f",distance(x1,y1,x2,y2,r)/1e3);
68
+
69
+ }
70
+
71
+ ```

1

計算方法追加

2018/08/08 06:28

投稿

ozwk
ozwk

スコア13528

test CHANGED
@@ -1,3 +1,9 @@
1
1
  floatだと桁落ち誤差でdが1になってtmpが0になってしまいます。
2
2
 
3
3
  doubleにするか別のアルゴリズムを探すかです。
4
+
5
+
6
+
7
+ 今回のような近距離だと、大円距離ではなく直線距離で近似するか、
8
+
9
+ [wikipediaの大円距離のコンピュータによる計算](https://ja.wikipedia.org/wiki/%E5%A4%A7%E5%86%86%E8%B7%9D%E9%9B%A2#%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%81%AB%E3%82%88%E3%82%8B%E8%A8%88%E7%AE%97)を使うかです。