Подтвердить что ты не робот

Разделение большого прямоугольника на маленькие (2D-упаковка)

Мне нужен алгоритм, который разбивает большой прямоугольник статического размера на маленькие. Идеальная реализация для меня выглядит так:

struct RECT
{
  int l,t,r,b;
};

class BigRect
{
public:
  // width and height of big rect
  BigRect( unsigned width, unsigned height );

  // returns -1 if rect cannot be allocated, otherwise returns id of found rect
  int GetRect( unsigned width, unsigned height, RECT &out );

  // returns allocated rect to big rectangle
  void FreeRect( int id );
};

void test()
{
  BigRect r( 10, 10 );

  RECT out;
  r.GetRect( 4, 4, out ); // rect found ({0,0,4,4} for example), returns 1
  r.GetRect( 5, 5, out ); // rect found ({4,0,9,5} for example), returns 2

  r.GetRect( 6, 6, out ); // no place found for rect, returns -1
  r.FreeRect( 2 );        // add {4,0,9,5} back to rect

  r.GetRect( 6, 6, out ); // rect found (4,0,10,6)
}

Итак, мне нужен алгоритм для методов GetRect и FreeRect. Любые идеи и ссылки будут оценены.

4b9b3361

Ответ 1

То, что вы пытаетесь сделать, - это онлайн-упаковка в двумерном ящике. Он онлайн, потому что у вас нет всех ваших маленьких снимков в руках, прежде чем пытаться упаковать их в общую картину. Кроме того, некоторые небольшие снимки будут "освобождены", и их пространство будет освобождено. С другой стороны, автономный алгоритм позволяет вам делать такие вещи, как сортировать свои маленькие изображения от самых больших до самых маленьких, прежде чем упаковывать их.

Здесь статья, в которой рассматривается современное состояние в 2D-упаковке: Обзор двумерной упаковки. Это довольно теоретично.

В этой статье Новая верхняя граница в 2D Online Bin Packing цитирует другие статьи, описывающие онлайн-алгоритмы 2D-упаковки.

У людей в игровом мире есть аналогичная проблема, как и вы; они называют это текстурой упаковки или текстурный атлас. Однако они используют автономные алгоритмы.

Джон Рэтклифф опубликовал статью статьи блога об упаковке текстур.

Смотрите также этот связанный вопрос о гамедеве: https://gamedev.stackexchange.com/info/2829/texture-packing-algorithm