我正在开发一个程序,我想在其中存储用户按下按钮后走过的距离。我通过geolocator软件包检索距离,并在屏幕上显示出来,效果很好。
我知道有一些distanceBetween-function用于位置,但据我所知,它们只是计算两点之间的距离,而不是用户行走的实际距离(例如,如果用户从一个点X开始,走到点Y,然后回到X,将在比较起点和终点(X到X)时结束,这将导致距离:0,但是我想要X -〉Y -〉X的距离。
我添加了以下函数,根据经度/纬度计算距离。
double distance(Position start, Position current){
return double.parse((acos(sin(start.latitude)*sin(current.latitude)+cos(start.latitude)*cos(current.latitude)*cos(current.longitude-start.longitude))*6371).toStringAsFixed(2));
}
我调用它的每一帧,并存储当前和最后的gps位置之间的距离。工作缓慢,但罚款,除了一个问题:**某个时候,double突然变成了“NaN”,我不知道为什么。**发生这种情况完全是随机的-一开始,它总是在0.6左右,但也发生在4.5和0.2左右,所以我认为问题可能在其他地方。
有人能帮忙吗?
或者有人知道一个内置函数可以解决同样的问题吗?
我试着解析双精度只有2个小数位(之前没有四舍五入),因为我认为数字可能只是得到了太多的小数位显示,但错误仍然发生。
我有一个第二个任务是发生在同一时间每个时间戳,所以我认为这是阻碍检索GPS,所以我试图禁用它,但它没有改变任何东西。
2条答案
按热度按时间byqmnocz1#
由于您要计算每一帧上的距离,因此您可能会遇到球面余弦定律的数值稳定性问题。众所周知,该公式对于非常小的距离(小于1米)存在条件问题。
请注意,
arccosine(x)
的定义域是-1 <= x <= 1
。如果您提供的值大于1(或小于-1),则会得到NaN
结果。如果您仍在调试,则可以添加一个简单的print语句:如果情况确实如此,那么你有几个选择,使用半正矢公式,因为它更适合于小距离,或者如果x大于1,就简单地将x设置为1。无论如何,这只是意味着距离为零。
有关详细信息(和半正矢公式),另请参见:Great circle distance
x8diyxa72#
我真的没有想到反余弦域...所以我用你的命题更新了我的代码:
工作正常,谢谢你的帮助!