0

ZoomableCanvas http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items.aspxを実装しています

これは、キャンバス内のオブジェクトの仮想化表示を可能にする WPF コントロールです。仮想化を利用するには、ライブラリでデータソース オブジェクトに「Query」というメソッドを実装する必要があります。Query メソッドは Rect を指定すると IEnumerable<int> を遅延して返します。ここで、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;
    }
}

ただし、リスト全体をトラバースしており、リストには 10 万以上のアイテムがあります。これは、特にキャンバスの右下を表示する場合、これらのアイテムがリストの最後にあるため、パフォーマンスが著しく低下します。

そこで、データを転置して、キャンバス上の可視領域のポイントを取得し、配列内で対応するインデックスを正確に把握できるようにしました。

        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 配列の要素が完全ではないか連続していない可能性がある 1D 配列の 2D ジオメトリを指定して、要素をすばやく識別できる方法を探しています。通常、[y * widthOfAllItems] + x は、適切な 2d -> 1d 転置を提供します。しかし、要素が欠落しているため、方程式は外れています。どんな助けでも大歓迎です!

4

1 に答える 1

0

アイテムを 1D 配列に格納する必要はありません。アイテムを 1D 配列の ZoomableCanvas に戻す必要があります。そのため、考えられる最も効率的な方法でそれらを自由に保存してください。
QuadTree は、ポイントを保存するための 1 つのソリューションである可能性があります。各ノードに 4 つの子 NE、SE、SW、NW、(NE=North-East、...) があるツリーは、それぞれが空であるか、1 つの色で塗りつぶされているか、または子供も4人。別の解決策: 島を基本オブジェクトとして使用し、バウンディング ボックスを使用して高速化する....島をツリーに格納することもできます。

于 2012-07-16T09:25:30.703 に答える