首页 文章

从C中的半正弦公式计算纬度/经度的结果的问题

提问于
浏览
0

所以现在,我正在做一个C类的家庭作业 . 作业说我需要根据用户对经度和纬度给出的度数输入,使用半正公式计算两个地方之间的距离 . 然后,半正式公式计算两个地方之间的距离 .

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

我计算的是33.9425 / N 118.4081 / W(洛杉矶机场)和20.8987 / N 156.4305 / W(卡胡卢伊机场)之间的距离,那里是洛杉矶机场的起始位置 .

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

这是我的hasrsine公式的代码:

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并对我使用的每个触发函数,乘以* PI / 180中的任何内容来做到这一点 . (即pow(sin((dlat / 2)*(PI / 180)),2)

2 回答

  • 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;
    }
    
  • 0

    你需要将你的lats / long转换为radians,因为Java中的trig函数接受radian参数 .

    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;
    

    你应该总是简洁!

相关问题