【问题标题】:Loop from x1,y1 to x2,y2, no matter in which order they are从 x1,y1 循环到 x2,y2,无论它们的顺序如何
【发布时间】:2011-10-11 17:06:58
【问题描述】:

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

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

任何帮助将不胜感激!

【问题讨论】:

    标签: c#


    【解决方案1】:

    你可以从最低的 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]。如果你真的关心方向,这种方法是行不通的。

    【讨论】:

    • 好吧,输入可以以任何一种方式出现,但不清楚他是否只需要覆盖这些点之间的所有像素,或者是否应该按照与输入对应的顺序完成。
    • 实际的方向并不重要,所以这可行。谢谢!
    【解决方案2】:
    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);
        }
    }
    

    【讨论】:

    • 关键是将 x 与 p2.X + dx 进行比较,而不仅仅是 p2.X。
    • 单步执行两次后,我明白了
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2016-09-02
    相关资源
    最近更新 更多