3

ここ数日は、計算と数式を作成することでいっぱいで、頭がおかしくなり始めています (少し)。だから今、私はあなたたちにいくつかの洞察/助けを求めています.

ここに問題があります。建物のフロア全体に配置された Bluetooth ビーコンを使用して、屋内 GPS ショーケースを作成しています。携帯電話を使用してこれらのビーコンに接続すると、そこから経度と緯度の位置を受信できます。これらの数値は、次のような大きな float/double 変数です。

  • 緯度: 52.501288451787076
  • 長さ: 6.079107635606511

実際の変更は、ポイントの 4 番目と 5 番目の位置で発生します。これらの数値を次を使用してデカルト座標系に変換しています。

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

これで、この変換による座標は一種の固体になります。それらは私が扱うことができる数字です。それらを 3D エンジン (Unity3d) で使用して、誰かがどこを歩いているかを確認できるリアルタイム マップを作成します。

さて、実際の問題です!これらのビーコンは完全に正確ではありません。これらの数字は、携帯電話を置いても上下に「ジャンプ」します。範囲は、上記と同じ緯度 52.501280 から 52.501296 と仮定しましょう。これを変換して 3D エンジンの座標として使用すると、ユーザーの「アバター」はある位置から別の位置にジャンプします (大きなジャンプよりも小さなジャンプの方が多い)。

これらの急増する数字に対処するための良い方法は何ですか? 大きなジャンプをチェックして無視しようとしましたが、ジャンプはまだ大きすぎます。より広いチェックでは、電話が動いていても、ほとんど動きません。または、緯度変数と経度変数を 3D エンジンで使用するために変換するより良い方法はありますか?

私と同じ問題を抱えている人、最初に良い変換/式を与えることができる数学の不思議、または私が間違っている可能性があることを知っている人がいる場合は、仲間のプログラマーを助けてください。

4

1 に答える 1

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 を指定しました)。5 番目の要素が最初の要素を押し出すなど...

平均は常に滑らかなスライドになります:-)

于 2015-12-03T12:23:27.723 に答える