从C+;中的哈弗公式计算纬度/经度的结果存在问题+; 所以现在我正在做一个C++课的家庭作业。作业中说,我需要根据用户输入的经度和纬度,使用哈弗森公式计算两个地方之间的距离。然后哈弗森公式计算两个地方之间的距离

从C+;中的哈弗公式计算纬度/经度的结果存在问题+; 所以现在我正在做一个C++课的家庭作业。作业中说,我需要根据用户输入的经度和纬度,使用哈弗森公式计算两个地方之间的距离。然后哈弗森公式计算两个地方之间的距离,c++,distance,latitude-longitude,haversine,C++,Distance,Latitude Longitude,Haversine,我遇到的问题是,当使用讲师给出的测试值时,我得到的答案比他得到的答案更大 我正在计算33.9425/N 118.4081/W(洛杉矶机场)和20.8987/N 156.4305/W(卡胡里机场)之间的距离,洛杉矶机场是起点位置 他对距离的回答是2483.3英里。我的答案是2052.1英里 以下是我的哈弗森公式代码: double haversine(double lat1, double lat2, double lon1, double lon2) { // get differenc

我遇到的问题是,当使用讲师给出的测试值时,我得到的答案比他得到的答案更大

我正在计算33.9425/N 118.4081/W(洛杉矶机场)和20.8987/N 156.4305/W(卡胡里机场)之间的距离,洛杉矶机场是起点位置

他对距离的回答是2483.3英里。我的答案是2052.1英里

以下是我的哈弗森公式代码:

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来完成这个操作,并且对于每一个三重函数,都用乘以π/180中的任何值。(即pow(sin((dlat/2)*(PI/180)),2)

这是我用弧度写的东西,如果允许你不使用你老师给你的东西。不久前我有一个这样的项目,并从不同的网站上删除了公式

#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;
}
#包括
使用名称空间std;
静态常数双度至弧度=0.017453292519943295769236907684886;
静态常数双接地半径(单位:米)=6372797.560856;
静态常数双地球半径(单位:英里)=3959;
结构位置{
位置(双纬度,双经线):_纬度(纬度),_经线(经线){
void lat(双lat){u lat=lat;}
双lat()常量{return\u lat;}
空离子(双离子){u-lon=lon;}
双lon()常量{return_lon;}
私人:
双平面;
双联;
};
双哈弗线(恒定位置和起始位置,恒定位置和起始位置){
双纬度弧=(从.lat()-到.lat())*度到弧度;
双长弧=(从.lon()-到.lon())*度到弧度;
双板条h=sin(板条弧*0.5);
lat_h*=lat_h;
双长h=sin(长弧*0.5);
lon_h*=lon_h;
双tmp=cos(从.lat()*DEG_到_RAD)*cos(到.lat()*DEG_到_RAD);
返回2.0*asin(sqrt(横向+纵向);
}
以米为单位的双距离(恒定位置和起始、恒定位置和至){
返回地球半径,单位为米*哈弗斯线(从,到);
}
以英里为单位的双倍距离(恒定位置和起始位置、恒定位置和结束位置)
{
返回地球半径,单位为哈弗斯线(从,到);
}
int main()
{
双米=距离单位米(位置(33.9425118.4081),位置(20.8987156.4305));
双英里=距离单位英里(位置(33.9425118.4081),位置(20.8987156.4305));

cout您需要将lat/long转换为弧度,因为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;

<>你应该总是简洁的!

C++会有同样的问题吗?