2011-10-11 80 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

實際的方向並不重要,所以這是可行的。謝謝! –

相關問題