【发布时间】:2016-03-30 18:36:04
【问题描述】:
我正在尝试在我正在编写的一个小 GPS 程序中实现 Haversine 公式。距离计算似乎是准确的。但是,我相信方位是以弧度计算的,我不知道如何正确地将结果转换为指南针方向(0 表示北,90 表示东等)。
任何帮助都将不胜感激,所有这些关于余符号和反正切的讨论都让我头疼!我是程序员,不是数学家!
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void FindDistance (double latHome, double lonHome, double latDest, double lonDest)
{
double pi=3.141592653589793;
int R=6371; //Radius of the Earth in kilometers
//Keep the parameters passed to the function immutable
double latHomeTmp=(pi/180)*(latHome);
double latDestTmp=(pi/180)*(latDest);
double differenceLon= (pi/180)*(lonDest- lonHome);
double differenceLat=(pi/180)*(latDest- latHome);
double a= sin (differenceLat/2.)*sin (differenceLat/2.)+cos (latHomeTmp)*cos (latDestTmp)*sin (differenceLon/2.)*sin (differenceLon/2.);
double c=2*atan2 (sqrt (a), sqrt (1-a));
double Distance=R*c;
printf ("Distance is %f\n", Distance);
double RadBearing=atan2 (sin (differenceLon)*cos (latDestTmp), cos (latHomeTmp)*sin (latDestTmp)-sin (latHomeTmp)*cos (latDestTmp)*cos (differenceLon));
double DegBearing=RadBearing*57.2958;
if (DegBearing<0) DegBearing=360+DegBearing;
printf ("Bearing is %f\n", DegBearing);
} //Function FindDistance
int main (void) {
puts ("LA to NY");
FindDistance (34.052235, -118.243683, 40.748817, -73.985428);
puts ("NY to LA");
FindDistance (40.748817, -73.985428, 34.052235, -118.243683);
} //Function main
gcc -o gps -lm gps.c
从 LA 到 NY 的方位角为 65,从 NY 到 LA 的方位角为 273。
如果我们将轴承加在一起,我们会得到 338,这是不可能的 - 它不应该等于 360 吗?
还是我完全出去吃午饭了?
无论如何,如您所见,我总是同时计算距离和方位。如果您还可以建议一种清理代码的方法,使其不会执行不必要的计算,那将非常出色!我在一个小型微处理器上运行它,我喜欢计算每个周期!
【问题讨论】:
-
你出去吃午饭了。假设轴承方向相反,从较大轴承中减去较小轴承应得到 180。将轴承相加得到 180 到 540 之间的数字。例如,45 和 225 是相反的,总和为 270,但差为180. 此外,当沿大圆移动时,方位角不是恒定的。所以从洛杉矶开始,你从东北方向开始,到几乎正东方向结束。从纽约开始,您几乎从正西开始,但在西南路径结束。
-
在弯曲的地球表面上,我认为方位角不需要是 180 度互补。
-
除了相反的方向相差 180° 外,当您沿着大圆移动时,方位角与经线的角度会发生变化,因此输入方位与输出方位不会相反,@ 987654322@。对角的概念来自于将最短距离想象为地图上的直线,但在大多数投影中最短路径不是直线。