gpt4 book ai didi

c# - 如何从 WPF PolyLine 对象移动所有坐标?

转载 作者:行者123 更新时间:2023-11-30 14:20:30 25 4
gpt4 key购买 nike

我有一个用折线对象动态制作的图形。它产生了一些有趣的东西,但我只想保留最后 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 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 的子集,然后添加其他点。

编辑:如果您真的想重构该操作,您可以在 PointCollection 上为 for 循环和点调整创建一个扩展方法像这样:

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 的使用也使其更具可读性。

关于c# - 如何从 WPF PolyLine 对象移动所有坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1267687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com