从x1,y1循环到x2,y2,不管顺序如何

本文关键字:不管 顺序 y2 x1 y1 循环 x2 | 更新日期: 2023-09-27 18:11:11

我希望能够通过两个点(p1,p2)选择图像的一部分。我的问题是,我想使用相同的循环,而不管它们的顺序如何。

现在我有这个:

for (int x = p1.X; x != p2.X; x += Math.Sign(p2.X - p1.X))
        {
            for (int y = p1.Y; y != p2.Y; y += Math.Sign(p2.Y - p1.Y))
            {
                MessageBox.Show(String.Format("{0} {1}", x, y));
            }
        }

在这个循环中,我没有得到所有的数字:例如,从1/1到3/3只到2/2。

我需要在两个循环中再循环一次,但是因为我不知道我实际上是在循环哪个方向(减少还是增加),所以我不能只从循环中添加/减去一个。

任何帮助将不胜感激!

从x1,y1循环到x2,y2,不管顺序如何

你可以从最低的X循环到最高的X,然后对y做同样的操作。

for (int x = Math.Min(p1.X, p2.X); x <= Math.Max(p1.X, p2.X); x++){
  for (int y = Math.Min(p1.Y, p2.Y); y <= Math.Max(p1.Y, p2.Y); y++){
    MessageBox.Show(String.Format("{0} {1}", x, y));
  }
}

这不会从[3,3]走到[1,1]。如果你真的关心方向,这种方法将不起作用。

Point p1 = new Point(1, 1);
Point p2 = new Point(3, 3);
int dx = Math.Sign(p2.X - p1.X);
int dy = Math.Sign(p2.Y - p1.Y);
for (int x = p1.X; x != p2.X + dx; x += dx)
{
    for (int y = p1.Y; y != p2.Y + dy; y += dy)
    {
        Console.WriteLine("{0} {1}", x, y);
    }
}