2016-08-23 25 views
4

所以我試圖在Unity中使用haversine公式來獲得兩個不同點(緯度和縱向給定)之間的距離。代碼工作(沒有錯誤),但我一直gettting錯誤的結果。我遵循整個公式,所以我不知道數學/代碼問題在哪裏。任何想法?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

@程序員感謝您的回答。我接受建議,因爲它應該使它更精確,但是我想澄清一個事實,即給定結果和正確結果之間的差異是巨大的。 –

+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

我在這裏沒有Unity API,但是用Math代替Mathf,我以7668480米的距離結束了代碼,同時在你指出的頁面上填充這些值,我也以7668公里結束了。你使用了什麼座標,你有多遠? –

相關問題