【问题标题】:Working with micro changes in floats/doubles处理浮点数/双精度数的微小变化
【发布时间】:2016-03-07 22:36:31
【问题描述】:

过去几天一直忙于计算和公式,我开始失去理智(有点)。所以现在我向你们寻求一些见解/帮助。

这是问题;我正在使用蓝牙信标,它们被放置在建筑物的整个楼层中,以制作室内 GPS 展示。您可以使用手机连接这些信标,从而从它们那里接收您的经度和纬度位置。这些数字是大浮点/双精度变量,如下所示:

  • 纬度:52.501288451787076
  • lng: 6.079107635606511

实际变化发生在该点之后的第 4 位和第 5 位。我正在使用将这些数字转换为笛卡尔坐标系;

  • x = R * cos(lat) * cos(lon)
  • z = r * sin(lat)

现在这个转换得到的坐标是实心的。它们是我可以使用的数字。我在 3d 引擎 (Unity3d) 中使用它们来制作实时地图,您可以在其中看到有人在哪里行走。

现在为实际问题!这些信标并不完全准确。即使您放下手机,这些数字也会上下“跳跃”。范围从,让我们假设与上述相同的纬度,52.501280 到 52.501296。如果我们将其转换并将其用作 3d 引擎中的坐标,则用户的“头像”会从一个位置跳到另一个位置(小跳多于大跳)。

应对这些跳跃数字的好方法是什么?我试图检查大跳跃并忽略那些,但跳跃仍然太大。更广泛的检查将导致几乎没有移动,即使手机正在移动。或者有没有更好的方法来转换 lat 和 long 变量以用于 3d 引擎?

如果有人和我有同样的问题,一些数学奇才可以给出一个好的转换/公式,或者知道我可能做错了什么,那么请帮助其他程序员。

【问题讨论】:

  • 不知道我对问题的理解是否正确...你可以考虑Moving Average
  • 多么有趣的问题。对@Shnugo的建议很大的是的。我认为您可以通过使用统一的 Input.acceleration 或 Input.gyro.userAcceleration 进一步完善您的运动。后者是我使用的,它运行良好(我需要先通过 Android 上的代码启用它)。因此,如果您打算进行硬核,您可以检查每帧的陀螺仪加速度...... mm......可能 1. 平均加速度和移动平均算法,或者 2. 使用加速度作为后者的系数。但同样,我认为移动平均线会很好。
  • 我一定会试一试移动平均线。使用加速是我想过但从未真正尝试过的事情。谢谢你的输入。 span>

标签: c# unity3d bluetooth positioning cartesian-coordinates


【解决方案1】:

移动平均线

你可以使用这个:(取自这里:https://stackoverflow.com/a/1305/5089204

注意:请阅读该类的cmets,因为这个实现有一些缺陷......只是为了快速测试和展示......

    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 个元素将第一个元素推出,依此类推...

平均值总是平滑滑动:-)

【讨论】:

  • 不错。如果有结果就会回来。
  • 它确实有效,但必须对其进行一些更改才能与 api 一起使用。但问题是 api 太垃圾了,而且信标仍然如此不准确,以至于即使移动平均算法也无法取得成果。猜猜我得等到api的开发者改进Beacon软件和api。将接受您的答案已解决,因为现在问题出在 api 上。
  • @Amacoder 很高兴阅读,这可以解决您的问题。请给我一个提示:我访问了您的个人资料,发现您几乎接受了所有问题,这很好。但是 - 如果你不介意 - 请阅读this。你没有在那里(和这里)投票......投票对徽章和声誉很重要。所有在这里给出答案的教授都沉迷于徽章和代表点:-)
猜你喜欢
  • 2010-12-19
  • 1970-01-01
  • 2018-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多