2

3D データを検出するために、C# に空間ハッシュ クラスがあります。各頂点位置には空間ハッシュがあり、float が計算した実際の空間ハッシュであるVector3a に格納されます。Dictionary<float, Vector3>私が空間ハッシュを理解する方法は、ハッシュをバケットに並べ替えてから、互いのしきい値 (たとえば、0.0001f) 内にある値を取得することです。私が行ったほとんどの調査では、バケットの並べ替えが実装されていますが、私が持っているもので実装する方法がわかりませんDictionary

だから、私の質問は、このような Dictionary で同様の値を取得するにはどうすればよいですか? これまでのところ、ハッシュ値を のサイズのバケットにソートし、threshold何らかの方法で へのリンクを維持する必要があるようVector3です。私はこれに完全に間違った方法でアプローチしていますか? たとえば、この特定のユースケースにより適した別のジェネリックはありますか?

4

4 に答える 4

0

が機能するためにはDictionary、すべてのアイテムにバケットを割り当てる必要があります。これにより、すべてのアイテムが、別のバケットにあるアイテムと同等でないと盲目的に想定される可能性があります。そのDictionaryため、特定のポイントに近いオブジェクトを直接見つけるために を使用することはできません。そのようなオブジェクトは複数のバケットに分類される可能性があるためです。

特定のポイントから厳密に0.5ユニット未満離れたすべてのオブジェクトを見つけられるようにしたい場合は、整数座標のバケットの組み合わせを割り当ててから、各ポイントを各バケット(通常は8つ)に配置することをお勧めしますその座標は、問題のポイントと比較して、次に大きいまたは次に小さい整数のいずれかを表します。特定のポイントから厳密に 0.5 単位未満のポイントがコレクションに含まれているかどうかを確認するには、バケット内で最も近いポイントを探します。

問題のポイントの密度によっては、より粗いグリッドを使用すると役立つ場合があります。この場合、多くのオブジェクトを 1 つのバケットに格納するだけで済みます。重要な要件は、すべてのポイントが、一致する必要がある任意のポイントに「最も近い」可能性があるすべてのバケットに格納される必要があることです。

于 2013-03-27T17:45:23.133 に答える
0

このDictionaryクラスではキーの衝突が許可されていないため、複数のベクトルを同じ空間ハッシュに関連付ける (つまり、同じバケットに格納する) 場合は、個々ではなくベクトルのリストを格納する必要があります。基本的に、独自のバケットを辞書に保存しています。

Dictionary<float, List<Vector3>> Buckets;

次に、空間ハッシュ関数が、同じバケットにある必要があるすべてのアイテムに対して同じ値を返すことを確認する必要があります。それを念頭に置いて、空間ハッシュとして整数を使用することをお勧めします。

最後に、辞書から同様の項目を取得するには、次の手順を使用する必要があります。

  1. 同様のアイテムを取得するためのバウンディング ボックスを決定します (例: <X-デルタ、Y-デルタ、Z-デルタ>、<X+デルタ、Y+デルタ、Z+デルタ>)。
  2. 境界ボックスと交差する可能性のあるすべてのバケットを反復処理します
    1. 交差するバケットごとに、バケット内のポイントの空間ハッシュを計算し、辞書を使用してバケット内のアイテムのリストを取得します
    2. バケットから結果のリストに項目を追加します

バウンディング ボックスに対してバケット サイズが小さい場合、上記は不要な作業になる可能性があります。その場合は、octree などの別のデータ構造の使用を検討する必要があります。

于 2013-03-27T17:12:39.690 に答える
0

インターフェイスを実装する

IEqualityComparer<float>

あいまい一致を処理して Dictionary のコンストラクターに渡す

http://msdn.microsoft.com/en-us/library/ms132151.aspx http://msdn.microsoft.com/en-us/library/ms132072.aspx

于 2013-03-27T16:45:20.043 に答える
0

面倒なことを避けたい場合は、空間ハッシュの使用を再検討してください。実装することは絶対に可能ですが、3D ハッシュ関数は非常に複雑であり (完全なハッシュが必要な場合)、いくつかのスマートな「十分に近い」関数に簡単に置き換えることができます。

したがって、選択はあなた次第です:

完全ハッシュ

また

「Close-Enough」関数を賢く使用(OpenGL SuperBible のソース コードから取得。「m3dCloseEnough」を探してください)

于 2013-03-27T16:54:57.717 に答える