所以现在,我正在为一个C++课做作业。作业说,我需要根据用户给出的经度和纬度的输入,使用haversine公式计算两个地方之间的距离。然后,haversine公式计算出两个地方之间的距离。
我遇到的问题是,当使用老师给出的测试值时,我得到的答案比他得到的答案更大。
我在计算33.9425/N 118.4081/W (洛杉矶机场)和20.8987/N 156.4305/W (Kahului机场)之间的距离,洛杉矶机场是起点。
他对这个距离的回答是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)
发布于 2014-10-19 03:34:24
您需要将lats/longs转换为弧度,因为Java中的trig函数接受弧度参数。
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;你应该总是简明扼要!
发布于 2014-10-19 03:29:40
这是我用弧度写的东西,如果你不能使用你老师给你的东西的话。一段时间前,我做了一个类似的项目,把公式从不同的网站上提取出来。
#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;
}https://stackoverflow.com/questions/26446308
复制相似问题