ピクセルにラスタライズされたエッジを含む 2D データがあります。軸に沿っていない2D 三角形にあるすべてのエッジ ピクセルを返す効率的なデータ構造を実装したいと考えています。
この画像は問題の視覚化を示しており、白はラスター化されたエッジを示し、赤はクエリの三角形を視覚化しています。結果は、境界上または赤い三角形の内側にあるすべての白いピクセルになります。
画像をさらに見ると、まばらなブールデータがあることに気付きます。つまり、黒のピクセルを 0 で、白のピクセルを 1 で表すと、データ内の 1 の数が 0 の数よりもはるかに少ないことを意味します。したがって、赤い三角形をラスタライズし、その内部の各ポイントが白か黒かを確認することは、最も効率的な方法ではありません。
データのまばらさに加えて。白いピクセルはエッジに由来するため、互いに結合する性質があります。ただし、他のラインとのジャンクションでは、2 つ以上の隣接ラインがあります。ジャンクションにあるピクセルは 1 回だけ返されます。
データはリアルタイムで処理する必要がありますが、GPU の支援はありません。さまざまな三角形のコンテンツに対して複数のクエリがあり、各クエリの後、データ構造からポイントが削除される場合があります。ただし、データ構造を最初に埋めた後は、新しいポイントは挿入されません。
ラスター化されたエッジが到着した時点で、クエリ三角形は既知です。
データ エッジよりも多くのクエリ トライアングルがあります。
多くの空間データ構造が利用可能です。しかし、私の問題にはどれが最適なのか疑問に思っています。この問題を解決するために高度に最適化されたデータ構造を実装したいと考えています。これはプロジェクトのコア要素になるからです。したがって、データ構造の混在や省略も大歓迎です!
R ツリーは、四角形ベースのクエリをサポートしているため、これまでこの問題に対して私が見つけた最良のデータ構造のようです。クエリ三角形の AABB 内のすべての白いピクセルをチェックし、返された各ピクセルがクエリ四角形内にあるかどうかをチェックします。
ただし、エッジベースのデータは簡単に四角形にグループ化できないため、R ツリーがどの程度うまく機能するかはわかりません。
構造が満たされるとすぐに作成されるクエリ三角形に関する情報を使用して、R ツリーの構造を事前に構築することが理にかなっているのかどうかもわかりません (前述のように、クエリ三角形は既に知られています)。データが到着したとき)。
問題を逆にすることも有効な解決策のようです.2次元間隔ツリーを使用して、白いピクセルごとにそれを含むすべての三角形のリストを取得します. その後、それらすべての結果セット内に既に格納されており、クエリが到着するとすぐに返されます。ただし、これがどのように実行されるかはわかりません。三角形の数はエッジの数よりも多く、それでも白いピクセルの数よりは少ないです (エッジはほとんどが 20 ~ 50 ピクセルに分割されるため)。
白いピクセルが隣接ピクセルとして最も頻繁に白いピクセルを持っていることを利用するデータ構造は、最も効率的であるように思われます。しかし、今までそのようなことについて何も見つけることができませんでした。