处理 floats/doubles 中的微小变化
Working with micro changes in floats/doubles
最近几天一直在做计算和公式,我开始失去理智(有点)。所以现在我向你们寻求一些 insight/help。
问题来了;我正在使用蓝牙信标,它们被放置在建筑物的整个楼层,以制作室内 GPS 展示柜。您可以使用 phone 连接这些信标,从而从它们接收您的经度和纬度位置。这些数字是很大的 float/double 个变量,看起来像这样:
- 纬度:52.501288451787076
- 液化天然气:6.079107635606511
实际变化发生在该点之后的第4和第5个位置。我正在使用这些数字将这些数字转换为笛卡尔坐标系;
- x = R * 余弦(纬度)* 余弦(经度)
- z = R *sin(lat)
现在这个转换的坐标有点固定了。它们是我可以使用的数字。我在 3d 引擎 (Unity3d) 中使用它们来制作实时地图,您可以在其中看到某人正在行走的位置。
现在进入实际问题!这些信标并不完全准确。即使您放下 phone,这些数字 'jump' 也会上下波动。范围从,让我们假设与上述相同的纬度,52.501280 到 52.501296。如果我们转换它并将其用作 3d 引擎中的坐标,则用户的 'avatar' 从一个位置跳到另一个位置(小跳多于大跳)。
有什么好的方法来应对这些跳跃的数字?我试图检查大跳跃并忽略它们,但跳跃仍然太大。更广泛的检查将导致几乎没有移动,即使 phone 正在移动。或者是否有更好的方法来转换 lat 和 long 变量以在 3d 引擎中使用?
如果有人和我有同样的问题,一些数学奇迹谁可以给出一个好的开始 conversion/formula 或者有人知道我可能做错了什么然后请帮助程序员同学出来了。
移动平均线
你可以使用这个:(取自这里:)
注意:请阅读对此class的评论,因为此实现有一些缺陷...仅供快速测试和展示...
public class LimitedQueue<T> : Queue<T> {
private int limit = -1;
public int Limit {
get { return limit; }
set { limit = value; }
}
public LimitedQueue(int limit)
: base(limit) {
this.Limit = limit;
}
public new void Enqueue(T item) {
if (this.Count >= this.Limit) {
this.Dequeue();
}
base.Enqueue(item);
}
}
像这样测试一下:
var queue = new LimitedQueue<float>(4);
queue.Enqueue(52.501280f);
var avg1 = queue.Average(); //52.50128
queue.Enqueue(52.501350f);
var avg2 = queue.Average(); //52.5013161
queue.Enqueue(52.501140f);
var avg3 = queue.Average(); //52.50126
queue.Enqueue(52.501022f);
var avg4 = queue.Average(); //52.5011978
queue.Enqueue(52.501635f);
var avg5 = queue.Average(); //52.50129
queue.Enqueue(52.501500f);
var avg6 = queue.Average(); //52.5013237
queue.Enqueue(52.501505f);
var avg7 = queue.Average(); //52.5014153
queue.Enqueue(52.501230f);
var avg8 = queue.Average(); //52.50147
有限的队列不会增长...您只需定义要使用的元素数(在本例中我指定了 4 个)。第 5 个元素将第一个推出,依此类推...
平均值永远是平滑的滑动:-)
最近几天一直在做计算和公式,我开始失去理智(有点)。所以现在我向你们寻求一些 insight/help。
问题来了;我正在使用蓝牙信标,它们被放置在建筑物的整个楼层,以制作室内 GPS 展示柜。您可以使用 phone 连接这些信标,从而从它们接收您的经度和纬度位置。这些数字是很大的 float/double 个变量,看起来像这样:
- 纬度:52.501288451787076
- 液化天然气:6.079107635606511
实际变化发生在该点之后的第4和第5个位置。我正在使用这些数字将这些数字转换为笛卡尔坐标系;
- x = R * 余弦(纬度)* 余弦(经度)
- z = R *sin(lat)
现在这个转换的坐标有点固定了。它们是我可以使用的数字。我在 3d 引擎 (Unity3d) 中使用它们来制作实时地图,您可以在其中看到某人正在行走的位置。
现在进入实际问题!这些信标并不完全准确。即使您放下 phone,这些数字 'jump' 也会上下波动。范围从,让我们假设与上述相同的纬度,52.501280 到 52.501296。如果我们转换它并将其用作 3d 引擎中的坐标,则用户的 'avatar' 从一个位置跳到另一个位置(小跳多于大跳)。
有什么好的方法来应对这些跳跃的数字?我试图检查大跳跃并忽略它们,但跳跃仍然太大。更广泛的检查将导致几乎没有移动,即使 phone 正在移动。或者是否有更好的方法来转换 lat 和 long 变量以在 3d 引擎中使用?
如果有人和我有同样的问题,一些数学奇迹谁可以给出一个好的开始 conversion/formula 或者有人知道我可能做错了什么然后请帮助程序员同学出来了。
移动平均线
你可以使用这个:(取自这里:)
注意:请阅读对此class的评论,因为此实现有一些缺陷...仅供快速测试和展示...
public class LimitedQueue<T> : Queue<T> {
private int limit = -1;
public int Limit {
get { return limit; }
set { limit = value; }
}
public LimitedQueue(int limit)
: base(limit) {
this.Limit = limit;
}
public new void Enqueue(T item) {
if (this.Count >= this.Limit) {
this.Dequeue();
}
base.Enqueue(item);
}
}
像这样测试一下:
var queue = new LimitedQueue<float>(4);
queue.Enqueue(52.501280f);
var avg1 = queue.Average(); //52.50128
queue.Enqueue(52.501350f);
var avg2 = queue.Average(); //52.5013161
queue.Enqueue(52.501140f);
var avg3 = queue.Average(); //52.50126
queue.Enqueue(52.501022f);
var avg4 = queue.Average(); //52.5011978
queue.Enqueue(52.501635f);
var avg5 = queue.Average(); //52.50129
queue.Enqueue(52.501500f);
var avg6 = queue.Average(); //52.5013237
queue.Enqueue(52.501505f);
var avg7 = queue.Average(); //52.5014153
queue.Enqueue(52.501230f);
var avg8 = queue.Average(); //52.50147
有限的队列不会增长...您只需定义要使用的元素数(在本例中我指定了 4 个)。第 5 个元素将第一个推出,依此类推...
平均值永远是平滑的滑动:-)