从x1,y1到x2,y2循环,无论它们是以何种顺序

时间:2011-10-11 17:06:59

标签: c#

我希望能够通过两个点(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个之间的石头。

我有些需要再次循环遍历两个循环,但由于我不知道哪个方式实际上是循环(减少或增加),所以我不能只是从循环中添加/减去一个循环。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:5)

您可以从最低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]。如果你真的关心方向,这种方法将不起作用。

答案 1 :(得分:3)

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);
    }
}