2015-08-05 4 views
-1

В C#, я хочу, чтобы цикл через каждый квадрат возможно в прямоугольник. Квадратный размер намного меньше размеров прямоугольника. Но обратите внимание, что я не имею в виду цикл через каждый квадрат в сетке, я имею в виду каждый квадрат в любом типе местоположения (не ограничиваясь сеткой). Это похоже на случайный выбор квадрата в случайном месте, но он должен проходить через все возможные местоположения и получать только один раз (без дубликатов).Как пройти через каждый квадрат в прямоугольнике?

Кто-нибудь знает об этом алгоритме?

Благодаря

+3

Что вы имеете в виду, не ограничиваясь сеткой? Любой прямоугольник содержит бесконечное количество меньших прямоугольников. – zneak

+0

Да, таким образом, путь к петле через все возможные меньшие квадраты, которые содержатся в прямоугольнике. Обратите внимание, что это изображение с пикселями, поэтому я не думаю, что существует бесконечное количество, так как координаты являются целыми числами. – omega

+0

Это не было да/нет. Можете ли вы рассказать о том, как ваш прямоугольник хранится/помечен/etc? – Daniel

ответ

2

Al вам нужно сделать, это установить происхождение (скажем, левый верхний), выяснить максимальную длину стороны от этого места, и перебирать от 1 до этого значения для каждого пиксела в изображении.

Названия классов вымышлены, адаптированы к вашим потребностям.

IEnumerable<Rectangle> AllSquaresIn(Rectangle rect) 
{ 
    for (int x = 0; i x < rect.Width; x++) 
    { 
     for (int y = 0; y < rect.Height; y++) 
     { 
      int maxLength = Math.Min(rect.Width - x, rect.Height - y); 
      for (int i = 1; i <= maxLength; i++) 
      { 
       yield return new Rectangle(x, y, x + i, y + i); 
      } 
     } 
    } 
} 

Поскольку i всегда положительна, то это будет невозможно иметь дублирующие прямоугольники.


Так как явствует из комментариев, что вы только хотите прямоугольники заданного размера:

IEnumerable<Rectangle> AllSquaresIn(Rectangle rect, int length) 
{ 
    for (int x = 0; i x < rect.Width - length; x++) 
    { 
     for (int y = 0; y < rect.Height - length; y++) 
     { 
      yield return new Rectangle(x, y, x + length, y + length); 
     } 
    } 
} 
+0

Является ли новый прямоугольник квадратом? Я пытаюсь выполнить цикл (и вернуть) только квадраты, содержащиеся в прямоугольнике. – omega

+0

Предполагая конструктор 'Rectangle'' (x1, y1, x2, y2) ',' x2-x1 == y2-y1' во всех случаях, так что да. Назовите его «Квадрат» и дайте ему разные аргументы конструктора, если хотите. – zneak

Смежные вопросы