过去几天已经完成了计算和公式,我开始失去理智(一点点)。所以现在我转向你们,寻求一些见解/帮助。
这是问题;我正在使用蓝牙信标,这些信标被放置在建筑物的整个楼层,以制作室内GPS展示。您可以使用手机连接这些信标,从而获得您的经度和纬度位置。这些数字是大的浮点数/双变量,如下所示:
实际变化发生在该点之后的第4和第5位置。我正在使用;
将这些数字转换为笛卡尔坐标系现在这个转换的坐标有点扎实。它们是我可以使用的数字。我在3d引擎(Unity3d)中使用它们来制作实时地图,在那里你可以看到有人走路的地方。
现在出现实际问题!这些信标并不完全准确。即使你把手机放下,这些数字也会“上下跳跃”。让我们假设与上述相同的纬度,52.501280到52.501296。如果我们转换它并将其用作3d引擎中的坐标,则用户的“化身”会从一个位置跳转到另一个位置(跳跃次数比大跳跃次数小)。
应对这些跳跃数字的好方法是什么?我试图检查大跳并忽略那些,但跳跃仍然太大了。即使手机正在移动,更广泛的检查也几乎不会移动。或者有更好的方法来转换lat和long变量以用于3d引擎吗?
如果有人和我有同样的问题,有些数学奇迹可以给出一个很好的转换/公式,或者知道我可能做错的人,那么请帮助一个程序员。
答案 0 :(得分:1)
移动平均值
您可以使用此:(采取此处:https://stackoverflow.com/a/1305/5089204)
注意:请阅读本课程的评论,因为此实施方案存在一些缺陷......仅用于快速测试和演示...
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)。第五个元素推出第一个,依此类推...
平均值将始终平滑: - )