2016-07-17 25 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)); 

此代碼有效,但它通常很慢。最初的邊界檢查是一個短路,最終比沒有它快50%。我認爲下一層複雜性是設置某種預渲染的地圖字典。

WPF中是否存在更好的方法來以更加面向性能的方式完成此任務?

+0

您是否嘗試將所有這些幾何圖形添加到GeometryGroup中,然後調用GeometryGroup的FillContains方法? – Clemens

+0

這隻能告訴我,如果一個幾何存在於這一點,而不是具體哪一個。我確實在GeometryGroup上嘗試了一些東西。我創建了具有隨機大小的1000個幾何圖形列表。幾何組幾乎慢了10倍。 –

回答

0

我結束了創建使用的每個幾何的邊界框進行分層查找自定義類。第一層使用簡單的邊界框計算來縮小搜索所需的幾何對象列表。

使用集合中所有幾何的平均大小計算每個「桶」。這對於一般情況來說存在問題,但鑑於我的大多數幾何尺寸大致相同,這是一個體面的解決方案。