2016-07-17 4 views
0

私は、Wpfジオメトリオブジェクトの抽象的なサイズの大きなIEnumerableコンテナを持っています。ジオメトリオブジェクトの境界は自明ではありません。それらは長方形や円のような単純な幾何学的形状ではなく、複雑なポリゴンです。リストは最初に入力された後は決して変更されません。WPFジオメトリのコレクションで最適化ヒットテスト

私はポイントを持っていますが、どのジオメトリにそのポイントが含まれているかを調べたいと思います。

List<Geometry> list = getList(); 
var point = new Point(x,y); 

list.Any(y => y.Bounds.Contains(point) && y.FillContains(point)); 

このコードは機能しますが、一般に遅いです。最初のBoundsチェックは短絡で、それがない場合より約50%速くなります。私は複雑さの次の層は、プリレンダリングされたヒットマップ辞書のいくつかの並べ替えを設定することだと思う。

このタスクをよりパフォーマンスに優れた方法で実現するには、WPFに既に存在するものはありますか?

+0

これらのジオメトリをすべてGeometryGroupに追加してから、GeometryGroupのFillContainsメソッドを呼び出そうとしましたか? – Clemens

+0

それは、ジオメトリが特定のポイントではなくそのポイントに存在するかどうかだけを通知します。私はGeometryGroupでいくつかのことを試しました。ランダムなサイズの1000個のジオメトリのリストを作成しました。 GeometryGroupはほぼ10倍遅くなりました。 –

答えて

0

最善である私は、階層型検索を実行するために、各ジオメトリのバウンディングボックスを使用するカスタムクラスを作成することになりました。第1層では、単純な境界ボックス計算を使用して検索に必要なジオメトリオブジェクトのリストを絞り込みました。

各「バケット」は、コレクション内のすべてのジオメトリの平均サイズを使用して計算されました。これは一般的なケースで問題がありますが、私のジオメトリの大部分がおおよそ同じサイズであることを考えると、まあまあです。