2016-08-23 5 views
4

私はUnityのhaversine式を使って、2つの異なる点(緯度と経度が与えられている)の間の距離を求めようとしています。コードは動作しています(エラーはありません)が、間違った結果が得られます。私は全体の数式に従ったので、数学/コード問題がどこにあるのか本当に分かりません。何か案が?私は、この行が間違っていると思うHaversineの式Unity

public float lat1 = 42.239616f; 
public float lat2 = -8.72304f; 
public float lon1 = 42.239659f; 
public float lon2 = -8.722305f; 

void operacion(){ 
float R = 6371000; // metres 
float omega1 = ((lat1/180)*Mathf.PI); 
float omega2 = ((lat2/180)*Mathf.PI); 
float variacionomega1 = (((lat2 - lat1)/180)*Mathf.PI); 
float variacionomega2 = (((lon2 - lon1)/180) * Mathf.PI); 
float a = Mathf.Sin(variacionomega1/2) * Mathf.Sin(variacionomega1/2) + 
      Mathf.Cos(omega1) * Mathf.Cos(omega2) * 
      Mathf.Sin(variacionomega2/2) * Mathf.Sin(variacionomega2/2); 
float c = 2 * Mathf.Atan2(Mathf.Sqrt(a), Mathf.Sqrt(1-a)); 

float d = R * c; 
} 
+1

ながらAdilsonの結果はあなたの問題を解決するかもしれませんが、より良い精度のためには '6371000'が' 6372797.560856'になるはずです。 – Programmer

+0

@Programmer答えに感謝します。私はそれがより正確にする必要があるので、アドバイスを取るが、私は与えられた結果と正しい結果の違いが大きいという事実を明確にしたい。 –

+0

まあ、そのコメントは答えていません。 Adilsonの最新の回答を確認してください。それはあなたの問題を解決するはずです。もし私に知らせてくれないなら。 – Programmer

答えて

4

:ここ

はコードだ

float c = 2 * Mathf.Atan2(Mathf.Sqrt(a), Mathf.Sqrt(1-a)); 

更新日:

正しい方法は次のようになります。

float c = 2 * Mathf.Asin(Mathf.Sqrt(a)); 
+0

ねえ、答えてくれてありがとう!私はその行を置き換えようとしましたが、Unityはエラーを返します。 "CS1501:メソッド' Asin 'には2つの引数がオーバーロードされません。 –

+0

こんにちは。私は更新を試みましたが、今は動作しますが(エラーなし)、結果は間違っています。私は実際に私が式に従っているように、それがまだ働いていない理由の多くのアイデアを持っていません。ちなみに、それが何らかの形で役立ったら、結果が正しいかどうかをウェブサイトhttp://www.movable-type.co.uk/scripts/latlong.htmlで確認しています。答えをありがとう! –

+0

私はユニティAPIを持っていませんが、MathfをMathに置き換えて、そのコードで私は7668480メートルの距離で終了しました。あなたが指摘したページにこれらの値を入力しながら、私も7668 kmで終了しました。あなたはどの座標を使っていますか、どの距離を得ましたか? –

関連する問題