我希望能够通过两个点(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个之间的石头。
我有些需要再次循环遍历两个循环,但由于我不知道哪个方式实际上是循环(减少或增加),所以我不能只是从循环中添加/减去一个循环。
任何帮助将不胜感激!
答案 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);
}
}