所以现在,我正在做一个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 回答
如果你被允许不使用你老师给你的确切东西,这是我用弧度写的东西 . 我有一个这样的项目,不久之后将公式从不同的网站上拉下来 .
你需要将你的lats / long转换为radians,因为Java中的trig函数接受radian参数 .
而这一行:
是一回事
现在你的功能应该有效 . (:
另外,仅供将来参考:
应缩短为:
你应该总是简洁!