Разделение большого прямоугольника на маленькие (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 . Будем признательны за любые идеи и ссылки.

12
задан Josh Lee 23 June 2011 в 17:50
поделиться