2011-10-11 85 views
1

我希望能够通过两个点(p1,p2)选择图像的一部分。我的问题是,我想要使用相同的循环,无论它们以何种顺序。从x1,y1循环到x2,y2,不管它们的顺序为

现在我有这样的:

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。

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

任何帮助将不胜感激!

回答

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

它的工作原理,购买我不知道为什么它可以工作...谢谢 –

+0

关键是比较x到p2.X + dx而不是p2.X. – Larsenal

+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]。如果你真的关心方向,这种方法将无法工作。

+0

那么输入可以以任何一种方式出现,但是不清楚他是否只需要覆盖这些点之间的所有像素,或者是否应该按照与输入相对应的顺序来完成。 – Larsenal

+0

实际的方向并不重要,所以这是可行的。谢谢! –

相关问题