4

ポリライン オブジェクトを使用して動的に作成されたグラフィックがあります。興味深い結果が得られますが、最後の 10 個の座標のみを保持したいと思います。10 番目の位置に到達すると、すべての座標が X ピクセル分左に移動し、最後に新しい値が追加されます。

描画クラスの Add 関数で、次のようなコードを試しました。

        if (points.Count > 10)
        {
            myPolyline.Points.RemoveAt(0);

            foreach(Point p in myPolyline.Points)
            {
                p.X = p.X - 50;//Move all coord back to have a place for the new one
            }   
        }

ForEach ループでコレクションの変数を変更できないため、これは機能しません。WPF/C#でこれを行う最良の方法は何ですか?

より詳しい情報

私はこれを行うことでそれを行うことができます:

            for (int i = 0; i < this.myPolyline.Points.Count; i++)
            {
                this.myPolyline.Points[i] = new Point(this.myPolyline.Points[i].X - 50, this.myPolyline.Points[i].Y);
            }

しかし、ポイントオブジェクトを非常に時間をかけずに作成するためのよりクリーンな方法が欲しいです。

4

2 に答える 2

5

は構造体なので、Point新しいものを作成するオーバーヘッドは悪くないはずです。以下を実行しています...

Point p = this.myPolyline.Points[i];
p.X -= 50;
this.myPolyline.Points[i] = p;

...構造体が値によって渡されるという理由だけで、実際には違いはありません。

状況を考慮して、forループと への再割り当てでほとんど立ち往生しています。myPolyline.Points[i]

  1. Pointを別の値に変更する必要がありXます。
  2. ループの変数を変更することはできないため、ループforeachを使用する必要がありforます。
  3. myPolyline.Points[i].X -= 50Point構造体が配列から取得され、自動的に再割り当てされないため、機能しません。

単に全体を移動したい場合は、またはPolyLineを提案したかもしれませんが、 のサブセットを移動してから、他のものを追加します。LayoutTransformRenderTransformPoint

編集:本当にその操作をリファクタリングしたい場合はPointCollectionforループの拡張メソッドを作成し、次のように微調整することができます:

static public void ChangePoints( this PointCollection pc, Vector v ) {
    for (int i = 0; i < pc.Count; i++ ) {
        pc[i] += v;
        // the above works on the indexer because you're doing an operation on the
        // Point rather than on one of the Point's members.
    }
}

使用法:

myPolyline.Points.ChangePoints( new Vector( -50, 0 ) );

同じ方法で sを変更する必要がPointありますが、使用法が読みやすくなるように別の場所でリファクタリングされています。また、 を使用Vectorすると読みやすくなります。

于 2009-08-12T19:14:17.897 に答える
3

代わりにキャンバス全体を左に移動し、常に新しいポイントの挿入ポイントを増やします。

大量のアイテムがある場合、これによりレンダリング パフォーマンスも向上します (特に動きをアニメートする場合)。

于 2009-08-12T19:44:41.050 に答える