flutter 在尝试计算两个位置之间的距离时,将双精度数相加会导致NaN?

xpcnnkqh  于 2022-11-25  发布在  Flutter
关注(0)|答案(2)|浏览(203)

我正在开发一个程序,我想在其中存储用户按下按钮后走过的距离。我通过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,所以我试图禁用它,但它没有改变任何东西。

byqmnocz

byqmnocz1#

由于您要计算每一帧上的距离,因此您可能会遇到球面余弦定律的数值稳定性问题。众所周知,该公式对于非常小的距离(小于1米)存在条件问题。
请注意,arccosine(x)的定义域是-1 <= x <= 1。如果您提供的值大于1(或小于-1),则会得到NaN结果。如果您仍在调试,则可以添加一个简单的print语句:

double distance(Position start, Position current){
  double x = sin(start.latitude)*sin(current.latitude)+cos(start.latitude)*cos(current.latitude)*cos(current.longitude-start.longitude);
  if (x > 1 || x < -1) {
    print("error");
  }
  return ((acos(sin(start.latitude)*sin(current.latitude)+cos(start.latitude)*cos(current.latitude)*cos(current.longitude-start.longitude))*6371));
}

如果情况确实如此,那么你有几个选择,使用半正矢公式,因为它更适合于小距离,或者如果x大于1,就简单地将x设置为1。无论如何,这只是意味着距离为零。
有关详细信息(和半正矢公式),另请参见:Great circle distance

x8diyxa7

x8diyxa72#

我真的没有想到反余弦域...所以我用你的命题更新了我的代码:

double distance(Position start, Position current) {
    double x = sin(start.latitude) * sin(current.latitude) + cos(start.latitude) * cos(current.latitude) * cos(current.longitude - start.longitude);
    if (x > 1 || x < -1) {
      if (kDebugMode) {
        print("error");
      }
      return 0;
    }
    return double.parse((acos(x) * 6371).toStringAsFixed(2));
  }

工作正常,谢谢你的帮助!

相关问题