#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. Пройдя через это дважды, я получаю это