我實現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;
}
}
}
這個作品除了我的數據集是不規則的(我正在繪製一張地圖),因爲地圖可能缺少或不完整的「瓷磚」。因此我的數組基本上是鋸齒狀的。
基本上,我正在尋找一種方法,可以在2D陣列中的元素可能不完整或連續的情況下,快速識別給定2D元素的元素。通常[y * widthOfAllItems] + x會給我適當的2d - > 1d換位。但由於缺少的元素,方程式是關閉的。任何幫助表示讚賞!