web-dev-qa-db-ja.com

座標(x、y)ヒントを使用した検索アルゴリズム?

多くの小さなテキストアイテムがビューの上に配置され、ユーザーがテキストアイテムの上にホバー(ツールチップのように)動的に生成された画像が表示されるUIビューを書き始めようとしています。そのテキストアイテムのコンテキストに関連します。ユーザーがテキストアイテムをクリックすると、その画像の拡大版で別のビューが変更されます。

私は明らかに、テキストを囲むrect hit-areaと一緒にコレクション内のアイテムを保持する必要があります。そして、誰かが私が見つけるために使用できるストレージ形式と検索アルゴリズムを提案できるかどうか疑問に思っています。コレクション内のすべてのアイテムに対してヒットテストを行うのではなく、検索をローカライズするためのヒントとしてマウスの位置を使用して、できるだけ早くテキストアイテムを作成しますか?

4
trojanfoe

あなたが探しているものは 空間インデックス と呼ばれ、あなたが解決しようとしている問題は 衝突検出 です。

具体的には、 quadtree データ構造を使用します。これは、ツリーの1レベル下がるたびに、スペースを4つのサブスペースに分割します。これは2Dであり、3Dで問題を解決しようとしている場合、適切な構造は八分木になります。

私はおそらく従来の四分木から逸脱し、領域をピクセルレベルに分割し、脱退ノードをハッシュして、(x、y)の対応する脱退ノードをより迅速に取得できるようにします。アルゴリズムは大まかに次のようになります。

  1. 初期化時に、ツリーとハッシュを構築します。
  2. コレクションに新しいアイテムを挿入するときは、ヒット領域を計算し、ヒットボックス全体を保持する可能な限り最小の象限を表すノードに格納します
  3. (x、y)をクリックすると、ハッシュを使用してx、yのリーフを検索します。葉ができたら、ルートにたどり着き、途中で遭遇したすべてのアイテムのヒットボックスを(x、y)と比較するだけです。
8
sebastiangeiger

検討する可能性のある別の手法(ニーズによって異なります)は、画面外のビットマップを使用してテキストアイテムへの参照を格納することです。基本的なアプローチは、境界の長方形を画面外のビットマップに、アイテムごとに一意の色で描画することです。ルックアップは一定の時間であり、関心のある(x、y)座標(マウスの位置など)を使用してビットマップにインデックスを付けるだけです。

この手法の欠点は、メモリ要件です。ビットマップは、画面の表示領域と同じ大きさである必要があります。

1
erichui

何千ものアイテムについて話しているのでない限り、特別なアルゴリズムを使用せずに最初に試してください。長方形の簡単なヒットテストは非常に安い、プロセッサに関してです。私はあなたがより効率的な計画に対して知覚可能な改善を見ることはないだろうと真剣に疑っています。

基本的に、理論的には素晴らしいですが、これは時期尚早に最適化する必要がない場所です。

また、2つが重なっている場合に一番上のアイテムに当たるように、必ず逆方向(上から下)に循環してください。

1
GrandmasterB

Sebastiangeigerが述べたように、空間インデックスが役立ちます。 四分木 の実装は簡単であることがわかりました。さらに簡単なもう1つの方法は、スペースをグリッドに分割し、各長方形を交差する一連のスペースに挿入することです(これは、各ノードが2x2グリッド)。

最終的には、パフォーマンス要件を満たす最も単純なアプローチを見つけてください。

1
Kevin Hsu