2014-10-19 45 views
0

所以現在,我正在爲C++類做一個家庭作業。這項任務說我需要根據用戶給出的經度和緯度輸入度來計算兩個地方之間的距離。然後,半正式公式計算兩地之間的距離。在C++中用haversine公式計算經度/經度的結果問題

我遇到的問題是使用教師給出的測試值時,我得到的答案比他得到的答案要多。

我正在計算33.9425/N 118.4081/W(洛杉磯機場)和20.8987/N 156.4305/W(卡胡盧伊機場)之間的距離,LA機場是起始位置。

他對距離的回答是2483.3英里。我的答案是2052.1英里。

這裏是我的haversine公式代碼:

double haversine(double lat1, double lat2, double lon1, double lon2) { 
    // get differences first 
    double dlon = difference(lon1, lon2); // difference for longitude 
    double dlat = difference(lat1, lat2); // difference for latitude 
    // part a of algorithm 
    double a = pow(sin(dlat/2), 2) + cos(lat1) * cos(lat2) * pow(sin(dlon/2), 2); 
    // part b of algorithm 
    double b = 2 * atan2(sqrt(a), sqrt(1 - a)); 
    // our result, or the great-circle distance between two locations 
    double result = EARTH_RADIUS * b; 
    return result; 
} 

與區別只是返回y - X在這種情況下。我的計算中似乎出了什麼問題?據我所知,在計算一切時我的括號似乎是確定的,所以我不確定爲什麼我會得到不同的答案。

更新:通過以弧度轉換經度和緯度來解決問題。在C++中,我通過定義PI = 3.14159265來實現這一點,並且對於我使用的每個trig函數,將其中的任何內容* PI/180相乘。 (即pow(sin((dlat/2)*(PI/180)),2)

回答

2

您需要將拉特/多頭轉換爲弧度,因爲Java中的三角函數接受弧度參數。

public static double haversine(double lat1, double lon1, double lat2, double lon2) { 
    double dLat = Math.toRadians(lat2 - lat1); 
    double dLon = Math.toRadians(lon2 - lon1); 
    lat1 = Math.toRadians(lat1); 
    lat2 = Math.toRadians(lat2); 

而且這一行:

// part b of algorithm 
double b = 2 * atan2(sqrt(a), sqrt(1 - a)); 

是一回事

// part b of algorithm 
double b = 2 * Math.asin(Math.sqrt(a)); 

現在你的函數應該工作。 (:

此外,剛剛以供將來參考:

// our result, or the great-circle distance between two locations 
double result = EARTH_RADIUS * b; 
return result; 

應縮短爲:

// our result, or the great-circle distance between two locations 
return EARTH_RADIUS * b; 

你應該總是簡潔

+0

將C++有同樣的問題即?只需要將我的緯度和經度轉換爲弧度? – Alex 2014-10-19 05:55:02

0

這是我用弧度寫的東西,如果你被允許不使用老師給你的確切東西。有這樣的一段時間後一個項目,拉着配方關閉不同的網站。

#include <iostream> 

using namespace std; 

static const double DEG_TO_RAD = 0.017453292519943295769236907684886; 
static const double EARTH_RADIUS_IN_METERS = 6372797.560856; 
static const double EARTH_RADIUS_IN_MILES = 3959; 

struct Position { 
    Position(double lat, double lon) : _lat(lat), _lon(lon) {} 
    void lat(double lat) { _lat = lat; } 
    double lat() const { return _lat; } 
    void lon(double lon) { _lon = lon; } 
    double lon() const { return _lon; } 
private: 
    double _lat; 
    double _lon; 
}; 

double haversine(const Position& from, const Position& to) { 
    double lat_arc = (from.lat() - to.lat()) * DEG_TO_RAD; 
    double lon_arc = (from.lon() - to.lon()) * DEG_TO_RAD; 
    double lat_h = sin(lat_arc * 0.5); 
    lat_h *= lat_h; 
    double lon_h = sin(lon_arc * 0.5); 
    lon_h *= lon_h; 
    double tmp = cos(from.lat()*DEG_TO_RAD) * cos(to.lat()*DEG_TO_RAD); 
    return 2.0 * asin(sqrt(lat_h + tmp*lon_h)); 
} 

double distance_in_meters(const Position& from, const Position& to) { 
    return EARTH_RADIUS_IN_METERS*haversine(from, to); 
} 

double distance_in_miles(const Position& from, const Position& to) 
{ 
    return EARTH_RADIUS_IN_MILES*haversine(from, to); 
} 

int main() 
{ 
    double meters = distance_in_meters(Position(33.9425, 118.4081), Position(20.8987, 156.4305)); 
    double miles = distance_in_miles(Position(33.9425, 118.4081), Position(20.8987, 156.4305)); 
    cout << "\nDistance in meters is: " << meters; 
    cout << "\nDistance in miles is: " << miles; 


    cout << endl; 
    system("PAUSE"); 
    return 0; 
} 
相關問題