Цикл от x1, y1 до x2, y2, независимо от того, в каком порядке они расположены

#c#

#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.

Мне как-то нужно еще раз пройти через оба цикла, но поскольку я не знаю, каким образом я на самом деле выполняю цикл (уменьшение или увеличение) Я не могу просто добавить / вычесть один из цикла.

любая помощь будет оценена!

Ответ №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]. Если вы действительно заботитесь о направлении, этот подход не сработает.

Комментарии:

1. Ну, ввод может поступать любым способом, но было неясно, нужно ли ему просто покрыть все пиксели между этими точками ИЛИ это должно быть сделано в порядке, соответствующем вводу.

2. Фактические направления не важны, так что это сработает. Спасибо!

Ответ №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);
    }
}
  

Комментарии:

1. Ключ сравнивает x с p2.X dx, а не просто с p2.X .

2. Пройдя через это дважды, я получаю это