簡體   English   中英

如何從WPF PolyLine對象移動所有坐標?

[英]How to move all coordinate from a WPF PolyLine object?

我有一個用折線對象動態制作的圖形。 它產生了一些有趣的東西,但是我只想保留最后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);
            }

但是我想要一種更清潔的方法來執行此操作,而不必花很長時間創建點對象。

好吧, Point是一個結構,因此創建新的Point的開銷應該不錯。 正在執行以下操作...

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

……真的不會有什么不同,僅僅是因為結構是通過值傳遞的。

考慮到以下情況,您幾乎陷入了for循環並重新分配給myPolyline.Points[i]的問題:

  1. 您必須使用其他X值修改Point
  2. 您無法修改foreach循環的變量,因此必須使用for循環。
  3. myPolyline.Points[i].X -= 50將不起作用,因為從數組中檢索Point結構然后不自動將其重新分配。

如果您只是想移動整個PolyLine ,我可能已經建議了LayoutTransformRenderTransform ,但是您要移動Point的子集,然后添加其他子集。

編輯:如果您確實要重構該操作,則可以在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 ) );

您仍然必須以相同的方式更改Point ,但是在其他地方對其進行了重構,以使用法更具可讀性。 Vector使用也使其更具可讀性。

而是將整個畫布向左移動,並始終增加新點的插入點。

如果您有大量物品,這也將改善渲染性能(尤其是對移動進行動畫處理時)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM