2012-07-15 156 views
0

我實現ZoomableCanvas http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items.aspx移調鋸齒狀2D名單1D名單

這是一個WPF控件,允許在一個畫布對象的虛擬顯示。爲了利用虛擬化,該庫要求您在數據源對象上實現一個名爲「查詢」的方法。 Query方法延遲地返回IEnumerable <int>給定Rect,其中int代表元素的數據源中的位置,Rect是畫布的可見區域(畫布中不可見的項目不會返回,因此也不會繪製) 。我的數據源進行排序,使得X和Y值進行排序(myList中[0]將包含最小的X,Y座標)

鑑於這一信息,我可以簡單地做下面讓我的項目

int c = this.Count; 

for (int j = 0; j < c; j++) 
{ 
    if (rectangle.Contains(new Point(this[j].left, this[j].top))) 
    { 
     yield return (int)j; 
    } 
} 

但是,我們遍歷整個列表,並且列表中有100多個項目。這種情況非常糟糕,特別是當查看畫布的右下角時,這些項目位於列表的末尾。

所以我試着調換數據,以便我可以在畫布上的可見區域中獲取點,並確切知道數組中的索引對應。

 var tilewidth = MapWidthInTiles; 

     for (var x = Math.Max(left, 0); x <= right; x++) 
     { 
      for (var y = Math.Max(top, 0); y <= bottom; y++) 
      { 

       var i = (y * tilewidth) + x; 

       if (i < Count) 
       { 
        yield return (int)i; 
       } 
      } 
     } 

這個作品除了我的數據集是不規則的(我正在繪製一張地圖),因爲地圖可能缺少或不完整的「瓷磚」。因此我的數組基本上是鋸齒狀的。 Illustration of the jagged dataset missing 'tiles'

基本上,我正在尋找一種方法,可以在2D陣列中的元素可能不完整或連續的情況下,快速識別給定2D元素的元素。通常[y * widthOfAllItems] + x會給我適當的2d - > 1d換位。但由於缺少的元素,方程式是關閉的。任何幫助表示讚賞!

回答

0

您不需要在1D數組中存儲您的項目,您需要將它們返回到1D數組中的ZoomableCanvas。因此,請隨時以最有效的方式將其存儲起來。四叉樹可能是一個解決方案來存儲你的觀點:一個樹,每個節點有4個孩子NE,SE,SW,NW(NE =東北,...),每個節點或者是空的,用一種顏色填充,或者也有4個孩子。 另一種解決方案:與島嶼一起作爲基礎對象,使用邊界框加快速度....也許將島嶼存儲在樹中。